[llvm] [InstCombine] Fold (X == 0 ? Y : 0) | X to X == 0 ? Y : X (PR #138373)
via llvm-commits
llvm-commits at lists.llvm.org
Wed May 7 09:19:39 PDT 2025
================
@@ -3658,6 +3658,15 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
return R;
}
+ // (X == 0 ? Y : 0) | X -> X == 0 ? Y : X
+ // X | (X == 0 ? Y : 0) -> X == 0 ? Y : X
+ for (Value *Op : {Op0, Op1}) {
+ if (auto *SI = dyn_cast<SelectInst>(Op)) {
+ if (auto *R = FoldOpIntoSelect(I, SI, /* FoldWithMultiUse */ false))
+ return R;
+ }
+ }
----------------
YLChenZ wrote:
Followed your tips and made changes accordingly:
Changed `foldBinOpIntoSelectOrPhi`:
```cpp
/// This is a convenience wrapper function for the above two functions.
Instruction *foldBinOpIntoSelectOrPhi(BinaryOperator &I, bool AllowNonConstRHS = false);
...
Instruction *InstCombinerImpl::foldBinOpIntoSelectOrPhi(BinaryOperator &I,
bool AllowNonConstRHS) {
if (!AllowNonConstRHS && !isa<Constant>(I.getOperand(1)))
return nullptr;
...
}
```
Changed `visitOr`:
```cpp
if (Instruction *FoldedLogic = foldBinOpIntoSelectOrPhi(I, /* AllowNonConstRHS */ true))
return FoldedLogic;
```
Then do the test, there is still a time out as last time.
So, I added some rough debug messages to some functions:
```cpp
if (Instruction *FoldedLogic = foldBinOpIntoSelectOrPhi(I, /* AllowNonConstRHS */ true)) {
LLVM_DEBUG(dbgs() << "visitOr on foldBinOpIntoSelectOrPhi at: " << I << '\n');
return FoldedLogic;
}
Instruction *InstCombinerImpl::FoldOpIntoSelect(Instruction &Op, SelectInst *SI,
bool FoldWithMultiUse) {
LLVM_DEBUG(dbgs() << "FoldOpIntoSelect at: " << Op << '\n');
static Value *simplifyOperationIntoSelectOperand(Instruction &I, SelectInst *SI,
bool IsTrueArm) {
LLVM_DEBUG(dbgs() << "simplifyOperationIntoSelectOperand at : " << I << " " <<*SI <<'\n');
static Value *foldOperationIntoSelectOperand(Instruction &I, SelectInst *SI,
Value *NewOp, InstCombiner &IC) {
LLVM_DEBUG(dbgs() << "foldOperationIntoSelectOperand at: " << I << '\n');
```
And I took the example from `vec_sext.ll` that caused time out:
```llvm ir
define <4 x i32> @vec_select(<4 x i32> %a, <4 x i32> %b) {
; CHECK-LABEL: @vec_select(
; CHECK-NEXT: [[SUB:%.*]] = sub nsw <4 x i32> zeroinitializer, [[A:%.*]]
; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt <4 x i32> [[B:%.*]], zeroinitializer
; CHECK-NEXT: [[T2:%.*]] = select <4 x i1> [[ISNEG]], <4 x i32> zeroinitializer, <4 x i32> [[A]]
; CHECK-NEXT: [[ISNEG1:%.*]] = icmp slt <4 x i32> [[B]], zeroinitializer
; CHECK-NEXT: [[T3:%.*]] = select <4 x i1> [[ISNEG1]], <4 x i32> [[SUB]], <4 x i32> zeroinitializer
; CHECK-NEXT: [[COND:%.*]] = or <4 x i32> [[T2]], [[T3]]
; CHECK-NEXT: ret <4 x i32> [[COND]]
;
%cmp = icmp slt <4 x i32> %b, zeroinitializer
%sext = sext <4 x i1> %cmp to <4 x i32>
%sub = sub nsw <4 x i32> zeroinitializer, %a
%t0 = icmp slt <4 x i32> %sext, zeroinitializer
%sext3 = sext <4 x i1> %t0 to <4 x i32>
%t1 = xor <4 x i32> %sext3, <i32 -1, i32 -1, i32 -1, i32 -1>
%t2 = and <4 x i32> %a, %t1
%t3 = and <4 x i32> %sext3, %sub
%cond = or <4 x i32> %t2, %t3
ret <4 x i32> %cond
}
```
<details>
<summary>Test result:</summary>
```
INSTCOMBINE ITERATION #1 on vec_select
ADD: ret <4 x i32> %cond
ADD: %cond = or <4 x i32> %t2, %t3
ADD: %t3 = and <4 x i32> %sext3, %sub
ADD: %t2 = and <4 x i32> %a, %t1
ADD: %t1 = xor <4 x i32> %sext3, splat (i32 -1)
ADD: %sext3 = sext <4 x i1> %t0 to <4 x i32>
ADD: %t0 = icmp slt <4 x i32> %sext, zeroinitializer
ADD: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD: %sext = sext <4 x i1> %cmp to <4 x i32>
ADD: %cmp = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %cmp = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %sext = sext <4 x i1> %cmp to <4 x i32>
ADD DEFERRED: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Replacing %sext = sext <4 x i1> %cmp to <4 x i32>
with %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Mod = %sext = sext <4 x i1> %cmp to <4 x i32>
New = %sext = sext <4 x i1> %cmp to <4 x i32>
IC: ERASE %sext = sext <4 x i1> %cmp to <4 x i32>
ADD DEFERRED: %cmp = icmp slt <4 x i32> %b, zeroinitializer
IC: ERASE %cmp = icmp slt <4 x i32> %b, zeroinitializer
ADD: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Visiting: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Visiting: %sub = sub nsw <4 x i32> zeroinitializer, %a
Negator: attempting to sink negation into <4 x i32> %a
Negator: failed to sink negation into <4 x i32> %a
IC: Visiting: %t0 = icmp slt <4 x i32> %b.lobit, zeroinitializer
ADD DEFERRED: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Mod = %t0 = icmp slt <4 x i32> %b.lobit, zeroinitializer
New = %t0 = icmp slt <4 x i32> %b, zeroinitializer
ADD: %t0 = icmp slt <4 x i32> %b, zeroinitializer
IC: ERASE %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Visiting: %t0 = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %sext3 = sext <4 x i1> %t0 to <4 x i32>
ADD DEFERRED: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Replacing %sext3 = sext <4 x i1> %t0 to <4 x i32>
with %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Mod = %sext3 = sext <4 x i1> %t0 to <4 x i32>
New = %sext3 = sext <4 x i1> %t0 to <4 x i32>
IC: ERASE %sext3 = sext <4 x i1> %t0 to <4 x i32>
ADD DEFERRED: %t0 = icmp slt <4 x i32> %b, zeroinitializer
IC: ERASE %t0 = icmp slt <4 x i32> %b, zeroinitializer
ADD: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Visiting: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Visiting: %t1 = xor <4 x i32> %b.lobit, splat (i32 -1)
IC: Visiting: %t2 = and <4 x i32> %a, %t1
ADD DEFERRED: %isneg = icmp slt <4 x i32> %b, zeroinitializer
IC: Old = %t2 = and <4 x i32> %a, %t1
New = <badref> = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD: %t2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: ERASE %1 = and <4 x i32> %a, %t1
ADD DEFERRED: %t1 = xor <4 x i32> %b.lobit, splat (i32 -1)
IC: ERASE %t1 = xor <4 x i32> %b.lobit, splat (i32 -1)
ADD DEFERRED: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
ADD DEFERRED: %t3 = and <4 x i32> %b.lobit, %sub
ADD: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
ADD: %isneg = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %isneg = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
IC: Visiting: %t2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %t3 = and <4 x i32> %b.lobit, %sub
ADD DEFERRED: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
IC: Old = %t3 = and <4 x i32> %b.lobit, %sub
New = <badref> = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: ERASE %1 = and <4 x i32> %b.lobit, %sub
ADD DEFERRED: %b.lobit = ashr <4 x i32> %b, splat (i32 31)
ADD DEFERRED: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD DEFERRED: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD: %sub = sub nsw <4 x i32> zeroinitializer, %a
IC: ERASE %b.lobit = ashr <4 x i32> %b, splat (i32 31)
ADD: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %sub = sub nsw <4 x i32> zeroinitializer, %a
Negator: attempting to sink negation into <4 x i32> %a
Negator: failed to sink negation into <4 x i32> %a
IC: Visiting: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %cond = or <4 x i32> %t2, %t3
FoldOpIntoSelect at: %cond = or <4 x i32> %t2, %t3
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %t2, %t3 %t2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %t2, %t3 %t2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
foldOperationIntoSelectOperand at: %cond = or <4 x i32> %t2, %t3
ADD DEFERRED: %1 = or <4 x i32> %a, %t3
visitOr on foldBinOpIntoSelectOrPhi at: %cond = or <4 x i32> %t2, %t3
IC: Old = %cond = or <4 x i32> %t2, %t3
New = <badref> = select <4 x i1> %isneg, <4 x i32> %t3, <4 x i32> %1
ADD: %cond = select <4 x i1> %isneg, <4 x i32> %t3, <4 x i32> %1
IC: ERASE %2 = or <4 x i32> %t2, %t3
ADD DEFERRED: %t2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD DEFERRED: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: ERASE %t2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD DEFERRED: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %cond = select <4 x i1> %isneg, <4 x i32> %t3, <4 x i32> %1
ADD: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD: %1 = or <4 x i32> %a, %t3
IC: Visiting: %1 = or <4 x i32> %a, %t3
IC: Visiting: %isneg = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %cond = select <4 x i1> %isneg, <4 x i32> %t3, <4 x i32> %1
ADD DEFERRED: %2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Old = %cond = select <4 x i1> %isneg, <4 x i32> %t3, <4 x i32> %1
New = <badref> = or <4 x i32> %t3, %2
ADD: %cond = or <4 x i32> %t3, %2
IC: ERASE %3 = select <4 x i1> %isneg, <4 x i32> %t3, <4 x i32> %1
ADD DEFERRED: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD DEFERRED: %1 = or <4 x i32> %a, %t3
IC: ERASE %1 = or <4 x i32> %a, %t3
ADD DEFERRED: %cond = or <4 x i32> %t3, %1
ADD: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %isneg = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %cond = or <4 x i32> %t3, %1
FoldOpIntoSelect at: %cond = or <4 x i32> %t3, %1
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %t3, %1 %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %t3, %1 %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
foldOperationIntoSelectOperand at: %cond = or <4 x i32> %t3, %1
ADD DEFERRED: %2 = or <4 x i32> %sub, %1
visitOr on foldBinOpIntoSelectOrPhi at: %cond = or <4 x i32> %t3, %1
IC: Old = %cond = or <4 x i32> %t3, %1
New = <badref> = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
ADD: %cond = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
IC: ERASE %3 = or <4 x i32> %t3, %1
ADD DEFERRED: %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD DEFERRED: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: ERASE %t3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD DEFERRED: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %cond = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
ADD DEFERRED: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
ADD: %2 = or <4 x i32> %sub, %1
IC: Visiting: %2 = or <4 x i32> %sub, %1
IC: Mod = %2 = or <4 x i32> %sub, %1
New = %2 = or <4 x i32> %1, %sub
ADD: %2 = or <4 x i32> %1, %sub
IC: Visiting: %2 = or <4 x i32> %1, %sub
FoldOpIntoSelect at: %2 = or <4 x i32> %1, %sub
IC: Visiting: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %sub = sub nsw <4 x i32> zeroinitializer, %a
Negator: attempting to sink negation into <4 x i32> %a
Negator: failed to sink negation into <4 x i32> %a
IC: Visiting: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %cond = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
ADD DEFERRED: %3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Old = %cond = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
New = <badref> = or <4 x i32> %1, %3
ADD: %cond = or <4 x i32> %1, %3
IC: ERASE %4 = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
ADD DEFERRED: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %2 = or <4 x i32> %1, %sub
ADD DEFERRED: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: ERASE %2 = or <4 x i32> %1, %sub
ADD DEFERRED: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD DEFERRED: %cond = or <4 x i32> %1, %2
ADD DEFERRED: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
ADD: %2 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %2 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %sub = sub nsw <4 x i32> zeroinitializer, %a
Negator: attempting to sink negation into <4 x i32> %a
Negator: failed to sink negation into <4 x i32> %a
IC: Visiting: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %cond = or <4 x i32> %1, %2
FoldOpIntoSelect at: %cond = or <4 x i32> %1, %2
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %1, %2 %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %1, %2 %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
foldOperationIntoSelectOperand at: %cond = or <4 x i32> %1, %2
ADD DEFERRED: %3 = or <4 x i32> %a, %2
visitOr on foldBinOpIntoSelectOrPhi at: %cond = or <4 x i32> %1, %2
IC: Old = %cond = or <4 x i32> %1, %2
New = <badref> = select <4 x i1> %isneg, <4 x i32> %2, <4 x i32> %3
ADD: %cond = select <4 x i1> %isneg, <4 x i32> %2, <4 x i32> %3
IC: ERASE %4 = or <4 x i32> %1, %2
ADD DEFERRED: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD DEFERRED: %2 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD: %2 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: ERASE %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD DEFERRED: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %cond = select <4 x i1> %isneg, <4 x i32> %1, <4 x i32> %2
ADD: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD: %2 = or <4 x i32> %a, %1
IC: Visiting: %2 = or <4 x i32> %a, %1
IC: Visiting: %isneg = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %cond = select <4 x i1> %isneg, <4 x i32> %1, <4 x i32> %2
ADD DEFERRED: %3 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Old = %cond = select <4 x i1> %isneg, <4 x i32> %1, <4 x i32> %2
New = <badref> = or <4 x i32> %1, %3
ADD: %cond = or <4 x i32> %1, %3
IC: ERASE %4 = select <4 x i1> %isneg, <4 x i32> %1, <4 x i32> %2
ADD DEFERRED: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD DEFERRED: %2 = or <4 x i32> %a, %1
IC: ERASE %2 = or <4 x i32> %a, %1
ADD DEFERRED: %cond = or <4 x i32> %1, %2
ADD: %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD: %2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %isneg = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %cond = or <4 x i32> %1, %2
FoldOpIntoSelect at: %cond = or <4 x i32> %1, %2
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %1, %2 %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %1, %2 %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
foldOperationIntoSelectOperand at: %cond = or <4 x i32> %1, %2
ADD DEFERRED: %3 = or <4 x i32> %sub, %2
visitOr on foldBinOpIntoSelectOrPhi at: %cond = or <4 x i32> %1, %2
IC: Old = %cond = or <4 x i32> %1, %2
New = <badref> = select <4 x i1> %isneg1, <4 x i32> %3, <4 x i32> %2
ADD: %cond = select <4 x i1> %isneg1, <4 x i32> %3, <4 x i32> %2
IC: ERASE %4 = or <4 x i32> %1, %2
ADD DEFERRED: %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD DEFERRED: %2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD: %2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: ERASE %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD DEFERRED: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %cond = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
ADD DEFERRED: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
ADD: %2 = or <4 x i32> %sub, %1
IC: Visiting: %2 = or <4 x i32> %sub, %1
IC: Mod = %2 = or <4 x i32> %sub, %1
New = %2 = or <4 x i32> %1, %sub
ADD: %2 = or <4 x i32> %1, %sub
IC: Visiting: %2 = or <4 x i32> %1, %sub
FoldOpIntoSelect at: %2 = or <4 x i32> %1, %sub
IC: Visiting: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %sub = sub nsw <4 x i32> zeroinitializer, %a
Negator: attempting to sink negation into <4 x i32> %a
Negator: failed to sink negation into <4 x i32> %a
IC: Visiting: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %cond = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
ADD DEFERRED: %3 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Old = %cond = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
New = <badref> = or <4 x i32> %1, %3
ADD: %cond = or <4 x i32> %1, %3
IC: ERASE %4 = select <4 x i1> %isneg1, <4 x i32> %2, <4 x i32> %1
ADD DEFERRED: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %2 = or <4 x i32> %1, %sub
ADD DEFERRED: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: ERASE %2 = or <4 x i32> %1, %sub
ADD DEFERRED: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD DEFERRED: %cond = or <4 x i32> %1, %2
ADD DEFERRED: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD: %sub = sub nsw <4 x i32> zeroinitializer, %a
ADD: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
ADD: %2 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %2 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %isneg1 = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %sub = sub nsw <4 x i32> zeroinitializer, %a
Negator: attempting to sink negation into <4 x i32> %a
Negator: failed to sink negation into <4 x i32> %a
IC: Visiting: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %cond = or <4 x i32> %1, %2
FoldOpIntoSelect at: %cond = or <4 x i32> %1, %2
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %1, %2 %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %1, %2 %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
foldOperationIntoSelectOperand at: %cond = or <4 x i32> %1, %2
ADD DEFERRED: %3 = or <4 x i32> %a, %2
visitOr on foldBinOpIntoSelectOrPhi at: %cond = or <4 x i32> %1, %2
IC: Old = %cond = or <4 x i32> %1, %2
New = <badref> = select <4 x i1> %isneg, <4 x i32> %2, <4 x i32> %3
ADD: %cond = select <4 x i1> %isneg, <4 x i32> %2, <4 x i32> %3
IC: ERASE %4 = or <4 x i32> %1, %2
ADD DEFERRED: %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD DEFERRED: %2 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD: %2 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: ERASE %1 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
ADD DEFERRED: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %cond = select <4 x i1> %isneg, <4 x i32> %1, <4 x i32> %2
ADD: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD: %2 = or <4 x i32> %a, %1
IC: Visiting: %2 = or <4 x i32> %a, %1
IC: Visiting: %isneg = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %cond = select <4 x i1> %isneg, <4 x i32> %1, <4 x i32> %2
ADD DEFERRED: %3 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Old = %cond = select <4 x i1> %isneg, <4 x i32> %1, <4 x i32> %2
New = <badref> = or <4 x i32> %1, %3
ADD: %cond = or <4 x i32> %1, %3
IC: ERASE %4 = select <4 x i1> %isneg, <4 x i32> %1, <4 x i32> %2
ADD DEFERRED: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD DEFERRED: %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD DEFERRED: %2 = or <4 x i32> %a, %1
IC: ERASE %2 = or <4 x i32> %a, %1
ADD DEFERRED: %cond = or <4 x i32> %1, %2
ADD: %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
ADD: %isneg = icmp slt <4 x i32> %b, zeroinitializer
ADD: %2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %2 = select <4 x i1> %isneg, <4 x i32> zeroinitializer, <4 x i32> %a
IC: Visiting: %isneg = icmp slt <4 x i32> %b, zeroinitializer
IC: Visiting: %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
IC: Visiting: %cond = or <4 x i32> %1, %2
FoldOpIntoSelect at: %cond = or <4 x i32> %1, %2
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %1, %2 %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
simplifyOperationIntoSelectOperand at : %cond = or <4 x i32> %1, %2 %1 = select <4 x i1> %isneg1, <4 x i32> %sub, <4 x i32> zeroinitializer
```
</details>
It's seems to form a closed loop of alternating or <-> select.
https://github.com/llvm/llvm-project/pull/138373
More information about the llvm-commits
mailing list