Skip to content

Commit b3927dc

Browse files
committed
[CGP] Add test with indirectbr/blockaddr
Add llc test for IR incorporating indirectbr/blockaddr to reflect a common usage on SAP side.
1 parent bfb54e8 commit b3927dc

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
; RUN: llc %s -stop-after=codegenprepare -o - | FileCheck %s
2+
; REQUIRES: x86-registered-target
3+
4+
; CHECK: indirectbr ptr %jumpAddrLoaded, [label %returnExit]
5+
6+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
7+
target triple = "x86_64-unknown-linux-gnu"
8+
9+
; Function Attrs: noinline nounwind optnone sspreq willreturn
10+
define i64 @_sub_split_main__split0(ptr %Result, ptr %_context, ptr noalias %rc, ptr noalias %rc2, ptr %jumpAddr) #0 {
11+
_sub_split_main__split0_entry:
12+
%RC = alloca i64, align 8
13+
%RCLineNumber_l5 = alloca i32, align 4
14+
%Result_l7_c9 = alloca i32, align 4
15+
br label %_sub_split_main__split0_first
16+
17+
_sub_split_main__split0_first: ; preds = %_sub_split_main__split0_entry
18+
store i64 0, ptr %RC, align 8
19+
store i32 0, ptr %RCLineNumber_l5, align 4
20+
%value_l6_c15 = load ptr, ptr %rc, align 8
21+
%rc3 = call i64 @"RefCount~_copyctor~RefCount~Void"(ptr %rc2, ptr %value_l6_c15, ptr %_context)
22+
%rcCmp_l6 = icmp ne i64 %rc3, 0
23+
br i1 %rcCmp_l6, label %l3_chain_unwind, label %l6_rcc_ok
24+
25+
l3_chain_unwind: ; preds = %l6_rcc_ok, %_sub_split_main__split0_first
26+
%RC1 = phi i64 [ %rc3, %_sub_split_main__split0_first ], [ %rc_l7, %l6_rcc_ok ]
27+
%RCLineNumber = phi i32 [ 6, %_sub_split_main__split0_first ], [ 7, %l6_rcc_ok ]
28+
store i64 %RC1, ptr %RC, align 8
29+
store i32 %RCLineNumber, ptr %RCLineNumber_l5, align 4
30+
br label %_sub_split_main__split0_rcc_unwind_top
31+
32+
l6_rcc_ok: ; preds = %_sub_split_main__split0_first
33+
%rc_l7 = call i64 @"RefCount~rc~Int32"(ptr %Result_l7_c9, ptr %rc2)
34+
%_l7_c9 = load i32, ptr %Result_l7_c9, align 4
35+
store i32 %_l7_c9, ptr %Result, align 4
36+
store ptr blockaddress(@main, %returnExit), ptr %jumpAddr, align 8
37+
%rcCmp_l7_i1 = icmp ne i64 %rc_l7, 0
38+
br i1 %rcCmp_l7_i1, label %l3_chain_unwind, label %l7_rcc_ok
39+
40+
l7_rcc_ok: ; preds = %l6_rcc_ok
41+
br label %_sub_split_main__split0_return
42+
43+
_sub_split_main__split0_return: ; preds = %l7_rcc_ok, %_sub_split_main__split0_rcc_unwind_top
44+
%RCValue = load i64, ptr %RC, align 8
45+
ret i64 %RCValue
46+
47+
_sub_split_main__split0_rcc_unwind_top: ; preds = %l3_chain_unwind
48+
call void @stackTracePush()
49+
br label %_sub_split_main__split0_return
50+
}
51+
52+
; Function Attrs: noinline nounwind optnone sspreq willreturn
53+
define i64 @main(ptr %Result, ptr %_context) #0 {
54+
main_entry:
55+
%RC = alloca i64, align 8
56+
%RCLineNumber_l3 = alloca i32, align 4
57+
%rc_l4 = alloca ptr, align 8
58+
%rc2_l6 = alloca ptr, align 8
59+
%jmpAddr_l5_c2 = alloca ptr, align 8
60+
br label %main_first
61+
62+
main_first: ; preds = %main_entry
63+
store i64 0, ptr %RC, align 8
64+
store i32 0, ptr %RCLineNumber_l3, align 4
65+
store ptr null, ptr %rc_l4, align 8
66+
store ptr null, ptr %rc2_l6, align 8
67+
%rc_l43 = call i64 @"RefCount~_ctor~Void"(ptr %rc_l4)
68+
%rcCmp_l4_i1 = icmp ne i64 %rc_l43, 0
69+
br i1 %rcCmp_l4_i1, label %l3_chain_unwind, label %l4_rcc_ok
70+
71+
l0_chain_unwind: ; preds = %l3_chain_unwind
72+
%RC1 = phi i64 [ %RC4, %l3_chain_unwind ]
73+
%RCLineNumber = phi i32 [ %RCLineNumber5, %l3_chain_unwind ]
74+
store i64 %RC1, ptr %RC, align 8
75+
store i32 %RCLineNumber, ptr %RCLineNumber_l3, align 4
76+
br label %main_rcc_unwind_top
77+
78+
l3_chain_unwind: ; preds = %l4_rcc_ok, %main_first
79+
%RC4 = phi i64 [ %rc_l43, %main_first ], [ %rc_l5_i3, %l4_rcc_ok ]
80+
%RCLineNumber5 = phi i32 [ 4, %main_first ], [ 5, %l4_rcc_ok ]
81+
store i64 %RC4, ptr %RC, align 8
82+
store i32 %RCLineNumber5, ptr %RCLineNumber_l3, align 4
83+
%rc2_l6_unw_e = load ptr, ptr %rc2_l6, align 8
84+
call void @"RefCount~_dtor~Void"(ptr %rc2_l6_unw_e, ptr %_context)
85+
store ptr null, ptr %rc2_l6, align 8
86+
%rc_l4_unw_e = load ptr, ptr %rc_l4, align 8
87+
call void @"RefCount~_dtor~Void"(ptr %rc_l4_unw_e, ptr %_context)
88+
store ptr null, ptr %rc_l4, align 8
89+
br label %l0_chain_unwind
90+
91+
l4_rcc_ok: ; preds = %main_first
92+
store ptr blockaddress(@main, %l5_regularExit), ptr %jmpAddr_l5_c2, align 8
93+
%rc_l5_i3 = call i64 @_sub_split_main__split0(ptr %Result, ptr %_context, ptr %rc_l4, ptr %rc2_l6, ptr %jmpAddr_l5_c2)
94+
%rcCmp_l5_i4 = icmp ne i64 %rc_l5_i3, 0
95+
br i1 %rcCmp_l5_i4, label %l3_chain_unwind, label %l5_rcc_ok
96+
97+
returnExit: ; preds = %l5_rcc_ok
98+
%rc2_l6_unw_r = load ptr, ptr %rc2_l6, align 8
99+
call void @"RefCount~_dtor~Void"(ptr %rc2_l6_unw_r, ptr %_context)
100+
store ptr null, ptr %rc2_l6, align 8
101+
%rc_l4_unw_r = load ptr, ptr %rc_l4, align 8
102+
call void @"RefCount~_dtor~Void"(ptr %rc_l4_unw_r, ptr %_context)
103+
store ptr null, ptr %rc_l4, align 8
104+
br label %main_return
105+
106+
l5_regularExit: ; No predecessors!
107+
%rc2_l6_unw = load ptr, ptr %rc2_l6, align 8
108+
call void @"RefCount~_dtor~Void"(ptr %rc2_l6_unw, ptr %_context)
109+
store ptr null, ptr %rc2_l6, align 8
110+
%rc_l4_unw = load ptr, ptr %rc_l4, align 8
111+
call void @"RefCount~_dtor~Void"(ptr %rc_l4_unw, ptr %_context)
112+
store ptr null, ptr %rc_l4, align 8
113+
br label %main_return
114+
115+
l5_rcc_ok: ; preds = %l4_rcc_ok
116+
%jumpAddrLoaded = load ptr, ptr %jmpAddr_l5_c2, align 8
117+
indirectbr ptr %jumpAddrLoaded, [label %returnExit]
118+
119+
main_return: ; preds = %l5_regularExit, %returnExit, %main_rcc_unwind_top
120+
%RCValue = load i64, ptr %RC, align 8
121+
ret i64 %RCValue
122+
123+
main_rcc_unwind_top: ; preds = %l0_chain_unwind
124+
call void @stackTracePush()
125+
br label %main_return
126+
}
127+
128+
; Function Attrs: nounwind sspreq willreturn
129+
declare void @stackTracePush() #1
130+
131+
; Function Attrs: nounwind sspreq willreturn
132+
declare i64 @"RefCount~_ctor~Void"(ptr) #1
133+
134+
; Function Attrs: nounwind sspreq willreturn
135+
declare i64 @"RefCount~_copyctor~RefCount~Void"(ptr, ptr, ptr) #1
136+
137+
; Function Attrs: nounwind sspreq willreturn
138+
declare i64 @"RefCount~rc~Int32"(ptr, ptr) #1
139+
140+
; Function Attrs: nounwind sspreq willreturn
141+
declare void @"RefCount~_dtor~Void"(ptr, ptr) #1
142+
143+
attributes #0 = { noinline nounwind optnone sspreq willreturn "frame-pointer"="all" }
144+
attributes #1 = { nounwind sspreq willreturn "frame-pointer"="all" }

0 commit comments

Comments
 (0)