1*d26b43ffSAlexander Shaposhnikov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*d26b43ffSAlexander Shaposhnikov; RUN: opt < %s -passes=jump-table-to-switch -verify-dom-info -S | FileCheck %s 3*d26b43ffSAlexander Shaposhnikov; RUN: opt < %s -passes=jump-table-to-switch -jump-table-to-switch-size-threshold=0 -verify-dom-info -S | FileCheck %s --check-prefix=THRESHOLD-0 4*d26b43ffSAlexander Shaposhnikov 5*d26b43ffSAlexander Shaposhnikov@func_array = constant [2 x ptr] [ptr @func0, ptr @func1] 6*d26b43ffSAlexander Shaposhnikov 7*d26b43ffSAlexander Shaposhnikovdefine i32 @func0() { 8*d26b43ffSAlexander Shaposhnikov ret i32 1 9*d26b43ffSAlexander Shaposhnikov} 10*d26b43ffSAlexander Shaposhnikov 11*d26b43ffSAlexander Shaposhnikovdefine i32 @func1() { 12*d26b43ffSAlexander Shaposhnikov ret i32 2 13*d26b43ffSAlexander Shaposhnikov} 14*d26b43ffSAlexander Shaposhnikov 15*d26b43ffSAlexander Shaposhnikovdefine i32 @function_with_jump_table(i32 %index) { 16*d26b43ffSAlexander Shaposhnikov; CHECK-LABEL: define i32 @function_with_jump_table( 17*d26b43ffSAlexander Shaposhnikov; CHECK-SAME: i32 [[INDEX:%.*]]) { 18*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]] 19*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8 20*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [ 21*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 0, label [[CALL_0:%.*]] 22*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 1, label [[CALL_1:%.*]] 23*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ] 24*d26b43ffSAlexander Shaposhnikov; CHECK: default.switch.case.unreachable: 25*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: unreachable 26*d26b43ffSAlexander Shaposhnikov; CHECK: call.0: 27*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP1:%.*]] = call i32 @func0() 28*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL:%.*]] 29*d26b43ffSAlexander Shaposhnikov; CHECK: call.1: 30*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP2:%.*]] = call i32 @func1() 31*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL]] 32*d26b43ffSAlexander Shaposhnikov; CHECK: .tail: 33*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP1]], [[CALL_0]] ], [ [[TMP2]], [[CALL_1]] ] 34*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ret i32 [[TMP3]] 35*d26b43ffSAlexander Shaposhnikov; 36*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-LABEL: define i32 @function_with_jump_table( 37*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) { 38*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]] 39*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8 40*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[RESULT:%.*]] = call i32 [[FUNC_PTR]]() 41*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: ret i32 [[RESULT]] 42*d26b43ffSAlexander Shaposhnikov; 43*d26b43ffSAlexander Shaposhnikov %gep = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 %index 44*d26b43ffSAlexander Shaposhnikov %func_ptr = load ptr, ptr %gep 45*d26b43ffSAlexander Shaposhnikov %result = call i32 %func_ptr() 46*d26b43ffSAlexander Shaposhnikov ret i32 %result 47*d26b43ffSAlexander Shaposhnikov} 48*d26b43ffSAlexander Shaposhnikov 49*d26b43ffSAlexander Shaposhnikovdefine i32 @basic_block_splitted_twice(i32 %index) { 50*d26b43ffSAlexander Shaposhnikov; CHECK-LABEL: define i32 @basic_block_splitted_twice( 51*d26b43ffSAlexander Shaposhnikov; CHECK-SAME: i32 [[INDEX:%.*]]) { 52*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]] 53*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[FUNC_PTR1:%.*]] = load ptr, ptr [[GEP1]], align 8 54*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [ 55*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 0, label [[CALL_0:%.*]] 56*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 1, label [[CALL_1:%.*]] 57*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ] 58*d26b43ffSAlexander Shaposhnikov; CHECK: default.switch.case.unreachable: 59*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: unreachable 60*d26b43ffSAlexander Shaposhnikov; CHECK: call.0: 61*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP1:%.*]] = call i32 @func0() 62*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL:%.*]] 63*d26b43ffSAlexander Shaposhnikov; CHECK: call.1: 64*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP2:%.*]] = call i32 @func1() 65*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL]] 66*d26b43ffSAlexander Shaposhnikov; CHECK: .tail: 67*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP1]], [[CALL_0]] ], [ [[TMP2]], [[CALL_1]] ] 68*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]] 69*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[FUNC_PTR2:%.*]] = load ptr, ptr [[GEP2]], align 8 70*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE1:%.*]] [ 71*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 0, label [[CALL_02:%.*]] 72*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 1, label [[CALL_13:%.*]] 73*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ] 74*d26b43ffSAlexander Shaposhnikov; CHECK: default.switch.case.unreachable1: 75*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: unreachable 76*d26b43ffSAlexander Shaposhnikov; CHECK: call.02: 77*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP4:%.*]] = call i32 @func0() 78*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL_TAIL:%.*]] 79*d26b43ffSAlexander Shaposhnikov; CHECK: call.13: 80*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP5:%.*]] = call i32 @func1() 81*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL_TAIL]] 82*d26b43ffSAlexander Shaposhnikov; CHECK: .tail.tail: 83*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP6:%.*]] = phi i32 [ [[TMP4]], [[CALL_02]] ], [ [[TMP5]], [[CALL_13]] ] 84*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[RESULT:%.*]] = add i32 [[TMP3]], [[TMP6]] 85*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ret i32 [[RESULT]] 86*d26b43ffSAlexander Shaposhnikov; 87*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-LABEL: define i32 @basic_block_splitted_twice( 88*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) { 89*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[GEP1:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]] 90*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[FUNC_PTR1:%.*]] = load ptr, ptr [[GEP1]], align 8 91*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[RESULT1:%.*]] = call i32 [[FUNC_PTR1]]() 92*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[GEP2:%.*]] = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 [[INDEX]] 93*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[FUNC_PTR2:%.*]] = load ptr, ptr [[GEP2]], align 8 94*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[RESULT2:%.*]] = call i32 [[FUNC_PTR2]]() 95*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[RESULT:%.*]] = add i32 [[RESULT1]], [[RESULT2]] 96*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: ret i32 [[RESULT]] 97*d26b43ffSAlexander Shaposhnikov; 98*d26b43ffSAlexander Shaposhnikov %gep1 = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 %index 99*d26b43ffSAlexander Shaposhnikov %func_ptr1 = load ptr, ptr %gep1 100*d26b43ffSAlexander Shaposhnikov %result1 = call i32 %func_ptr1() 101*d26b43ffSAlexander Shaposhnikov %gep2 = getelementptr inbounds [2 x ptr], ptr @func_array, i32 0, i32 %index 102*d26b43ffSAlexander Shaposhnikov %func_ptr2 = load ptr, ptr %gep2 103*d26b43ffSAlexander Shaposhnikov %result2 = call i32 %func_ptr2() 104*d26b43ffSAlexander Shaposhnikov %result = add i32 %result1, %result2 105*d26b43ffSAlexander Shaposhnikov ret i32 %result 106*d26b43ffSAlexander Shaposhnikov} 107*d26b43ffSAlexander Shaposhnikov 108*d26b43ffSAlexander Shaposhnikovdefine void @void_func0() { 109*d26b43ffSAlexander Shaposhnikov ret void 110*d26b43ffSAlexander Shaposhnikov} 111*d26b43ffSAlexander Shaposhnikov 112*d26b43ffSAlexander Shaposhnikovdefine void @void_func1() { 113*d26b43ffSAlexander Shaposhnikov ret void 114*d26b43ffSAlexander Shaposhnikov} 115*d26b43ffSAlexander Shaposhnikov 116*d26b43ffSAlexander Shaposhnikov@void_func_array = constant [2 x ptr] [ptr @void_func0, ptr @void_func1] 117*d26b43ffSAlexander Shaposhnikov 118*d26b43ffSAlexander Shaposhnikovdefine void @void_function_with_jump_table(i32 %index) { 119*d26b43ffSAlexander Shaposhnikov; CHECK-LABEL: define void @void_function_with_jump_table( 120*d26b43ffSAlexander Shaposhnikov; CHECK-SAME: i32 [[INDEX:%.*]]) { 121*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 [[INDEX]] 122*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8 123*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [ 124*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 0, label [[CALL_0:%.*]] 125*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 1, label [[CALL_1:%.*]] 126*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ] 127*d26b43ffSAlexander Shaposhnikov; CHECK: default.switch.case.unreachable: 128*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: unreachable 129*d26b43ffSAlexander Shaposhnikov; CHECK: call.0: 130*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: call void @void_func0() 131*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL:%.*]] 132*d26b43ffSAlexander Shaposhnikov; CHECK: call.1: 133*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: call void @void_func1() 134*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL]] 135*d26b43ffSAlexander Shaposhnikov; CHECK: .tail: 136*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ret void 137*d26b43ffSAlexander Shaposhnikov; 138*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-LABEL: define void @void_function_with_jump_table( 139*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) { 140*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 [[INDEX]] 141*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8 142*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: call void [[FUNC_PTR]]() 143*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: ret void 144*d26b43ffSAlexander Shaposhnikov; 145*d26b43ffSAlexander Shaposhnikov %gep = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 %index 146*d26b43ffSAlexander Shaposhnikov %func_ptr = load ptr, ptr %gep 147*d26b43ffSAlexander Shaposhnikov call void %func_ptr() 148*d26b43ffSAlexander Shaposhnikov ret void 149*d26b43ffSAlexander Shaposhnikov} 150*d26b43ffSAlexander Shaposhnikov 151*d26b43ffSAlexander Shaposhnikovdefine void @void_function_with_jump_table_and_call_site_attr(i32 %index) { 152*d26b43ffSAlexander Shaposhnikov; CHECK-LABEL: define void @void_function_with_jump_table_and_call_site_attr( 153*d26b43ffSAlexander Shaposhnikov; CHECK-SAME: i32 [[INDEX:%.*]]) { 154*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 [[INDEX]] 155*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8 156*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [ 157*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 0, label [[CALL_0:%.*]] 158*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 1, label [[CALL_1:%.*]] 159*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ] 160*d26b43ffSAlexander Shaposhnikov; CHECK: default.switch.case.unreachable: 161*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: unreachable 162*d26b43ffSAlexander Shaposhnikov; CHECK: call.0: 163*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: call void @void_func0() #[[ATTR0:[0-9]+]] 164*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL:%.*]] 165*d26b43ffSAlexander Shaposhnikov; CHECK: call.1: 166*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: call void @void_func1() #[[ATTR0]] 167*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL]] 168*d26b43ffSAlexander Shaposhnikov; CHECK: .tail: 169*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ret void 170*d26b43ffSAlexander Shaposhnikov; 171*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-LABEL: define void @void_function_with_jump_table_and_call_site_attr( 172*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) { 173*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 [[INDEX]] 174*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[FUNC_PTR:%.*]] = load ptr, ptr [[GEP]], align 8 175*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: call void [[FUNC_PTR]]() #[[ATTR0:[0-9]+]] 176*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: ret void 177*d26b43ffSAlexander Shaposhnikov; 178*d26b43ffSAlexander Shaposhnikov %gep = getelementptr inbounds [2 x ptr], ptr @void_func_array, i32 0, i32 %index 179*d26b43ffSAlexander Shaposhnikov %func_ptr = load ptr, ptr %gep 180*d26b43ffSAlexander Shaposhnikov call void %func_ptr() nounwind 181*d26b43ffSAlexander Shaposhnikov ret void 182*d26b43ffSAlexander Shaposhnikov} 183*d26b43ffSAlexander Shaposhnikov 184*d26b43ffSAlexander Shaposhnikov 185*d26b43ffSAlexander Shaposhnikovdefine i32 @func0_addrspace_42() addrspace(42) { 186*d26b43ffSAlexander Shaposhnikov ret i32 1 187*d26b43ffSAlexander Shaposhnikov} 188*d26b43ffSAlexander Shaposhnikov 189*d26b43ffSAlexander Shaposhnikovdefine i32 @func1_addrspace_42() addrspace(42) { 190*d26b43ffSAlexander Shaposhnikov ret i32 2 191*d26b43ffSAlexander Shaposhnikov} 192*d26b43ffSAlexander Shaposhnikov 193*d26b43ffSAlexander Shaposhnikov@func_array_addrspace_42 = addrspace(42) constant [2 x ptr addrspace(42)] [ptr addrspace(42) @func0_addrspace_42, ptr addrspace(42) @func1_addrspace_42] 194*d26b43ffSAlexander Shaposhnikov 195*d26b43ffSAlexander Shaposhnikovdefine i32 @function_with_jump_table_addrspace_42(i32 %index) addrspace(42) { 196*d26b43ffSAlexander Shaposhnikov; CHECK-LABEL: define i32 @function_with_jump_table_addrspace_42( 197*d26b43ffSAlexander Shaposhnikov; CHECK-SAME: i32 [[INDEX:%.*]]) addrspace(42) { 198*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr addrspace(42)], ptr addrspace(42) @func_array_addrspace_42, i32 0, i32 [[INDEX]] 199*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[FUNC_PTR:%.*]] = load ptr addrspace(42), ptr addrspace(42) [[GEP]], align 8 200*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: switch i32 [[INDEX]], label [[DEFAULT_SWITCH_CASE_UNREACHABLE:%.*]] [ 201*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 0, label [[CALL_0:%.*]] 202*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: i32 1, label [[CALL_1:%.*]] 203*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ] 204*d26b43ffSAlexander Shaposhnikov; CHECK: default.switch.case.unreachable: 205*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: unreachable 206*d26b43ffSAlexander Shaposhnikov; CHECK: call.0: 207*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP1:%.*]] = call addrspace(42) i32 @func0_addrspace_42() 208*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL:%.*]] 209*d26b43ffSAlexander Shaposhnikov; CHECK: call.1: 210*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP2:%.*]] = call addrspace(42) i32 @func1_addrspace_42() 211*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: br label [[DOTTAIL]] 212*d26b43ffSAlexander Shaposhnikov; CHECK: .tail: 213*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP1]], [[CALL_0]] ], [ [[TMP2]], [[CALL_1]] ] 214*d26b43ffSAlexander Shaposhnikov; CHECK-NEXT: ret i32 [[TMP3]] 215*d26b43ffSAlexander Shaposhnikov; 216*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-LABEL: define i32 @function_with_jump_table_addrspace_42( 217*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-SAME: i32 [[INDEX:%.*]]) addrspace(42) { 218*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x ptr addrspace(42)], ptr addrspace(42) @func_array_addrspace_42, i32 0, i32 [[INDEX]] 219*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[FUNC_PTR:%.*]] = load ptr addrspace(42), ptr addrspace(42) [[GEP]], align 8 220*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: [[RESULT:%.*]] = call addrspace(42) i32 [[FUNC_PTR]]() 221*d26b43ffSAlexander Shaposhnikov; THRESHOLD-0-NEXT: ret i32 [[RESULT]] 222*d26b43ffSAlexander Shaposhnikov; 223*d26b43ffSAlexander Shaposhnikov %gep = getelementptr inbounds [2 x ptr addrspace(42)], ptr addrspace(42) @func_array_addrspace_42, i32 0, i32 %index 224*d26b43ffSAlexander Shaposhnikov %func_ptr = load ptr addrspace(42), ptr addrspace(42) %gep, align 8 225*d26b43ffSAlexander Shaposhnikov %result = call addrspace(42) i32 %func_ptr() 226*d26b43ffSAlexander Shaposhnikov ret i32 %result 227*d26b43ffSAlexander Shaposhnikov} 228*d26b43ffSAlexander Shaposhnikov 229