Issue 142593
Summary Missed optimization: (xor (lshr i32 %0, 31), true) ? (%0 < 0) : false ==> false
Labels new issue
Assignees
Reporter GINN-Imp
    The following reduced IR is derived from https://github.com/boostorg/geometry/blob/d2e5137f4070d8bbcd8ab150ad4fe42713c8ceb3/include/boost/geometry/algorithms/correct_closure.hpp#L56

Godbolt: https://godbolt.org/z/oW5b74jc4
alive2 proof: https://alive2.llvm.org/ce/z/QHnD7e

```llvm
define i1 @src(i32 %0, ptr writeonly captures(none) initializes((0, 4)) %p) local_unnamed_addr #0 {
common.ret1:
  %.lobit = lshr i32 %0, 31
  %1 = trunc nuw i32 %.lobit to i1
  %2 = icmp slt i32 %0, 0
  %not. = xor i1 %1, true
  %common.ret1.op = select i1 %not., i1 %2, i1 false
  store i32 %.lobit, ptr %p, align 1
  ret i1 %common.ret1.op
}
```

expected:
```llvm
define i1 @tgt(i32 %0, ptr writeonly captures(none) initializes((0, 1)) %p) local_unnamed_addr #0 {
common.ret1:
  %.lobit = lshr i32 %0, 31
  store i32 %.lobit, ptr %p, align 1
  ret i1 false
}
```

opt-trunk -O3 generates:
```llvm
define i1 @src(i32 %0, ptr writeonly captures(none) initializes((0, 4)) %p) local_unnamed_addr #0 {
common.ret1:
  %.lobit = lshr i32 %0, 31
  %1 = trunc nuw i32 %.lobit to i1
  %2 = icmp slt i32 %0, 0
  %not. = xor i1 %1, true
  %common.ret1.op = select i1 %not., i1 %2, i1 false
  store i32 %.lobit, ptr %p, align 1
  ret i1 %common.ret1.op
}
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to