Author: gbtozers Date: 2020-01-14T15:28:16Z New Revision: 6762d53b66d9de18825f09f43c3d6c2b3ea95913
URL: https://github.com/llvm/llvm-project/commit/6762d53b66d9de18825f09f43c3d6c2b3ea95913 DIFF: https://github.com/llvm/llvm-project/commit/6762d53b66d9de18825f09f43c3d6c2b3ea95913.diff LOG: Add RemovePureUndefs to opt Added: Modified: llvm/include/llvm/InitializePasses.h llvm/include/llvm/LinkAllPasses.h llvm/include/llvm/Transforms/Scalar.h llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h llvm/lib/Transforms/Scalar/DCE.cpp llvm/lib/Transforms/Scalar/JumpThreading.cpp llvm/lib/Transforms/Scalar/Scalar.cpp llvm/lib/Transforms/Utils/BasicBlockUtils.cpp Removed: ################################################################################ diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 831c6882b4a9..c59170da05a0 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -347,6 +347,7 @@ void initializeRAGreedyPass(PassRegistry&); void initializeReachingDefAnalysisPass(PassRegistry&); void initializeReassociateLegacyPassPass(PassRegistry&); void initializeRedundantDbgInstEliminationPass(PassRegistry&); +void initializePureUndefDbgInstEliminationPass(PassRegistry&); void initializeRegAllocFastPass(PassRegistry&); void initializeRegBankSelectPass(PassRegistry&); void initializeRegToMemPass(PassRegistry&); diff --git a/llvm/include/llvm/LinkAllPasses.h b/llvm/include/llvm/LinkAllPasses.h index aa64296f9428..9dcf5958029e 100644 --- a/llvm/include/llvm/LinkAllPasses.h +++ b/llvm/include/llvm/LinkAllPasses.h @@ -160,6 +160,7 @@ namespace { (void) llvm::createPostDomViewerPass(); (void) llvm::createReassociatePass(); (void) llvm::createRedundantDbgInstEliminationPass(); + (void) llvm::createPureUndefDbgInstEliminationPass(); (void) llvm::createRegionInfoPass(); (void) llvm::createRegionOnlyPrinterPass(); (void) llvm::createRegionOnlyViewerPass(); diff --git a/llvm/include/llvm/Transforms/Scalar.h b/llvm/include/llvm/Transforms/Scalar.h index 1f2842836303..85c931bb20d1 100644 --- a/llvm/include/llvm/Transforms/Scalar.h +++ b/llvm/include/llvm/Transforms/Scalar.h @@ -60,6 +60,14 @@ Pass *createDeadInstEliminationPass(); // Pass *createRedundantDbgInstEliminationPass(); +//===----------------------------------------------------------------------===// +// +// PureUndefDbgInstElimination - This pass removes dbg intrinsics for variables +// which are always `undef` within a function, without modifying the CFG of the +// function. It is a FunctionPass. +// +Pass *createPureUndefDbgInstEliminationPass(); + //===----------------------------------------------------------------------===// // // DeadCodeElimination - This pass is more powerful than DeadInstElimination, diff --git a/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h b/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h index dec8447c9f52..2273d7d90a41 100644 --- a/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h +++ b/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h @@ -98,6 +98,8 @@ bool MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU = nullptr, /// Returns true if at least one instruction was removed. bool RemoveRedundantDbgInstrs(BasicBlock *BB); +bool RemovePureUndefDbgInstrs(Function &F); + /// Replace all uses of an instruction (specified by BI) with a value, then /// remove and delete the original instruction. void ReplaceInstWithValue(BasicBlock::InstListType &BIL, diff --git a/llvm/lib/Transforms/Scalar/DCE.cpp b/llvm/lib/Transforms/Scalar/DCE.cpp index a4b0c8df98f6..716b2264eddd 100644 --- a/llvm/lib/Transforms/Scalar/DCE.cpp +++ b/llvm/lib/Transforms/Scalar/DCE.cpp @@ -115,6 +115,36 @@ Pass *llvm::createRedundantDbgInstEliminationPass() { return new RedundantDbgInstElimination(); } +//===--------------------------------------------------------------------===// +// PureUndefDbgInstElimination pass implementation +// + +namespace { +struct PureUndefDbgInstElimination : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + PureUndefDbgInstElimination() : FunctionPass(ID) { + initializePureUndefDbgInstEliminationPass(*PassRegistry::getPassRegistry()); + } + bool runOnFunction(Function &F) override { + if (skipFunction(F)) + return false; + return RemovePureUndefDbgInstrs(F); + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.setPreservesCFG(); + } +}; +} + +char PureUndefDbgInstElimination::ID = 0; +INITIALIZE_PASS(PureUndefDbgInstElimination, "pure-undef-dbg-inst-elim", + "Pure Undef Dbg Instruction Elimination", false, false) + +Pass *llvm::createPureUndefDbgInstEliminationPass() { + return new PureUndefDbgInstElimination(); +} + //===--------------------------------------------------------------------===// // DeadCodeElimination pass implementation // diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp index 98c2fcb3dae0..bc769f01ca21 100644 --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -418,17 +418,21 @@ bool JumpThreadingPass::runImpl(Function &F, TargetLibraryInfo *TLI_, // ProcessBlock doesn't thread BBs with unconditional TIs. However, if BB // is "almost empty", we attempt to merge BB with its sole successor. auto *BI = dyn_cast<BranchInst>(BB.getTerminator()); - if (BI && BI->isUnconditional() && - // The terminator must be the only non-phi instruction in BB. - BB.getFirstNonPHIOrDbg()->isTerminator() && - // Don't alter Loop headers and latches to ensure another pass can - // detect and transform nested loops later. - !LoopHeaders.count(&BB) && !LoopHeaders.count(BI->getSuccessor(0)) && - TryToSimplifyUncondBranchFromEmptyBlock(&BB, DTU)) { - // BB is valid for cleanup here because we passed in DTU. F remains - // BB's parent until a DTU->getDomTree() event. - LVI->eraseBlock(&BB); - Changed = true; + if (BI && BI->isUnconditional()) { + BasicBlock *Succ = BI->getSuccessor(0); + if( + // The terminator must be the only non-phi instruction in BB. + BB.getFirstNonPHIOrDbg()->isTerminator() && + // Don't alter Loop headers and latches to ensure another pass can + // detect and transform nested loops later. + !LoopHeaders.count(&BB) && !LoopHeaders.count(BI->getSuccessor(0)) && + TryToSimplifyUncondBranchFromEmptyBlock(&BB, DTU)) { + // BB is valid for cleanup here because we passed in DTU. F remains + // BB's parent until a DTU->getDomTree() event. + RemoveRedundantDbgInstrs(Succ); + LVI->eraseBlock(&BB); + Changed = true; + } } } EverChanged |= Changed; diff --git a/llvm/lib/Transforms/Scalar/Scalar.cpp b/llvm/lib/Transforms/Scalar/Scalar.cpp index 9d088547b436..b0d38ab82874 100644 --- a/llvm/lib/Transforms/Scalar/Scalar.cpp +++ b/llvm/lib/Transforms/Scalar/Scalar.cpp @@ -91,6 +91,7 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) { initializePartiallyInlineLibCallsLegacyPassPass(Registry); initializeReassociateLegacyPassPass(Registry); initializeRedundantDbgInstEliminationPass(Registry); + initializePureUndefDbgInstEliminationPass(Registry); initializeRegToMemPass(Registry); initializeRewriteStatepointsForGCLegacyPassPass(Registry); initializeSCCPLegacyPassPass(Registry); diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp index c9eb4abfa21a..c9e34c39d830 100644 --- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -314,6 +314,40 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU, return true; } +bool llvm::RemovePureUndefDbgInstrs(Function &F) { + DenseMap<DebugVariable, SmallVector<DbgValueInst *, 8> > VariableMap; + DenseSet<DebugVariable> NonUndefVariables; + + for (auto &BB : F) { + for (auto &I : BB) { + if (DbgValueInst *DVI = dyn_cast<DbgValueInst>(&I)) { + DebugVariable Key(DVI->getVariable(), + DVI->getExpression(), + DVI->getDebugLoc()->getInlinedAt()); + if (NonUndefVariables.count(Key)) + continue; + if (DVI->getValue() == UndefValue::get(DVI->getValue()->getType())) { + auto R = VariableMap.insert( + { Key, SmallVector<DbgValueInst *, 8>(1, DVI) }); + if (!R.second) { + auto VMI = R.first; + VMI->second.push_back(DVI); + } + } else { + NonUndefVariables.insert(Key); + VariableMap.erase(Key); + } + } + } + } + + for (auto VariableMapping : VariableMap) + for (auto &Instr : VariableMapping.second) + Instr->eraseFromParent(); + + return VariableMap.size() > 0; +} + /// Remove redundant instructions within sequences of consecutive dbg.value /// instructions. This is done using a backward scan to keep the last dbg.value /// describing a specific variable/fragment. _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits