diff options
author | Max Kazantsev <mkazantsev@azul.com> | 2022-08-22 13:09:20 +0700 |
---|---|---|
committer | Max Kazantsev <mkazantsev@azul.com> | 2022-08-22 14:31:19 +0700 |
commit | e587199a505bf517935026e878fc811a38532e4a (patch) | |
tree | a803447db0baa9e70adeeb299079a9bf0bad3006 /llvm/lib/Transforms/Utils/SimplifyIndVar.cpp | |
parent | 5541e6bc0596df4cab6009d6577c2003dc7b11a5 (diff) | |
download | llvm-e587199a505bf517935026e878fc811a38532e4a.zip llvm-e587199a505bf517935026e878fc811a38532e4a.tar.gz llvm-e587199a505bf517935026e878fc811a38532e4a.tar.bz2 |
[SCEV] Prove condition invariance via context, try 2
Initial implementation had too weak requirements to positive/negative
range crossings. Not crossing zero with nuw is not enough for two reasons:
- If ArLHS has negative step, it may turn from positive to negative
without crossing 0 boundary from left to right (and crossing right to
left doesn't count for unsigned);
- If ArLHS crosses SINT_MAX boundary, it still turns from positive to
negative;
In fact we require that ArLHS always stays non-negative or negative,
which an be enforced by the following set of preconditions:
- both nuw and nsw;
- positive step (looks liftable);
Because of positive step, boundary crossing is only possible from left
part to the right part. And because of no-wrap flags, it is guaranteed
to never happen.
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyIndVar.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyIndVar.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp index 0a856ee..08c48b0 100644 --- a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp @@ -213,7 +213,8 @@ bool SimplifyIndvar::makeIVComparisonInvariant(ICmpInst *ICmp, auto *PN = dyn_cast<PHINode>(IVOperand); if (!PN) return false; - auto LIP = SE->getLoopInvariantPredicate(Pred, S, X, L); + + auto LIP = SE->getLoopInvariantPredicate(Pred, S, X, L, ICmp); if (!LIP) return false; ICmpInst::Predicate InvariantPredicate = LIP->Pred; |