Skip to content

Missed optimization: (xor (lshr i32 %0, 31), true) ? (%0 < 0) : false ==> false #142593

Open
@GINN-Imp

Description

@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

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:

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:

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
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions