[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