Skip to content

[SimplifyCFG] switch on umin can be converted to use default dest #162111

@nikic

Description

@nikic

https://alive2.llvm.org/ce/z/_N6nfs

define void @src(i32 %x) {
  %min = call i32 @llvm.umin.i32(i32 %x, i32 3)
  switch i32 %min, label %unreachable [
    i32 0, label %case0
    i32 1, label %case1
    i32 2, label %case2
    i32 3, label %case3
  ]

case0:
   call void @a()
   ret void

case1:
   call void @b()
   ret void

case2:
   call void @c()
   ret void

case3:
   ret void

unreachable:
   unreachable
}

define void @tgt(i32 %x) {
  switch i32 %x, label %case3 [
    i32 0, label %case0
    i32 1, label %case1
    i32 2, label %case2
  ]

case0:
   call void @a()
   ret void

case1:
   call void @b()
   ret void

case2:
   call void @c()
   ret void

case3:
   ret void

unreachable:
   unreachable
}

declare void @a()
declare void @b()
declare void @c() 

The umin here maps "all the remaining cases" to 3 and then has an explicit case for 3. We could use the switch default instead.

(This inverse of this does seem like a reasonable backend lowering strategy though.)

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