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