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