1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2; RUN: opt %s -S -passes=inline -inline-threshold=16 -min-jump-table-entries=4 | FileCheck %s -check-prefix=LOOKUPTABLE 3; RUN: opt %s -S -passes=inline -inline-threshold=11 -min-jump-table-entries=5 | FileCheck %s -check-prefix=SWITCH 4; REQUIRES: x86-registered-target 5 6target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" 7target triple = "x86_64-unknown-linux-gnu" 8 9; The `bar1` should not be inlined since there is a default branch. 10 11define i64 @foo1(i64 %a) { 12; LOOKUPTABLE-LABEL: define i64 @foo1( 13; LOOKUPTABLE-SAME: i64 [[A:%.*]]) { 14; LOOKUPTABLE-NEXT: [[B:%.*]] = call i64 @bar1(i64 [[A]]) 15; LOOKUPTABLE-NEXT: ret i64 [[B]] 16; 17; SWITCH-LABEL: define i64 @foo1( 18; SWITCH-SAME: i64 [[A:%.*]]) { 19; SWITCH-NEXT: [[B:%.*]] = call i64 @bar1(i64 [[A]]) 20; SWITCH-NEXT: ret i64 [[B]] 21; 22 %b = call i64 @bar1(i64 %a) 23 ret i64 %b 24} 25 26; Since the default branch is undefined behavior, 27; we can inline `bar2`: https://github.com/llvm/llvm-project/issues/90929 28define i64 @foo2(i64 %a) { 29; LOOKUPTABLE-LABEL: define i64 @foo2( 30; LOOKUPTABLE-SAME: i64 [[A:%.*]]) { 31; LOOKUPTABLE-NEXT: switch i64 [[A]], label [[UNREACHABLEDEFAULT_I:%.*]] [ 32; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0_I:%.*]] 33; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2_I:%.*]] 34; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4_I:%.*]] 35; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6_I:%.*]] 36; LOOKUPTABLE-NEXT: ] 37; LOOKUPTABLE: branch_0.i: 38; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT:%.*]] 39; LOOKUPTABLE: branch_2.i: 40; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT]] 41; LOOKUPTABLE: branch_4.i: 42; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT]] 43; LOOKUPTABLE: branch_6.i: 44; LOOKUPTABLE-NEXT: br label [[BAR2_EXIT]] 45; LOOKUPTABLE: unreachabledefault.i: 46; LOOKUPTABLE-NEXT: unreachable 47; LOOKUPTABLE: bar2.exit: 48; LOOKUPTABLE-NEXT: [[B_I:%.*]] = phi i64 [ 5, [[BRANCH_0_I]] ], [ 9, [[BRANCH_2_I]] ], [ 2, [[BRANCH_4_I]] ], [ 7, [[BRANCH_6_I]] ] 49; LOOKUPTABLE-NEXT: ret i64 [[B_I]] 50; 51; SWITCH-LABEL: define i64 @foo2( 52; SWITCH-SAME: i64 [[A:%.*]]) { 53; SWITCH-NEXT: [[B_I:%.*]] = call i64 @bar2(i64 [[A]]) 54; SWITCH-NEXT: ret i64 [[B_I]] 55; 56 %b = call i64 @bar2(i64 %a) 57 ret i64 %b 58} 59 60define i64 @bar1(i64 %a) { 61; LOOKUPTABLE-LABEL: define i64 @bar1( 62; LOOKUPTABLE-SAME: i64 [[A:%.*]]) { 63; LOOKUPTABLE-NEXT: switch i64 [[A]], label [[DEFAULT_BRANCH:%.*]] [ 64; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0:%.*]] 65; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2:%.*]] 66; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4:%.*]] 67; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6:%.*]] 68; LOOKUPTABLE-NEXT: ] 69; LOOKUPTABLE: branch_0: 70; LOOKUPTABLE-NEXT: br label [[EXIT:%.*]] 71; LOOKUPTABLE: branch_2: 72; LOOKUPTABLE-NEXT: br label [[EXIT]] 73; LOOKUPTABLE: branch_4: 74; LOOKUPTABLE-NEXT: br label [[EXIT]] 75; LOOKUPTABLE: branch_6: 76; LOOKUPTABLE-NEXT: br label [[EXIT]] 77; LOOKUPTABLE: default_branch: 78; LOOKUPTABLE-NEXT: br label [[EXIT]] 79; LOOKUPTABLE: exit: 80; LOOKUPTABLE-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ], [ 3, [[DEFAULT_BRANCH]] ] 81; LOOKUPTABLE-NEXT: ret i64 [[B]] 82; 83; SWITCH-LABEL: define i64 @bar1( 84; SWITCH-SAME: i64 [[A:%.*]]) { 85; SWITCH-NEXT: switch i64 [[A]], label [[DEFAULT_BRANCH:%.*]] [ 86; SWITCH-NEXT: i64 0, label [[BRANCH_0:%.*]] 87; SWITCH-NEXT: i64 2, label [[BRANCH_2:%.*]] 88; SWITCH-NEXT: i64 4, label [[BRANCH_4:%.*]] 89; SWITCH-NEXT: i64 6, label [[BRANCH_6:%.*]] 90; SWITCH-NEXT: ] 91; SWITCH: branch_0: 92; SWITCH-NEXT: br label [[EXIT:%.*]] 93; SWITCH: branch_2: 94; SWITCH-NEXT: br label [[EXIT]] 95; SWITCH: branch_4: 96; SWITCH-NEXT: br label [[EXIT]] 97; SWITCH: branch_6: 98; SWITCH-NEXT: br label [[EXIT]] 99; SWITCH: default_branch: 100; SWITCH-NEXT: br label [[EXIT]] 101; SWITCH: exit: 102; SWITCH-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ], [ 3, [[DEFAULT_BRANCH]] ] 103; SWITCH-NEXT: ret i64 [[B]] 104; 105 switch i64 %a, label %default_branch [ 106 i64 0, label %branch_0 107 i64 2, label %branch_2 108 i64 4, label %branch_4 109 i64 6, label %branch_6 110 ] 111 112branch_0: 113 br label %exit 114 115branch_2: 116 br label %exit 117 118branch_4: 119 br label %exit 120 121branch_6: 122 br label %exit 123 124default_branch: 125 br label %exit 126 127exit: 128 %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_2 ], [ 2, %branch_4 ], [ 7, %branch_6 ], [ 3, %default_branch ] 129 ret i64 %b 130} 131 132define i64 @bar2(i64 %a) { 133; LOOKUPTABLE-LABEL: define i64 @bar2( 134; LOOKUPTABLE-SAME: i64 [[A:%.*]]) { 135; LOOKUPTABLE-NEXT: switch i64 [[A]], label [[UNREACHABLEDEFAULT:%.*]] [ 136; LOOKUPTABLE-NEXT: i64 0, label [[BRANCH_0:%.*]] 137; LOOKUPTABLE-NEXT: i64 2, label [[BRANCH_2:%.*]] 138; LOOKUPTABLE-NEXT: i64 4, label [[BRANCH_4:%.*]] 139; LOOKUPTABLE-NEXT: i64 6, label [[BRANCH_6:%.*]] 140; LOOKUPTABLE-NEXT: ] 141; LOOKUPTABLE: branch_0: 142; LOOKUPTABLE-NEXT: br label [[EXIT:%.*]] 143; LOOKUPTABLE: branch_2: 144; LOOKUPTABLE-NEXT: br label [[EXIT]] 145; LOOKUPTABLE: branch_4: 146; LOOKUPTABLE-NEXT: br label [[EXIT]] 147; LOOKUPTABLE: branch_6: 148; LOOKUPTABLE-NEXT: br label [[EXIT]] 149; LOOKUPTABLE: unreachabledefault: 150; LOOKUPTABLE-NEXT: unreachable 151; LOOKUPTABLE: exit: 152; LOOKUPTABLE-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ] 153; LOOKUPTABLE-NEXT: ret i64 [[B]] 154; 155; SWITCH-LABEL: define i64 @bar2( 156; SWITCH-SAME: i64 [[A:%.*]]) { 157; SWITCH-NEXT: switch i64 [[A]], label [[UNREACHABLEDEFAULT:%.*]] [ 158; SWITCH-NEXT: i64 0, label [[BRANCH_0:%.*]] 159; SWITCH-NEXT: i64 2, label [[BRANCH_2:%.*]] 160; SWITCH-NEXT: i64 4, label [[BRANCH_4:%.*]] 161; SWITCH-NEXT: i64 6, label [[BRANCH_6:%.*]] 162; SWITCH-NEXT: ] 163; SWITCH: branch_0: 164; SWITCH-NEXT: br label [[EXIT:%.*]] 165; SWITCH: branch_2: 166; SWITCH-NEXT: br label [[EXIT]] 167; SWITCH: branch_4: 168; SWITCH-NEXT: br label [[EXIT]] 169; SWITCH: branch_6: 170; SWITCH-NEXT: br label [[EXIT]] 171; SWITCH: unreachabledefault: 172; SWITCH-NEXT: unreachable 173; SWITCH: exit: 174; SWITCH-NEXT: [[B:%.*]] = phi i64 [ 5, [[BRANCH_0]] ], [ 9, [[BRANCH_2]] ], [ 2, [[BRANCH_4]] ], [ 7, [[BRANCH_6]] ] 175; SWITCH-NEXT: ret i64 [[B]] 176; 177 switch i64 %a, label %unreachabledefault [ 178 i64 0, label %branch_0 179 i64 2, label %branch_2 180 i64 4, label %branch_4 181 i64 6, label %branch_6 182 ] 183 184branch_0: 185 br label %exit 186 187branch_2: 188 br label %exit 189 190branch_4: 191 br label %exit 192 193branch_6: 194 br label %exit 195 196unreachabledefault: 197 unreachable 198 199exit: 200 %b = phi i64 [ 5, %branch_0 ], [ 9, %branch_2 ], [ 2, %branch_4 ], [ 7, %branch_6 ] 201 ret i64 %b 202} 203