1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -switch-to-lookup -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s 3; RUN: opt < %s -passes='simplifycfg<switch-to-lookup>' -S -mtriple=x86_64-unknown-linux-gnu | FileCheck %s 4 5; In the presence of "-no-jump-tables"="true", simplifycfg should not convert switches to lookup tables. 6 7define i32 @foo(i32 %c) "no-jump-tables"="true" { 8; CHECK-LABEL: @foo( 9; CHECK-NEXT: entry: 10; CHECK-NEXT: switch i32 [[C:%.*]], label [[SW_DEFAULT:%.*]] [ 11; CHECK-NEXT: i32 42, label [[RETURN:%.*]] 12; CHECK-NEXT: i32 43, label [[SW_BB1:%.*]] 13; CHECK-NEXT: i32 44, label [[SW_BB2:%.*]] 14; CHECK-NEXT: i32 45, label [[SW_BB3:%.*]] 15; CHECK-NEXT: ] 16; CHECK: sw.bb1: 17; CHECK-NEXT: br label [[RETURN]] 18; CHECK: sw.bb2: 19; CHECK-NEXT: br label [[RETURN]] 20; CHECK: sw.bb3: 21; CHECK-NEXT: br label [[RETURN]] 22; CHECK: sw.default: 23; CHECK-NEXT: br label [[RETURN]] 24; CHECK: return: 25; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 15, [[SW_DEFAULT]] ], [ -1, [[SW_BB3]] ], [ 0, [[SW_BB2]] ], [ 123, [[SW_BB1]] ], [ 55, [[ENTRY:%.*]] ] 26; CHECK-NEXT: ret i32 [[RETVAL_0]] 27; 28entry: 29 switch i32 %c, label %sw.default [ 30 i32 42, label %return 31 i32 43, label %sw.bb1 32 i32 44, label %sw.bb2 33 i32 45, label %sw.bb3 34 ] 35 36sw.bb1: br label %return 37sw.bb2: br label %return 38sw.bb3: br label %return 39sw.default: br label %return 40return: 41 %retval.0 = phi i32 [ 15, %sw.default ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] 42 ret i32 %retval.0 43} 44 45 46define i32 @bar(i32 %c) { 47; CHECK-LABEL: @bar( 48; CHECK-NEXT: entry: 49; CHECK-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub i32 [[C:%.*]], 42 50; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[SWITCH_TABLEIDX]], 4 51; CHECK-NEXT: br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]] 52; CHECK: switch.lookup: 53; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [4 x i32], ptr @switch.table.bar, i32 0, i32 [[SWITCH_TABLEIDX]] 54; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4 55; CHECK-NEXT: br label [[RETURN]] 56; CHECK: return: 57; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ 15, [[ENTRY:%.*]] ] 58; CHECK-NEXT: ret i32 [[RETVAL_0]] 59; 60entry: 61 switch i32 %c, label %sw.default [ 62 i32 42, label %return 63 i32 43, label %sw.bb1 64 i32 44, label %sw.bb2 65 i32 45, label %sw.bb3 66 ] 67 68sw.bb1: br label %return 69sw.bb2: br label %return 70sw.bb3: br label %return 71sw.default: br label %return 72return: 73 %retval.0 = phi i32 [ 15, %sw.default ], [ -1, %sw.bb3 ], [ 0, %sw.bb2 ], [ 123, %sw.bb1 ], [ 55, %entry ] 74 ret i32 %retval.0 75} 76 77