111 lines · plain
1; RUN: opt %s -passes=lower-switch -S | FileCheck %s2 3define void @foo(i32 %x, ptr %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: @foo8; CHECK: icmp slt i32 %x, 59; CHECK: icmp eq i32 %x, 110; CHECK-NOT: icmp11;12entry:13 switch i32 %x, label %default [14 i32 1, label %bb015 i32 2, label %popular16 i32 4, label %popular17 i32 5, label %bb118 ]19bb0:20 store i32 0, ptr %p21 br label %exit22bb1:23 store i32 1, ptr %p24 br label %exit25popular:26 store i32 2, ptr %p27 br label %exit28exit:29 ret void30default:31 unreachable32}33 34define void @unreachable_gap(i64 %x, ptr %p) {35; Cases 6 and INT64_MAX become the new default, but we still exploit the fact36; that 3-4 is unreachable, so four icmps is enough.37 38; CHECK-LABEL: @unreachable_gap39; CHECK: icmp slt i64 %x, 240; CHECK: icmp slt i64 %x, 541; CHECK: icmp eq i64 %x, 542; CHECK: icmp slt i64 %x, 143; CHECK-NOT: icmp44 45entry:46 switch i64 %x, label %default [47 i64 -9223372036854775808, label %bb048 i64 1, label %bb149 i64 2, label %bb250 i64 5, label %bb351 i64 6, label %bb452 i64 9223372036854775807, label %bb453 ]54bb0:55 store i32 0, ptr %p56 br label %exit57bb1:58 store i32 1, ptr %p59 br label %exit60bb2:61 store i32 2, ptr %p62 br label %exit63bb3:64 store i32 3, ptr %p65 br label %exit66bb4:67 store i32 4, ptr %p68 br label %exit69exit:70 ret void71default:72 unreachable73}74 75 76 77define void @nocases(i32 %x, ptr %p) {78; Don't fall over when there are no cases.79;80; CHECK-LABEL: @nocases81; CHECK-LABEL: entry82; CHECK-NEXT: br label %default83;84entry:85 switch i32 %x, label %default [86 ]87default:88 unreachable89}90 91define void @nocasesleft(i32 %x, ptr %p) {92; Cases 2 and 4 are removed and we are left with no cases.93;94; CHECK-LABEL: @nocasesleft95; CHECK-LABEL: entry96; CHECK-NEXT: br label %popular97;98entry:99 switch i32 %x, label %default [100 i32 2, label %popular101 i32 4, label %popular102 ]103popular:104 store i32 2, ptr %p105 br label %exit106exit:107 ret void108default:109 unreachable110}111