[all-commits] [llvm/llvm-project] 602916: [IndVars] Apply more optimistic SkipLastIter for A...
Max Kazantsev via All-commits
all-commits at lists.llvm.org
Mon Jan 23 21:45:29 PST 2023
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 602916d2defa95cf4bec76e458be4375dbe70e4a
https://github.com/llvm/llvm-project/commit/602916d2defa95cf4bec76e458be4375dbe70e4a
Author: Max Kazantsev <mkazantsev at azul.com>
Date: 2023-01-24 (Tue, 24 Jan 2023)
Changed paths:
M llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
M llvm/test/Transforms/IndVarSimplify/X86/widening-vs-and-elimination.ll
M llvm/test/Transforms/IndVarSimplify/turn-to-invariant.ll
Log Message:
-----------
[IndVars] Apply more optimistic SkipLastIter for AND/OR conditions
When exit by condition `C1` dominates exit by condition `C2`, and
max symbolic exit count for `C1` matches those for loop, we will
apply more optimistic logic to `C2` by setting `SkipLastIter` for it,
meaning that it will do 1 iteration less because the dominating branch
must exit on the last loop iteration.
But when we have a single exit by condition `C1 & C2`, we cannot
apply the same logic, because there is no dominating condition.
However, if we can prove that the symbolic max exit count of `C1 & C2`
matches those of `C1`, it means that for `C2` we can assume that it
doesn't matter on the last iteration (because the whole thing is `false`
because `C1` must be `false`). Therefore, in this situation, we can handle
`C2` as if it had `SkipLastIter`.
Differential Revision: https://reviews.llvm.org/D139934
Reviewed By: nikic
More information about the All-commits
mailing list