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