xref: /llvm-project/llvm/test/CodeGen/LoongArch/jr-without-ra.ll (revision eeac0ffaf46cf9f9b0f680b9940cc4b68a0286d8)
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
8define 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 $s6, $zero, 3
48; CHECK-NEXT:    lu32i.d $s6, 262144
49; CHECK-NEXT:    b .LBB0_4
50; CHECK-NEXT:    .p2align 4, , 16
51; CHECK-NEXT:  .LBB0_1: # %sw.bb27.i.i
52; CHECK-NEXT:    # in Loop: Header=BB0_4 Depth=1
53; CHECK-NEXT:    ori $s8, $zero, 1
54; CHECK-NEXT:  .LBB0_2: # %if.else.i106
55; CHECK-NEXT:    # in Loop: Header=BB0_4 Depth=1
56; CHECK-NEXT:    alsl.d $s5, $s0, $s0, 3
57; CHECK-NEXT:    alsl.d $s0, $s5, $s0, 1
58; CHECK-NEXT:    add.d $s0, $t0, $s0
59; CHECK-NEXT:    ldx.bu $s8, $s0, $s8
60; CHECK-NEXT:  .LBB0_3: # %phy_tssi_get_ofdm_de.exit
61; CHECK-NEXT:    # in Loop: Header=BB0_4 Depth=1
62; CHECK-NEXT:    st.b $zero, $t5, 0
63; CHECK-NEXT:    st.b $s7, $t3, 0
64; CHECK-NEXT:    st.b $zero, $t8, 0
65; CHECK-NEXT:    st.b $zero, $t1, 0
66; CHECK-NEXT:    st.b $zero, $a1, 0
67; CHECK-NEXT:    st.b $zero, $t2, 0
68; CHECK-NEXT:    st.b $s8, $a5, 0
69; CHECK-NEXT:    ori $s0, $zero, 1
70; CHECK-NEXT:    move $s7, $a3
71; CHECK-NEXT:  .LBB0_4: # %for.body
72; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
73; CHECK-NEXT:    beqz $a4, .LBB0_9
74; CHECK-NEXT:  # %bb.5: # %calc_6g.i
75; CHECK-NEXT:    # in Loop: Header=BB0_4 Depth=1
76; CHECK-NEXT:    move $s7, $zero
77; CHECK-NEXT:    bnez $zero, .LBB0_8
78; CHECK-NEXT:  # %bb.6: # %calc_6g.i
79; CHECK-NEXT:    # in Loop: Header=BB0_4 Depth=1
80; CHECK-NEXT:    slli.d $s8, $zero, 3
81; CHECK-NEXT:    ldx.d $s8, $s8, $s1
82; CHECK-NEXT:    jr $s8
83; CHECK-NEXT:  .LBB0_7: # %sw.bb12.i.i
84; CHECK-NEXT:    # in Loop: Header=BB0_4 Depth=1
85; CHECK-NEXT:    ori $s7, $zero, 1
86; CHECK-NEXT:  .LBB0_8: # %if.else58.i
87; CHECK-NEXT:    # in Loop: Header=BB0_4 Depth=1
88; CHECK-NEXT:    ldx.bu $s7, $a6, $s7
89; CHECK-NEXT:    b .LBB0_11
90; CHECK-NEXT:    .p2align 4, , 16
91; CHECK-NEXT:  .LBB0_9: # %if.end.i
92; CHECK-NEXT:    # in Loop: Header=BB0_4 Depth=1
93; CHECK-NEXT:    andi $s7, $s7, 255
94; CHECK-NEXT:    ori $s5, $zero, 50
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 $s5, $s4, $ra
117; CHECK-NEXT:    jr $s5
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
139entry:
140  br label %for.body
141
142for.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
147if.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
154sw.bb9.i.i:
155  ret void
156
157calc_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
200sw.bb5.i125.i:
201  br label %if.else58.i
202
203sw.bb6.i124.i:
204  br label %if.else58.i
205
206sw.bb12.i.i:
207  br label %if.else58.i
208
209if.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
215phy_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
243sw.bb25.i.i:
244  br label %if.else.i106
245
246sw.bb27.i.i:
247  br label %if.else.i106
248
249if.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
255phy_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}
266