diff options
author | Artur Pilipenko <apilipenko@azulsystems.com> | 2017-10-12 21:21:17 +0000 |
---|---|---|
committer | Artur Pilipenko <apilipenko@azulsystems.com> | 2017-10-12 21:21:17 +0000 |
commit | 2a079134ab741a2b2a2f713432ff3b44ecc474a5 (patch) | |
tree | d986be8b506bdce58bad3782c270cbe0bfc5bde0 /lib/Transforms | |
parent | 4d6b50c6a7ce75e1a7e888856b5ec1cc77feafd7 (diff) | |
download | llvm-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.cpp | 8 |
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); } |