Reapply [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>
Tue, 18 Jul 2023 08:36:39 +0000 (10:36 +0200)
commit0db5d8e12384d780d2ded6b972233dc8b1632560
treebe9934994b52494c382258e5f0595e240353a41d
parent5b99aa57f74e1432691f366d26a2ec21907a7a70
Reapply [InstSimplify] Make simplifyWithOpReplaced() recursive (PR63104)

A similar assumption as for the x^x case also existed for the absorber
case, which lead to a stage2 miscompile. That assumption is not fixed.

-----

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 and the absorber special case, we
can no longer assume that one of the operands 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