Home | History | Annotate | Download | only in LowerSwitch
      1 ; RUN: opt %s -lowerswitch -S | FileCheck %s
      2 
      3 define void @foo(i32 %x, i32* %p) {
      4 ; Cases 2 and 4 are removed and become the new default case.
      5 ; It is now enough to use two icmps to lower the switch.
      6 ;
      7 ; CHECK-LABEL: @foo
      8 ; CHECK:       icmp slt i32 %x, 5
      9 ; CHECK:       icmp eq i32 %x, 1
     10 ; CHECK-NOT:   icmp
     11 ;
     12 entry:
     13   switch i32 %x, label %default [
     14     i32 1, label %bb0
     15     i32 2, label %popular
     16     i32 4, label %popular
     17     i32 5, label %bb1
     18   ]
     19 bb0:
     20   store i32 0, i32* %p
     21   br label %exit
     22 bb1:
     23   store i32 1, i32* %p
     24   br label %exit
     25 popular:
     26   store i32 2, i32* %p
     27   br label %exit
     28 exit:
     29   ret void
     30 default:
     31   unreachable
     32 }
     33 
     34 define void @unreachable_gap(i64 %x, i32* %p) {
     35 ; Cases 6 and INT64_MAX become the new default, but we still exploit the fact
     36 ; that 3-4 is unreachable, so four icmps is enough.
     37 
     38 ; CHECK-LABEL: @unreachable_gap
     39 ; CHECK:       icmp slt i64 %x, 2
     40 ; CHECK:       icmp slt i64 %x, 5
     41 ; CHECK:       icmp eq  i64 %x, 5
     42 ; CHECK:       icmp slt i64 %x, 1
     43 ; CHECK-NOT:   icmp
     44 
     45 entry:
     46   switch i64 %x, label %default [
     47     i64 -9223372036854775808, label %bb0
     48     i64 1, label %bb1
     49     i64 2, label %bb2
     50     i64 5, label %bb3
     51     i64 6, label %bb4
     52     i64 9223372036854775807, label %bb4
     53   ]
     54 bb0:
     55   store i32 0, i32* %p
     56   br label %exit
     57 bb1:
     58   store i32 1, i32* %p
     59   br label %exit
     60 bb2:
     61   store i32 2, i32* %p
     62   br label %exit
     63 bb3:
     64   store i32 3, i32* %p
     65   br label %exit
     66 bb4:
     67   store i32 4, i32* %p
     68   br label %exit
     69 exit:
     70   ret void
     71 default:
     72   unreachable
     73 }
     74 
     75 
     76 
     77 define void @nocases(i32 %x, i32* %p) {
     78 ; Don't fall over when there are no cases.
     79 ;
     80 ; CHECK-LABEL: @nocases
     81 ; CHECK-LABEL: entry
     82 ; CHECK-NEXT:  br label %default
     83 ;
     84 entry:
     85   switch i32 %x, label %default [
     86   ]
     87 default:
     88   unreachable
     89 }
     90 
     91 define void @nocasesleft(i32 %x, i32* %p) {
     92 ; Cases 2 and 4 are removed and we are left with no cases.
     93 ;
     94 ; CHECK-LABEL: @nocasesleft
     95 ; CHECK-LABEL: entry
     96 ; CHECK-NEXT:  br label %popular
     97 ;
     98 entry:
     99   switch i32 %x, label %default [
    100     i32 2, label %popular
    101     i32 4, label %popular
    102   ]
    103 popular:
    104   store i32 2, i32* %p
    105   br label %exit
    106 exit:
    107   ret void
    108 default:
    109   unreachable
    110 }
    111