[all-commits] [llvm/llvm-project] 1770a2: [InstCombine] Simplify and/or of icmp eq with op r...
Nikita Popov via All-commits
all-commits at lists.llvm.org
Mon Oct 30 02:05:52 PDT 2023
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 1770a2e325192f1665018e21200596da1904a330
https://github.com/llvm/llvm-project/commit/1770a2e325192f1665018e21200596da1904a330
Author: Nikita Popov <npopov at redhat.com>
Date: 2023-10-30 (Mon, 30 Oct 2023)
Changed paths:
M llvm/lib/Analysis/InstructionSimplify.cpp
M llvm/test/CodeGen/PowerPC/pr45448.ll
M llvm/test/Transforms/InstCombine/div-by-0-guard-before-smul_ov.ll
M llvm/test/Transforms/InstCombine/div-by-0-guard-before-umul_ov.ll
M llvm/test/Transforms/InstCombine/ispow2.ll
M llvm/test/Transforms/InstSimplify/and-or-icmp-ctpop.ll
M llvm/test/Transforms/InstSimplify/and-or-icmp-min-max.ll
M llvm/test/Transforms/InstSimplify/and-or-implied-cond.ll
M llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov-not.ll
M llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov.ll
M llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov-not.ll
M llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov.ll
M llvm/test/Transforms/InstSimplify/result-of-add-of-negative-is-non-zero-and-no-underflow.ll
M llvm/test/Transforms/PGOProfile/chr.ll
Log Message:
-----------
[InstCombine] Simplify and/or of icmp eq with op replacement (#70335)
and/or in logical (select) form benefit from generic simplifications via
simplifyWithOpReplaced(). However, the corresponding fold for plain
and/or currently does not exist.
Similar to selects, there are two general cases for this fold
(illustrated with `and`, but there are `or` conjugates).
The basic case is something like `(a == b) & c`, where the replacement
of a with b or b with a inside c allows it to fold to true or false.
Then the whole operation will fold to either false or `a == b`.
The second case is something like `(a != b) & c`, where the replacement
inside c allows it to fold to false. In that case, the operand can be
replaced with c, because in the case where a == b (and thus the icmp is
false), c itself will already be false.
As the test diffs show, this catches quite a lot of patterns in existing
test coverage. This also obsoletes quite a few existing special-case
and/or of icmp folds we have (e.g. simplifyAndOrOfICmpsWithLimitConst),
but I haven't removed anything as part of this patch in the interest of
risk mitigation.
Fixes #69050.
Fixes #69091.
More information about the All-commits
mailing list