OSDN Git Service

Revert 5238e7b302 "[InstCombine] Replace one-use select operand based on condition"
authorHans Wennborg <hans@chromium.org>
Tue, 19 Jan 2021 10:37:50 +0000 (11:37 +0100)
committerHans Wennborg <hans@chromium.org>
Tue, 19 Jan 2021 10:50:56 +0000 (11:50 +0100)
commit58bdfcfac048563e0dbcecc7c75e4e7897c8da18
tree95a81ecaba96ce495636ba8022f651b0ae25185a
parent49dce85584e34ee7fb973da9ba617169fd0f103c
Revert 5238e7b302 "[InstCombine] Replace one-use select operand based on condition"

This caused a miscompile in Chromium, see comments on the codereview for
discussion and pointer to a reproducer.

> InstCombine already performs a fold where X == Y ? f(X) : Z is
> transformed to X == Y ? f(Y) : Z if f(Y) simplifies. However,
> if f(X) only has one use, then we can always directly replace the
> use inside the instruction. To actually be profitable, limit it to
> the case where Y is a non-expr constant.
>
> This could be further extended to replace uses further up a one-use
> instruction chain, but for now this only looks one level up.
>
> Among other things, this also subsumes D94860.
>
> Differential Revision: https://reviews.llvm.org/D94862

This also reverts the follow-up
a003f26539cf4db744655e76c41f4c4a8913f116:

> [llvm] Prevent infinite loop in InstCombine of select statements
>
> This fixes an issue where the RHS and LHS the comparison operation
> creating the predicate were swapped back and forth forever.
>
> Differential Revision: https://reviews.llvm.org/D94934
llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
llvm/test/Transforms/InstCombine/select-binop-cmp.ll
llvm/test/Transforms/InstCombine/select-safe-transforms.ll