[InstSimplify] Make simplifyWithOpReplaced() recursive (PR63104)
authorNikita Popov <npopov@redhat.com>
Thu, 13 Jul 2023 15:25:18 +0000 (17:25 +0200)
committerNikita Popov <npopov@redhat.com>
Fri, 14 Jul 2023 14:33:40 +0000 (16:33 +0200)
commit3d199d086e076f0b9b90d4c59f2226a417a639b5
treee6debc10a5bd883140064946c83c1319d40ce94a
parented682829422559cf3196b46f2469a2a638602956
[InstSimplify] Make simplifyWithOpReplaced() recursive (PR63104)

Support replacement of operands not only in the immediate
instruction, but also instructions it uses.

To the most part, this extension is straightforward, but there are
two bits worth highlighting:

First, we can now no longer assume that if the Op is a vector, the
instruction also returns a vector. If Op is a vector and the
instruction returns a scalar, we should consider it as a cross-lane
operation.

Second, for the x ^ x special case, we can no longer assume that
the operand is RepOp, as we might have a replacement higher up the
instruction chain.

There is one optimization regression, but it is in a fuzzer-generated
test case.

Fixes https://github.com/llvm/llvm-project/issues/63104.
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstCombine/div-by-0-guard-before-smul_ov-not.ll
llvm/test/Transforms/InstCombine/div-by-0-guard-before-umul_ov-not.ll
llvm/test/Transforms/InstCombine/select-ctlz-to-cttz.ll
llvm/test/Transforms/InstCombine/shift.ll
llvm/test/Transforms/InstSimplify/select.ll