aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorArtur Pilipenko <apilipenko@azulsystems.com>2017-10-12 21:21:17 +0000
committerArtur Pilipenko <apilipenko@azulsystems.com>2017-10-12 21:21:17 +0000
commit2a079134ab741a2b2a2f713432ff3b44ecc474a5 (patch)
treed986be8b506bdce58bad3782c270cbe0bfc5bde0 /lib/Transforms
parent4d6b50c6a7ce75e1a7e888856b5ec1cc77feafd7 (diff)
downloadllvm-2a079134ab741a2b2a2f713432ff3b44ecc474a5.tar.gz
[LoopPredication] Check whether the loop is already guarded by the first iteration check condition
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315623 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/LoopPredication.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/LoopPredication.cpp b/lib/Transforms/Scalar/LoopPredication.cpp
index bb22a50e604..393c6049af1 100644
--- a/lib/Transforms/Scalar/LoopPredication.cpp
+++ b/lib/Transforms/Scalar/LoopPredication.cpp
@@ -289,6 +289,10 @@ Value *LoopPredication::expandCheck(SCEVExpander &Expander,
Type *Ty = LHS->getType();
assert(Ty == RHS->getType() && "expandCheck operands have different types?");
+
+ if (SE->isLoopEntryGuardedByCond(L, Pred, LHS, RHS))
+ return Builder.getTrue();
+
Value *LHSV = Expander.expandCodeFor(LHS, Ty, InsertAt);
Value *RHSV = Expander.expandCodeFor(RHS, Ty, InsertAt);
return Builder.CreateICmp(Pred, LHSV, RHSV);
@@ -358,10 +362,10 @@ Optional<Value *> LoopPredication::widenICmpRangeCheck(ICmpInst *ICI,
return None;
Instruction *InsertAt = Preheader->getTerminator();
- auto *FirstIterationCheck = expandCheck(Expander, Builder, RangeCheck->Pred,
- Start, RangeCheck->Limit, InsertAt);
auto *LimitCheck = expandCheck(Expander, Builder, LimitCheckPred,
LatchCheck.Limit, RangeCheck->Limit, InsertAt);
+ auto *FirstIterationCheck = expandCheck(Expander, Builder, RangeCheck->Pred,
+ Start, RangeCheck->Limit, InsertAt);
return Builder.CreateAnd(FirstIterationCheck, LimitCheck);
}