Skip to content

Commit 2eaf507

Browse files
authored
[LoongArch] Precommit test for avoid indirect branch jumps through ra. NFC
Reviewed By: SixWeining Pull Request: #115423
1 parent ffc7fea commit 2eaf507

File tree

1 file changed

+265
-0
lines changed

1 file changed

+265
-0
lines changed
Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,265 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s
3+
4+
;; Check the `jr` instruction does not use `ra` register.
5+
;; Ensure that this function has only one `ret` instruction.
6+
;; ret = jr $ra
7+
8+
define void @jr_without_ra(ptr %rtwdev, ptr %chan, ptr %h2c, i8 %.pre, i1 %cmp.i, ptr %tssi_trim.i, i64 %indvars.iv, ptr %arrayidx14.i, i8 %0, ptr %curr_tssi_trim_de, ptr %arrayidx, ptr %switch.gep, ptr %tssi_cck, i64 %switch.load, ptr %curr_tssi_cck_de, ptr %arrayidx14, ptr %curr_tssi_cck_de_20m, ptr %tssi_trim_6g.i, i64 %indvars.iv14, ptr %tssi_mcs.i) nounwind {
9+
; CHECK-LABEL: jr_without_ra:
10+
; CHECK: # %bb.0: # %entry
11+
; CHECK-NEXT: addi.d $sp, $sp, -96
12+
; CHECK-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
13+
; CHECK-NEXT: st.d $fp, $sp, 80 # 8-byte Folded Spill
14+
; CHECK-NEXT: st.d $s0, $sp, 72 # 8-byte Folded Spill
15+
; CHECK-NEXT: st.d $s1, $sp, 64 # 8-byte Folded Spill
16+
; CHECK-NEXT: st.d $s2, $sp, 56 # 8-byte Folded Spill
17+
; CHECK-NEXT: st.d $s3, $sp, 48 # 8-byte Folded Spill
18+
; CHECK-NEXT: st.d $s4, $sp, 40 # 8-byte Folded Spill
19+
; CHECK-NEXT: st.d $s5, $sp, 32 # 8-byte Folded Spill
20+
; CHECK-NEXT: st.d $s6, $sp, 24 # 8-byte Folded Spill
21+
; CHECK-NEXT: st.d $s7, $sp, 16 # 8-byte Folded Spill
22+
; CHECK-NEXT: st.d $s8, $sp, 8 # 8-byte Folded Spill
23+
; CHECK-NEXT: move $s7, $zero
24+
; CHECK-NEXT: move $s0, $zero
25+
; CHECK-NEXT: ld.d $t0, $sp, 184
26+
; CHECK-NEXT: ld.d $s2, $sp, 176
27+
; CHECK-NEXT: ld.d $s1, $sp, 168
28+
; CHECK-NEXT: ld.d $t1, $sp, 160
29+
; CHECK-NEXT: ld.d $t2, $sp, 152
30+
; CHECK-NEXT: ld.d $t3, $sp, 144
31+
; CHECK-NEXT: ld.d $t4, $sp, 136
32+
; CHECK-NEXT: ld.d $t5, $sp, 128
33+
; CHECK-NEXT: ld.d $t6, $sp, 120
34+
; CHECK-NEXT: ld.d $t7, $sp, 112
35+
; CHECK-NEXT: ld.d $t8, $sp, 104
36+
; CHECK-NEXT: ld.d $fp, $sp, 96
37+
; CHECK-NEXT: andi $a4, $a4, 1
38+
; CHECK-NEXT: alsl.d $a6, $a6, $s1, 4
39+
; CHECK-NEXT: pcalau12i $s1, %pc_hi20(.LJTI0_0)
40+
; CHECK-NEXT: addi.d $s1, $s1, %pc_lo12(.LJTI0_0)
41+
; CHECK-NEXT: slli.d $s3, $s2, 2
42+
; CHECK-NEXT: alsl.d $s2, $s2, $s3, 1
43+
; CHECK-NEXT: add.d $s2, $t5, $s2
44+
; CHECK-NEXT: addi.w $s4, $zero, -41
45+
; CHECK-NEXT: ori $s3, $zero, 1
46+
; CHECK-NEXT: slli.d $s4, $s4, 3
47+
; CHECK-NEXT: ori $s5, $zero, 50
48+
; CHECK-NEXT: ori $s6, $zero, 3
49+
; CHECK-NEXT: lu32i.d $s6, 262144
50+
; CHECK-NEXT: b .LBB0_4
51+
; CHECK-NEXT: .p2align 4, , 16
52+
; CHECK-NEXT: .LBB0_1: # %sw.bb27.i.i
53+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
54+
; CHECK-NEXT: ori $s8, $zero, 1
55+
; CHECK-NEXT: .LBB0_2: # %if.else.i106
56+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
57+
; CHECK-NEXT: alsl.d $ra, $s0, $s0, 3
58+
; CHECK-NEXT: alsl.d $s0, $ra, $s0, 1
59+
; CHECK-NEXT: add.d $s0, $t0, $s0
60+
; CHECK-NEXT: ldx.bu $s8, $s0, $s8
61+
; CHECK-NEXT: .LBB0_3: # %phy_tssi_get_ofdm_de.exit
62+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
63+
; CHECK-NEXT: st.b $zero, $t5, 0
64+
; CHECK-NEXT: st.b $s7, $t3, 0
65+
; CHECK-NEXT: st.b $zero, $t8, 0
66+
; CHECK-NEXT: st.b $zero, $t1, 0
67+
; CHECK-NEXT: st.b $zero, $a1, 0
68+
; CHECK-NEXT: st.b $zero, $t2, 0
69+
; CHECK-NEXT: st.b $s8, $a5, 0
70+
; CHECK-NEXT: ori $s0, $zero, 1
71+
; CHECK-NEXT: move $s7, $a3
72+
; CHECK-NEXT: .LBB0_4: # %for.body
73+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
74+
; CHECK-NEXT: beqz $a4, .LBB0_9
75+
; CHECK-NEXT: # %bb.5: # %calc_6g.i
76+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
77+
; CHECK-NEXT: move $s7, $zero
78+
; CHECK-NEXT: bnez $zero, .LBB0_8
79+
; CHECK-NEXT: # %bb.6: # %calc_6g.i
80+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
81+
; CHECK-NEXT: slli.d $s8, $zero, 3
82+
; CHECK-NEXT: ldx.d $s8, $s8, $s1
83+
; CHECK-NEXT: jr $s8
84+
; CHECK-NEXT: .LBB0_7: # %sw.bb12.i.i
85+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
86+
; CHECK-NEXT: ori $s7, $zero, 1
87+
; CHECK-NEXT: .LBB0_8: # %if.else58.i
88+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
89+
; CHECK-NEXT: ldx.bu $s7, $a6, $s7
90+
; CHECK-NEXT: b .LBB0_11
91+
; CHECK-NEXT: .p2align 4, , 16
92+
; CHECK-NEXT: .LBB0_9: # %if.end.i
93+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
94+
; CHECK-NEXT: andi $s7, $s7, 255
95+
; CHECK-NEXT: bltu $s5, $s7, .LBB0_15
96+
; CHECK-NEXT: # %bb.10: # %if.end.i
97+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
98+
; CHECK-NEXT: sll.d $s7, $s3, $s7
99+
; CHECK-NEXT: and $s8, $s7, $s6
100+
; CHECK-NEXT: move $s7, $fp
101+
; CHECK-NEXT: beqz $s8, .LBB0_15
102+
; CHECK-NEXT: .LBB0_11: # %phy_tssi_get_ofdm_trim_de.exit
103+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
104+
; CHECK-NEXT: move $s8, $zero
105+
; CHECK-NEXT: st.b $zero, $t7, 0
106+
; CHECK-NEXT: ldx.b $ra, $s2, $t4
107+
; CHECK-NEXT: st.b $zero, $a2, 0
108+
; CHECK-NEXT: st.b $zero, $a7, 0
109+
; CHECK-NEXT: st.b $zero, $t6, 0
110+
; CHECK-NEXT: st.b $ra, $a0, 0
111+
; CHECK-NEXT: bnez $s3, .LBB0_13
112+
; CHECK-NEXT: # %bb.12: # %phy_tssi_get_ofdm_trim_de.exit
113+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
114+
; CHECK-NEXT: pcalau12i $ra, %pc_hi20(.LJTI0_1)
115+
; CHECK-NEXT: addi.d $ra, $ra, %pc_lo12(.LJTI0_1)
116+
; CHECK-NEXT: ldx.d $ra, $s4, $ra
117+
; CHECK-NEXT: ret
118+
; CHECK-NEXT: .LBB0_13: # %phy_tssi_get_ofdm_trim_de.exit
119+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
120+
; CHECK-NEXT: bnez $s3, .LBB0_1
121+
; CHECK-NEXT: # %bb.14: # %phy_tssi_get_ofdm_trim_de.exit
122+
; CHECK-NEXT: # in Loop: Header=BB0_4 Depth=1
123+
; CHECK-NEXT: bnez $zero, .LBB0_3
124+
; CHECK-NEXT: b .LBB0_2
125+
; CHECK-NEXT: .LBB0_15: # %sw.bb9.i.i
126+
; CHECK-NEXT: ld.d $s8, $sp, 8 # 8-byte Folded Reload
127+
; CHECK-NEXT: ld.d $s7, $sp, 16 # 8-byte Folded Reload
128+
; CHECK-NEXT: ld.d $s6, $sp, 24 # 8-byte Folded Reload
129+
; CHECK-NEXT: ld.d $s5, $sp, 32 # 8-byte Folded Reload
130+
; CHECK-NEXT: ld.d $s4, $sp, 40 # 8-byte Folded Reload
131+
; CHECK-NEXT: ld.d $s3, $sp, 48 # 8-byte Folded Reload
132+
; CHECK-NEXT: ld.d $s2, $sp, 56 # 8-byte Folded Reload
133+
; CHECK-NEXT: ld.d $s1, $sp, 64 # 8-byte Folded Reload
134+
; CHECK-NEXT: ld.d $s0, $sp, 72 # 8-byte Folded Reload
135+
; CHECK-NEXT: ld.d $fp, $sp, 80 # 8-byte Folded Reload
136+
; CHECK-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
137+
; CHECK-NEXT: addi.d $sp, $sp, 96
138+
; CHECK-NEXT: ret
139+
entry:
140+
br label %for.body
141+
142+
for.body:
143+
%1 = phi i8 [ 0, %entry ], [ %.pre, %phy_tssi_get_ofdm_de.exit ]
144+
%indvars.iv143 = phi i64 [ 0, %entry ], [ 1, %phy_tssi_get_ofdm_de.exit ]
145+
br i1 %cmp.i, label %calc_6g.i, label %if.end.i
146+
147+
if.end.i:
148+
switch i8 %1, label %sw.bb9.i.i [
149+
i8 1, label %phy_tssi_get_ofdm_trim_de.exit
150+
i8 50, label %phy_tssi_get_ofdm_trim_de.exit
151+
i8 0, label %phy_tssi_get_ofdm_trim_de.exit
152+
]
153+
154+
sw.bb9.i.i:
155+
ret void
156+
157+
calc_6g.i:
158+
switch i8 1, label %if.else58.i [
159+
i8 55, label %sw.bb5.i125.i
160+
i8 54, label %sw.bb5.i125.i
161+
i8 53, label %sw.bb5.i125.i
162+
i8 52, label %sw.bb5.i125.i
163+
i8 51, label %sw.bb5.i125.i
164+
i8 50, label %sw.bb5.i125.i
165+
i8 49, label %sw.bb5.i125.i
166+
i8 56, label %sw.bb5.i125.i
167+
i8 57, label %sw.bb5.i125.i
168+
i8 58, label %sw.bb5.i125.i
169+
i8 59, label %sw.bb5.i125.i
170+
i8 60, label %sw.bb5.i125.i
171+
i8 61, label %sw.bb5.i125.i
172+
i8 -115, label %sw.bb12.i.i
173+
i8 -116, label %sw.bb12.i.i
174+
i8 -117, label %sw.bb12.i.i
175+
i8 -118, label %sw.bb12.i.i
176+
i8 -119, label %sw.bb12.i.i
177+
i8 -120, label %sw.bb12.i.i
178+
i8 -121, label %sw.bb12.i.i
179+
i8 -122, label %sw.bb12.i.i
180+
i8 -123, label %sw.bb12.i.i
181+
i8 -124, label %sw.bb12.i.i
182+
i8 -125, label %sw.bb12.i.i
183+
i8 -126, label %sw.bb12.i.i
184+
i8 -127, label %sw.bb12.i.i
185+
i8 77, label %sw.bb6.i124.i
186+
i8 76, label %sw.bb6.i124.i
187+
i8 75, label %sw.bb6.i124.i
188+
i8 74, label %sw.bb6.i124.i
189+
i8 73, label %sw.bb6.i124.i
190+
i8 72, label %sw.bb6.i124.i
191+
i8 71, label %sw.bb6.i124.i
192+
i8 1, label %sw.bb6.i124.i
193+
i8 69, label %sw.bb6.i124.i
194+
i8 68, label %sw.bb6.i124.i
195+
i8 67, label %sw.bb6.i124.i
196+
i8 66, label %sw.bb6.i124.i
197+
i8 65, label %sw.bb6.i124.i
198+
]
199+
200+
sw.bb5.i125.i:
201+
br label %if.else58.i
202+
203+
sw.bb6.i124.i:
204+
br label %if.else58.i
205+
206+
sw.bb12.i.i:
207+
br label %if.else58.i
208+
209+
if.else58.i:
210+
%retval.0.i120.ph.i = phi i64 [ 0, %calc_6g.i ], [ 1, %sw.bb5.i125.i ], [ 1, %sw.bb6.i124.i ], [ 1, %sw.bb12.i.i ]
211+
%arrayidx63.i = getelementptr [4 x [16 x i8]], ptr %tssi_trim_6g.i, i64 0, i64 %indvars.iv, i64 %retval.0.i120.ph.i
212+
%2 = load i8, ptr %arrayidx63.i, align 1
213+
br label %phy_tssi_get_ofdm_trim_de.exit
214+
215+
phy_tssi_get_ofdm_trim_de.exit:
216+
%retval.0.i = phi i8 [ %2, %if.else58.i ], [ %0, %if.end.i ], [ %0, %if.end.i ], [ %0, %if.end.i ]
217+
store i8 0, ptr %arrayidx, align 1
218+
%arrayidx8 = getelementptr [4 x [6 x i8]], ptr %tssi_cck, i64 0, i64 %indvars.iv14, i64 %switch.load
219+
%3 = load i8, ptr %arrayidx8, align 1
220+
store i8 0, ptr %h2c, align 1
221+
store i8 0, ptr %arrayidx14.i, align 1
222+
store i8 0, ptr %switch.gep, align 1
223+
store i8 %3, ptr %rtwdev, align 1
224+
switch i8 0, label %if.else.i106 [
225+
i8 -87, label %sw.bb27.i.i
226+
i8 0, label %sw.bb27.i.i
227+
i8 -89, label %sw.bb27.i.i
228+
i8 -90, label %sw.bb27.i.i
229+
i8 -91, label %sw.bb27.i.i
230+
i8 -92, label %phy_tssi_get_ofdm_de.exit
231+
i8 -93, label %phy_tssi_get_ofdm_de.exit
232+
i8 1, label %phy_tssi_get_ofdm_de.exit
233+
i8 -95, label %sw.bb25.i.i
234+
i8 -96, label %sw.bb25.i.i
235+
i8 -97, label %sw.bb25.i.i
236+
i8 -98, label %sw.bb25.i.i
237+
i8 -99, label %sw.bb25.i.i
238+
i8 43, label %phy_tssi_get_ofdm_de.exit
239+
i8 42, label %phy_tssi_get_ofdm_de.exit
240+
i8 41, label %phy_tssi_get_ofdm_de.exit
241+
]
242+
243+
sw.bb25.i.i:
244+
br label %if.else.i106
245+
246+
sw.bb27.i.i:
247+
br label %if.else.i106
248+
249+
if.else.i106:
250+
%retval.0.i.ph.i107 = phi i64 [ 0, %phy_tssi_get_ofdm_trim_de.exit ], [ 1, %sw.bb25.i.i ], [ 1, %sw.bb27.i.i ]
251+
%arrayidx26.i109 = getelementptr [4 x [19 x i8]], ptr %tssi_mcs.i, i64 0, i64 %indvars.iv143, i64 %retval.0.i.ph.i107
252+
%4 = load i8, ptr %arrayidx26.i109, align 1
253+
br label %phy_tssi_get_ofdm_de.exit
254+
255+
phy_tssi_get_ofdm_de.exit:
256+
%retval.0.i110 = phi i8 [ %4, %if.else.i106 ], [ 0, %phy_tssi_get_ofdm_trim_de.exit ], [ 0, %phy_tssi_get_ofdm_trim_de.exit ], [ 0, %phy_tssi_get_ofdm_trim_de.exit ], [ 0, %phy_tssi_get_ofdm_trim_de.exit ], [ 0, %phy_tssi_get_ofdm_trim_de.exit ], [ 0, %phy_tssi_get_ofdm_trim_de.exit ]
257+
store i8 0, ptr %tssi_cck, align 1
258+
store i8 %retval.0.i, ptr %curr_tssi_cck_de, align 1
259+
store i8 0, ptr %curr_tssi_trim_de, align 1
260+
store i8 0, ptr %curr_tssi_cck_de_20m, align 1
261+
store i8 0, ptr %chan, align 1
262+
store i8 0, ptr %arrayidx14, align 1
263+
store i8 %retval.0.i110, ptr %tssi_trim.i, align 1
264+
br label %for.body
265+
}

0 commit comments

Comments
 (0)