[all-commits] [llvm/llvm-project] e58719: [SCEV] Prove condition invariance via context, try 2
Max Kazantsev via All-commits
all-commits at lists.llvm.org
Mon Aug 22 00:32:07 PDT 2022
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: e587199a505bf517935026e878fc811a38532e4a
https://github.com/llvm/llvm-project/commit/e587199a505bf517935026e878fc811a38532e4a
Author: Max Kazantsev <mkazantsev at azul.com>
Date: 2022-08-22 (Mon, 22 Aug 2022)
Changed paths:
M llvm/include/llvm/Analysis/ScalarEvolution.h
M llvm/lib/Analysis/ScalarEvolution.cpp
M llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
M llvm/test/Transforms/IndVarSimplify/cycled_phis.ll
M llvm/test/Transforms/IndVarSimplify/outer_phi.ll
Log Message:
-----------
[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.
More information about the All-commits
mailing list