diff options
author | Philip Reames <listmail@philipreames.com> | 2019-10-17 23:49:46 +0000 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2019-10-17 23:49:46 +0000 |
commit | 8eaa5b9abab3a358353c3d925b1dd0b3a6ee4b42 (patch) | |
tree | 2b40761cd8a882e050e2fb4b2785a9516255d4aa | |
parent | 3266eac7142c0906fca06c9947e6ddc5f8dd3f6b (diff) | |
download | bcm5719-llvm-8eaa5b9abab3a358353c3d925b1dd0b3a6ee4b42.tar.gz bcm5719-llvm-8eaa5b9abab3a358353c3d925b1dd0b3a6ee4b42.zip |
[IndVars] Factor out some common code into a utility function
As requested in review of D69009
llvm-svn: 375191
-rw-r--r-- | llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index a5edb8052f6..6299deca08c 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -2717,10 +2717,19 @@ bool IndVarSimplify::optimizeLoopExits(Loop *L, SCEVExpander &Rewriter) { if (isa<SCEVCouldNotCompute>(MaxExitCount)) return false; - bool Changed = false; - for (BasicBlock *ExitingBB : ExitingBlocks) { + auto FoldExit = [&](BasicBlock *ExitingBB, bool IsTaken) { BranchInst *BI = cast<BranchInst>(ExitingBB->getTerminator()); + bool ExitIfTrue = !L->contains(*succ_begin(ExitingBB)); + auto *OldCond = BI->getCondition(); + auto *NewCond = ConstantInt::get(OldCond->getType(), + IsTaken ? ExitIfTrue : !ExitIfTrue); + BI->setCondition(NewCond); + if (OldCond->use_empty()) + DeadInsts.push_back(OldCond); + }; + bool Changed = false; + for (BasicBlock *ExitingBB : ExitingBlocks) { const SCEV *ExitCount = SE->getExitCount(L, ExitingBB); assert(!isa<SCEVCouldNotCompute>(ExitCount) && "checked above"); @@ -2730,13 +2739,7 @@ bool IndVarSimplify::optimizeLoopExits(Loop *L, SCEVExpander &Rewriter) { // TODO: Given we know the backedge can't be taken, we should go ahead // and break it. Or at least, kill all the header phis and simplify. if (ExitCount->isZero()) { - bool ExitIfTrue = !L->contains(*succ_begin(ExitingBB)); - auto *OldCond = BI->getCondition(); - auto *NewCond = ExitIfTrue ? ConstantInt::getTrue(OldCond->getType()) : - ConstantInt::getFalse(OldCond->getType()); - BI->setCondition(NewCond); - if (OldCond->use_empty()) - DeadInsts.push_back(OldCond); + FoldExit(ExitingBB, true); Changed = true; continue; } @@ -2758,13 +2761,7 @@ bool IndVarSimplify::optimizeLoopExits(Loop *L, SCEVExpander &Rewriter) { // one? if (SE->isLoopEntryGuardedByCond(L, CmpInst::ICMP_ULT, MaxExitCount, ExitCount)) { - bool ExitIfTrue = !L->contains(*succ_begin(ExitingBB)); - auto *OldCond = BI->getCondition(); - auto *NewCond = ExitIfTrue ? ConstantInt::getFalse(OldCond->getType()) : - ConstantInt::getTrue(OldCond->getType()); - BI->setCondition(NewCond); - if (OldCond->use_empty()) - DeadInsts.push_back(OldCond); + FoldExit(ExitingBB, false); Changed = true; continue; } |