summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorArtur Pilipenko <apilipenko@azulsystems.com>2017-05-19 14:02:46 +0000
committerArtur Pilipenko <apilipenko@azulsystems.com>2017-05-19 14:02:46 +0000
commita6c278049a8531f1e2c57cfc66caa7822446d803 (patch)
tree8d5673b59fe6a446690fec613369feb0d12b35ba /llvm/lib/Transforms
parent6780ba65b9e1542e2467e9aaf8ebc6049a669d47 (diff)
downloadbcm5719-llvm-a6c278049a8531f1e2c57cfc66caa7822446d803.tar.gz
bcm5719-llvm-a6c278049a8531f1e2c57cfc66caa7822446d803.zip
[LoopPredication] NFC. Extract LoopICmp struct and parseLoopICmp helper
llvm-svn: 303427
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/LoopPredication.cpp62
1 files changed, 44 insertions, 18 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopPredication.cpp b/llvm/lib/Transforms/Scalar/LoopPredication.cpp
index 93a7313196d..9055bd95aa3 100644
--- a/llvm/lib/Transforms/Scalar/LoopPredication.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopPredication.cpp
@@ -64,6 +64,18 @@ class LoopPredication {
const DataLayout *DL;
BasicBlock *Preheader;
+ /// Represents an induction variable check:
+ /// icmp Pred, <induction variable>, <loop invariant limit>
+ struct LoopICmp {
+ ICmpInst::Predicate Pred;
+ const SCEVAddRecExpr *IV;
+ const SCEV *Limit;
+ LoopICmp(ICmpInst::Predicate Pred, const SCEVAddRecExpr *IV, const SCEV *Limit)
+ : Pred(Pred), IV(IV), Limit(Limit) {}
+ LoopICmp() {}
+ };
+ Optional<LoopICmp> parseLoopICmp(ICmpInst *ICI);
+
Value *expandCheck(SCEVExpander &Expander, IRBuilder<> &Builder,
ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS,
Instruction *InsertAt);
@@ -120,6 +132,33 @@ PreservedAnalyses LoopPredicationPass::run(Loop &L, LoopAnalysisManager &AM,
return getLoopPassPreservedAnalyses();
}
+Optional<LoopPredication::LoopICmp>
+LoopPredication::parseLoopICmp(ICmpInst *ICI) {
+ ICmpInst::Predicate Pred = ICI->getPredicate();
+
+ Value *LHS = ICI->getOperand(0);
+ Value *RHS = ICI->getOperand(1);
+ const SCEV *LHSS = SE->getSCEV(LHS);
+ if (isa<SCEVCouldNotCompute>(LHSS))
+ return None;
+ const SCEV *RHSS = SE->getSCEV(RHS);
+ if (isa<SCEVCouldNotCompute>(RHSS))
+ return None;
+
+ // Canonicalize RHS to be loop invariant bound, LHS - a loop computable IV
+ if (SE->isLoopInvariant(LHSS, L)) {
+ std::swap(LHS, RHS);
+ std::swap(LHSS, RHSS);
+ Pred = ICmpInst::getSwappedPredicate(Pred);
+ }
+
+ const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(LHSS);
+ if (!AR || AR->getLoop() != L)
+ return None;
+
+ return LoopICmp(Pred, AR, RHSS);
+}
+
Value *LoopPredication::expandCheck(SCEVExpander &Expander,
IRBuilder<> &Builder,
ICmpInst::Predicate Pred, const SCEV *LHS,
@@ -140,22 +179,13 @@ Optional<Value *> LoopPredication::widenICmpRangeCheck(ICmpInst *ICI,
DEBUG(dbgs() << "Analyzing ICmpInst condition:\n");
DEBUG(ICI->dump());
- ICmpInst::Predicate Pred = ICI->getPredicate();
- Value *LHS = ICI->getOperand(0);
- Value *RHS = ICI->getOperand(1);
- const SCEV *LHSS = SE->getSCEV(LHS);
- if (isa<SCEVCouldNotCompute>(LHSS))
- return None;
- const SCEV *RHSS = SE->getSCEV(RHS);
- if (isa<SCEVCouldNotCompute>(RHSS))
+ auto RangeCheck = parseLoopICmp(ICI);
+ if (!RangeCheck)
return None;
- // Canonicalize RHS to be loop invariant bound, LHS - a loop computable index
- if (SE->isLoopInvariant(LHSS, L)) {
- std::swap(LHS, RHS);
- std::swap(LHSS, RHSS);
- Pred = ICmpInst::getSwappedPredicate(Pred);
- }
+ ICmpInst::Predicate Pred = RangeCheck->Pred;
+ const SCEVAddRecExpr *IndexAR = RangeCheck->IV;
+ const SCEV *RHSS = RangeCheck->Limit;
auto CanExpand = [this](const SCEV *S) {
return SE->isLoopInvariant(S, L) && isSafeToExpand(S, *SE);
@@ -163,10 +193,6 @@ Optional<Value *> LoopPredication::widenICmpRangeCheck(ICmpInst *ICI,
if (!CanExpand(RHSS))
return None;
- const SCEVAddRecExpr *IndexAR = dyn_cast<SCEVAddRecExpr>(LHSS);
- if (!IndexAR || IndexAR->getLoop() != L)
- return None;
-
DEBUG(dbgs() << "IndexAR: ");
DEBUG(IndexAR->dump());
OpenPOWER on IntegriCloud