xref: /llvm-project/llvm/test/Transforms/JumpTableToSwitch/basic.ll (revision d26b43ff4f7396f79de4b099160262c750d6aba7)
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