diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Passes/PassBuilder.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Passes/PassRegistry.def | 1 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/BDCE.cpp | 72 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/Scalar.cpp | 2 |
4 files changed, 43 insertions, 35 deletions
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index 3c514b8e2d8..23b51cebe35 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -63,11 +63,12 @@ #include "llvm/Transforms/InstrProfiling.h" #include "llvm/Transforms/PGOInstrumentation.h" #include "llvm/Transforms/Scalar/ADCE.h" +#include "llvm/Transforms/Scalar/BDCE.h" #include "llvm/Transforms/Scalar/DCE.h" #include "llvm/Transforms/Scalar/DeadStoreElimination.h" #include "llvm/Transforms/Scalar/EarlyCSE.h" -#include "llvm/Transforms/Scalar/GuardWidening.h" #include "llvm/Transforms/Scalar/GVN.h" +#include "llvm/Transforms/Scalar/GuardWidening.h" #include "llvm/Transforms/Scalar/LoopRotation.h" #include "llvm/Transforms/Scalar/LoopSimplifyCFG.h" #include "llvm/Transforms/Scalar/LowerAtomic.h" diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index d517f646b2a..5d74d7108d9 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -110,6 +110,7 @@ FUNCTION_ALIAS_ANALYSIS("type-based-aa", TypeBasedAA()) #endif FUNCTION_PASS("aa-eval", AAEvaluator()) FUNCTION_PASS("adce", ADCEPass()) +FUNCTION_PASS("bdce", BDCEPass()) FUNCTION_PASS("dce", DCEPass()) FUNCTION_PASS("dse", DSEPass()) FUNCTION_PASS("early-cse", EarlyCSEPass()) diff --git a/llvm/lib/Transforms/Scalar/BDCE.cpp b/llvm/lib/Transforms/Scalar/BDCE.cpp index a357280dcef..a1331ddf44a 100644 --- a/llvm/lib/Transforms/Scalar/BDCE.cpp +++ b/llvm/lib/Transforms/Scalar/BDCE.cpp @@ -14,11 +14,11 @@ // //===----------------------------------------------------------------------===// -#include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Scalar/BDCE.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" -#include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/DemandedBits.h" +#include "llvm/Analysis/GlobalsModRef.h" #include "llvm/IR/CFG.h" #include "llvm/IR/InstIterator.h" #include "llvm/IR/Instructions.h" @@ -27,6 +27,7 @@ #include "llvm/Pass.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/Transforms/Scalar.h" using namespace llvm; #define DEBUG_TYPE "bdce" @@ -34,35 +35,7 @@ using namespace llvm; STATISTIC(NumRemoved, "Number of instructions removed (unused)"); STATISTIC(NumSimplified, "Number of instructions trivialized (dead bits)"); -namespace { -struct BDCE : public FunctionPass { - static char ID; // Pass identification, replacement for typeid - BDCE() : FunctionPass(ID) { - initializeBDCEPass(*PassRegistry::getPassRegistry()); - } - - bool runOnFunction(Function& F) override; - - void getAnalysisUsage(AnalysisUsage& AU) const override { - AU.setPreservesCFG(); - AU.addRequired<DemandedBitsWrapperPass>(); - AU.addPreserved<GlobalsAAWrapperPass>(); - } -}; -} - -char BDCE::ID = 0; -INITIALIZE_PASS_BEGIN(BDCE, "bdce", "Bit-Tracking Dead Code Elimination", - false, false) -INITIALIZE_PASS_DEPENDENCY(DemandedBitsWrapperPass) -INITIALIZE_PASS_END(BDCE, "bdce", "Bit-Tracking Dead Code Elimination", - false, false) - -bool BDCE::runOnFunction(Function& F) { - if (skipFunction(F)) - return false; - auto &DB = getAnalysis<DemandedBitsWrapperPass>().getDemandedBits(); - +static bool bitTrackingDCE(Function &F, DemandedBits &DB) { SmallVector<Instruction*, 128> Worklist; bool Changed = false; for (Instruction &I : instructions(F)) { @@ -96,7 +69,40 @@ bool BDCE::runOnFunction(Function& F) { return Changed; } -FunctionPass *llvm::createBitTrackingDCEPass() { - return new BDCE(); +PreservedAnalyses BDCEPass::run(Function &F, FunctionAnalysisManager &AM) { + auto &DB = AM.getResult<DemandedBitsAnalysis>(F); + if (bitTrackingDCE(F, DB)) + return PreservedAnalyses::none(); + return PreservedAnalyses::all(); } +namespace { +struct BDCELegacyPass : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + BDCELegacyPass() : FunctionPass(ID) { + initializeBDCELegacyPassPass(*PassRegistry::getPassRegistry()); + } + + bool runOnFunction(Function &F) override { + if (skipFunction(F)) + return false; + auto &DB = getAnalysis<DemandedBitsWrapperPass>().getDemandedBits(); + return bitTrackingDCE(F, DB); + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.setPreservesCFG(); + AU.addRequired<DemandedBitsWrapperPass>(); + AU.addPreserved<GlobalsAAWrapperPass>(); + } +}; +} + +char BDCELegacyPass::ID = 0; +INITIALIZE_PASS_BEGIN(BDCELegacyPass, "bdce", + "Bit-Tracking Dead Code Elimination", false, false) +INITIALIZE_PASS_DEPENDENCY(DemandedBitsWrapperPass) +INITIALIZE_PASS_END(BDCELegacyPass, "bdce", + "Bit-Tracking Dead Code Elimination", false, false) + +FunctionPass *llvm::createBitTrackingDCEPass() { return new BDCELegacyPass(); } diff --git a/llvm/lib/Transforms/Scalar/Scalar.cpp b/llvm/lib/Transforms/Scalar/Scalar.cpp index da6244d6ce1..eb950bc8e23 100644 --- a/llvm/lib/Transforms/Scalar/Scalar.cpp +++ b/llvm/lib/Transforms/Scalar/Scalar.cpp @@ -32,7 +32,7 @@ using namespace llvm; /// ScalarOpts library. void llvm::initializeScalarOpts(PassRegistry &Registry) { initializeADCELegacyPassPass(Registry); - initializeBDCEPass(Registry); + initializeBDCELegacyPassPass(Registry); initializeAlignmentFromAssumptionsPass(Registry); initializeConstantHoistingPass(Registry); initializeConstantPropagationPass(Registry); |