brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 9d9d93c Raw
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