[llvm-branch-commits] [llvm] 6762d53 - Add RemovePureUndefs to opt

Hans Wennborg via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Jan 16 02:21:44 PST 2020


Hi Stephen,

It seems that while this did get pushed upstream, it's not actually
part of master or any other branch.

It appears to be the same for these:
https://github.com/llvm/llvm-project/commit/80f81325b8e8f0bed81a28dffb8eba526002f2b3
https://github.com/llvm/llvm-project/commit/24b81434a056825f4e9dd3ef06bad7a2ef34f813
https://github.com/llvm/llvm-project/commit/3191fa21be09d6e7352751f86626a2e8fb251555

I'm guessing you wanted to push them to master.

(I'll also start an llvm-dev thread about this, because it would be
good if there was a hook or something that disallowed this.)

Thanks,
Hans


On Wed, Jan 15, 2020 at 1:18 PM via llvm-branch-commits
<llvm-branch-commits at lists.llvm.org> wrote:
>
>
> 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 at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


More information about the llvm-branch-commits mailing list