// #target: macos-x64 module foo; extern fn void printf(char*, ...); fn void main() { for (int i = 0; i < 12; i++) { switch (i) { case 1 .. 3: printf("1-3\n"); case 7 .. 277: printf("7-277 %d\n", i); case 4 .. 5: printf("4-5 %d\n", i); case 6: printf("6 %d\n", i); default: printf("Something else: %d\n", i); nextcase 5; } } for (int i = 0; i < 12; i++) { switch (i) { case 1 .. 3: printf("1-3\n"); case 4 .. 6: printf("4-6 %d\n", i); default: printf("Something else: %d\n", i); nextcase 5; } } bool x = false; switch (x) { case true: printf("Was true!\n"); case false: printf("Was false!\n"); } } /* #expect: foo.ll source_filename = "foo" target datalayout = "e-m:o-p270:32:32-p271:32 target triple = "x86_64-apple @.str = private unnamed_addr constant [5 x i8] c"1-3\0A\00", align 1 @.str.1 = private unnamed_addr constant [10 x i8] c"7-277 %d\0A\00", align 1 @.str.2 = private unnamed_addr constant [8 x i8] c"4-5 %d\0A\00", align 1 @.str.3 = private unnamed_addr constant [6 x i8] c"6 %d\0A\00", align 1 @.str.4 = private unnamed_addr constant [20 x i8] c"Something else: %d\0A\00", align 1 @.str.5 = private unnamed_addr constant [5 x i8] c"1-3\0A\00", align 1 @.str.6 = private unnamed_addr constant [8 x i8] c"4-6 %d\0A\00", align 1 @.str.7 = private unnamed_addr constant [20 x i8] c"Something else: %d\0A\00", align 1 @.str.8 = private unnamed_addr constant [11 x i8] c"Was true!\0A\00", align 1 @.str.9 = private unnamed_addr constant [12 x i8] c"Was false!\0A\00", align 1 declare void @printf(ptr, ...) #0 define void @foo.main() #0 { entry: %i = alloca i32, align 4 %switch = alloca i32, align 4 %i11 = alloca i32, align 4 %switch15 = alloca i32, align 4 %x = alloca i8, align 1 %switch23 = alloca i8, align 1 store i32 0, ptr %i, align 4 br label %loop.cond loop.cond: ; preds = %switch.exit, %entry %0 = load i32, ptr %i, align 4 %lt = icmp slt i32 %0, 12 br i1 %lt, label %loop.body, label %loop.exit loop.body: ; preds = %loop.cond %1 = load i32, ptr %i, align 4 store i32 %1, ptr %switch, align 4 br label %switch.entry switch.entry: ; preds = %loop.body %2 = load i32, ptr %switch, align 4 %le = icmp sle i32 1, %2 %ge = icmp sge i32 3, %2 %3 = and i1 %le, %ge br i1 %3, label %switch.case, label %next_if switch.case: ; preds = %switch.entry call void (ptr, ...) @printf(ptr @.str) br label %switch.exit next_if: ; preds = %switch.entry %le1 = icmp sle i32 7, %2 %ge2 = icmp sge i32 277, %2 %4 = and i1 %le1, %ge2 br i1 %4, label %switch.case3, label %next_if4 switch.case3: ; preds = %next_if %5 = load i32, ptr %i, align 4 call void (ptr, ...) @printf(ptr @.str.1, i32 %5) br label %switch.exit next_if4: ; preds = %next_if %le5 = icmp sle i32 4, %2 %ge6 = icmp sge i32 5, %2 %6 = and i1 %le5, %ge6 br i1 %6, label %switch.case7, label %next_if8 switch.case7: ; preds = %switch.default, %next_if4 %7 = load i32, ptr %i, align 4 call void (ptr, ...) @printf(ptr @.str.2, i32 %7) br label %switch.exit next_if8: ; preds = %next_if4 %eq = icmp eq i32 6, %2 br i1 %eq, label %switch.case9, label %next_if10 switch.case9: ; preds = %next_if8 %8 = load i32, ptr %i, align 4 call void (ptr, ...) @printf(ptr @.str.3, i32 %8) br label %switch.exit next_if10: ; preds = %next_if8 br label %switch.default switch.default: ; preds = %next_if10 %9 = load i32, ptr %i, align 4 call void (ptr, ...) @printf(ptr @.str.4, i32 %9) br label %switch.case7 switch.exit: ; preds = %switch.case9, %switch.case7, %switch.case3, %switch.case %10 = load i32, ptr %i, align 4 %add = add i32 %10, 1 store i32 %add, ptr %i, align 4 br label %loop.cond loop.exit: ; preds = %loop.cond store i32 0, ptr %i11, align 4 br label %loop.cond12 loop.cond12: ; preds = %switch.exit20, %loop.exit %11 = load i32, ptr %i11, align 4 %lt13 = icmp slt i32 %11, 12 br i1 %lt13, label %loop.body14, label %loop.exit22 loop.body14: ; preds = %loop.cond12 %12 = load i32, ptr %i11, align 4 store i32 %12, ptr %switch15, align 4 br label %switch.entry16 switch.entry16: ; preds = %loop.body14 %13 = load i32, ptr %switch15, align 4 switch i32 %13, label %switch.default19 [ i32 1, label %switch.case17 i32 2, label %switch.case17 i32 3, label %switch.case17 i32 4, label %switch.case18 i32 5, label %switch.case18 i32 6, label %switch.case18 ] switch.case17: ; preds = %switch.entry16, %switch.entry16, %switch.entry16 call void (ptr, ...) @printf(ptr @.str.5) br label %switch.exit20 switch.case18: ; preds = %switch.default19, %switch.entry16, %switch.entry16, %switch.entry16 %14 = load i32, ptr %i11, align 4 call void (ptr, ...) @printf(ptr @.str.6, i32 %14) br label %switch.exit20 switch.default19: ; preds = %switch.entry16 %15 = load i32, ptr %i11, align 4 call void (ptr, ...) @printf(ptr @.str.7, i32 %15) br label %switch.case18 switch.exit20: ; preds = %switch.case18, %switch.case17 %16 = load i32, ptr %i11, align 4 %add21 = add i32 %16, 1 store i32 %add21, ptr %i11, align 4 br label %loop.cond12 loop.exit22: ; preds = %loop.cond12 store i8 0, ptr %x, align 1 %17 = load i8, ptr %x, align 1 store i8 %17, ptr %switch23, align 1 br label %switch.entry24 switch.entry24: ; preds = %loop.exit22 %18 = load i8, ptr %switch23, align 1 %19 = trunc i8 %18 to i1 %eq25 = icmp eq i1 true, %19 br i1 %eq25, label %switch.case26, label %next_if27 switch.case26: ; preds = %switch.entry24 call void (ptr, ...) @printf(ptr @.str.8) br label %switch.exit31 next_if27: ; preds = %switch.entry24 %eq28 = icmp eq i1 false, %19 br i1 %eq28, label %switch.case29, label %next_if30 switch.case29: ; preds = %next_if27 call void (ptr, ...) @printf(ptr @.str.9) br label %switch.exit31 next_if30: ; preds = %next_if27 br label %switch.exit31 switch.exit31: ; preds = %next_if30, %switch.case29, %switch.case26 ret void } define i32 @main(i32 %0, ptr %1) #0 { entry: call void @foo.main() ret i32 0 }