Skip to content

Missed optimization: Switch on truncated select result not folded for certain constants #137557

Open
@aris-bb

Description

@aris-bb
----------------------------------------
define i16 @src(i1 %cnd) {
entry:
  %sel = select i1 %cnd, i16 0, i16 3
  %trunc = trunc i16 %sel to i8
  switch i8 %trunc, label %bb_unreachable [
    i8 0, label %bb_true_path
    i8 3, label %bb_false_path
  ]

bb_false_path:
  br label %bb_merge

bb_true_path:
  br label %bb_merge

bb_unreachable:
  br label %bb_merge

bb_merge:
  %final_result = phi i16 [ %sel, %bb_unreachable ], [ 99, %bb_true_path ], [ 100, %bb_false_path ]
  ret i16 %final_result
}
=>
define i16 @tgt(i1 %cnd) {
#0:
  %switch.select = select i1 %cnd, i16 99, i16 100
  ret i16 %switch.select
}
Transformation seems to be correct!

It's worth noting that replacing the constant(s) 3 with 4 in the example enables the expected simplification.

https://godbolt.org/z/eMqa6Gs3Y
https://alive2.llvm.org/ce/z/H34-Co

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