xref: /llvm-project/llvm/tools/llvm-reduce/deltas/SimplifyInstructions.cpp (revision 23cc36e4765912a1bcdbbc3fb8b0976a06dea043)
1eea11e73SMatt Arsenault //===- SimplifyInstructions.cpp - Specialized Delta Pass ------------------===//
2eea11e73SMatt Arsenault //
3eea11e73SMatt Arsenault // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4eea11e73SMatt Arsenault // See https://llvm.org/LICENSE.txt for license information.
5eea11e73SMatt Arsenault // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6eea11e73SMatt Arsenault //
7eea11e73SMatt Arsenault //===----------------------------------------------------------------------===//
8eea11e73SMatt Arsenault //
9eea11e73SMatt Arsenault // This file implements a function which calls the Generic Delta pass in order
10eea11e73SMatt Arsenault // to simplify Instructions in defined functions.
11eea11e73SMatt Arsenault //
12eea11e73SMatt Arsenault //===----------------------------------------------------------------------===//
13eea11e73SMatt Arsenault 
14eea11e73SMatt Arsenault #include "SimplifyInstructions.h"
15eea11e73SMatt Arsenault #include "llvm/Analysis/InstructionSimplify.h"
16eea11e73SMatt Arsenault #include "llvm/IR/Constants.h"
17eea11e73SMatt Arsenault 
18eea11e73SMatt Arsenault using namespace llvm;
19eea11e73SMatt Arsenault 
20eea11e73SMatt Arsenault /// Calls simplifyInstruction in each instruction in functions, and replaces
21eea11e73SMatt Arsenault /// their values.
extractInstrFromModule(Oracle & O,ReducerWorkItem & WorkItem)22*23cc36e4SMatt Arsenault static void extractInstrFromModule(Oracle &O, ReducerWorkItem &WorkItem) {
23eea11e73SMatt Arsenault   std::vector<Instruction *> InstsToDelete;
24eea11e73SMatt Arsenault 
25*23cc36e4SMatt Arsenault   Module &Program = WorkItem.getModule();
26eea11e73SMatt Arsenault   const DataLayout &DL = Program.getDataLayout();
27eea11e73SMatt Arsenault 
28eea11e73SMatt Arsenault   std::vector<Instruction *> InstToDelete;
29eea11e73SMatt Arsenault   for (auto &F : Program) {
30eea11e73SMatt Arsenault     for (auto &BB : F) {
31eea11e73SMatt Arsenault       for (auto &Inst : BB) {
32eea11e73SMatt Arsenault 
33eea11e73SMatt Arsenault         SimplifyQuery Q(DL, &Inst);
34eea11e73SMatt Arsenault         if (Value *Simplified = simplifyInstruction(&Inst, Q)) {
35ce3c3cb2SArthur Eubanks           if (O.shouldKeep())
36ce3c3cb2SArthur Eubanks             continue;
37eea11e73SMatt Arsenault           Inst.replaceAllUsesWith(Simplified);
38eea11e73SMatt Arsenault           InstToDelete.push_back(&Inst);
39eea11e73SMatt Arsenault         }
40eea11e73SMatt Arsenault       }
41eea11e73SMatt Arsenault     }
42eea11e73SMatt Arsenault   }
43eea11e73SMatt Arsenault 
44eea11e73SMatt Arsenault   for (Instruction *I : InstToDelete)
45eea11e73SMatt Arsenault     I->eraseFromParent();
46eea11e73SMatt Arsenault }
47eea11e73SMatt Arsenault 
simplifyInstructionsDeltaPass(TestRunner & Test)48eea11e73SMatt Arsenault void llvm::simplifyInstructionsDeltaPass(TestRunner &Test) {
492592ccdeSArthur Eubanks   runDeltaPass(Test, extractInstrFromModule, "Simplifying Instructions");
50eea11e73SMatt Arsenault }
51