1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ 3; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \ 4; RUN: FileCheck %s 5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 6; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \ 7; RUN: FileCheck %s 8 9; This test case tests spilling the CR EQ bit on Power10. On Power10, this is 10; achieved by setb %reg, %CRREG (eq bit) -> stw %reg, $FI instead of: 11; mfocrf %reg, %CRREG -> rlwinm %reg1, %reg, $SH, 0, 0 -> stw %reg1, $FI. 12 13; Without fine-grained control over clobbering individual CR bits, 14; it is difficult to produce a concise test case that will ensure a specific 15; bit of any CR field is spilled. We need to test the spilling of a CR bit 16; other than the LT bit. Hence this test case is rather complex. 17 18%0 = type { i32, ptr, ptr, [1 x i8], ptr, ptr, ptr, ptr, i64, i32, [20 x i8] } 19%1 = type { ptr, ptr, i32 } 20%2 = type { [200 x i8], [200 x i8], ptr, ptr, ptr, ptr, ptr, ptr, ptr, i64 } 21%3 = type { i64, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i64, i32, i32 } 22%4 = type { i32, i64, ptr, ptr, i16, ptr, ptr, i64, i64 } 23 24define dso_local double @P10_Spill_CR_EQ(ptr %arg) local_unnamed_addr #0 { 25; CHECK-LABEL: P10_Spill_CR_EQ: 26; CHECK: # %bb.0: # %bb 27; CHECK-NEXT: ld r3, 0(r3) 28; CHECK-NEXT: ld r4, 0(0) 29; CHECK-NEXT: cmpdi r3, 0 30; CHECK-NEXT: ld r5, 56(0) 31; CHECK-NEXT: cmpdi cr1, r4, 0 32; CHECK-NEXT: cmpdi cr5, r5, 0 33; CHECK-NEXT: cmpldi cr6, r3, 0 34; CHECK-NEXT: beq cr6, .LBB0_3 35; CHECK-NEXT: # %bb.1: # %bb10 36; CHECK-NEXT: lwz r3, 0(r3) 37; CHECK-NEXT: bc 12, 4*cr1+eq, .LBB0_4 38; CHECK-NEXT: .LBB0_2: # %bb14 39; CHECK-NEXT: lwz r5, 0(r3) 40; CHECK-NEXT: b .LBB0_5 41; CHECK-NEXT: .LBB0_3: 42; CHECK-NEXT: # implicit-def: $r3 43; CHECK-NEXT: bc 4, 4*cr1+eq, .LBB0_2 44; CHECK-NEXT: .LBB0_4: 45; CHECK-NEXT: # implicit-def: $r5 46; CHECK-NEXT: .LBB0_5: # %bb16 47; CHECK-NEXT: crnot 4*cr1+lt, eq 48; CHECK-NEXT: crnot 4*cr5+un, 4*cr5+eq 49; CHECK-NEXT: bc 12, 4*cr5+eq, .LBB0_7 50; CHECK-NEXT: # %bb.6: # %bb18 51; CHECK-NEXT: lwz r4, 0(r3) 52; CHECK-NEXT: b .LBB0_8 53; CHECK-NEXT: .LBB0_7: 54; CHECK-NEXT: # implicit-def: $r4 55; CHECK-NEXT: .LBB0_8: # %bb20 56; CHECK-NEXT: mfcr r12 57; CHECK-NEXT: cmpwi cr2, r3, -1 58; CHECK-NEXT: cmpwi cr3, r4, -1 59; CHECK-NEXT: stw r12, 8(r1) 60; CHECK-NEXT: cmpwi cr7, r3, 0 61; CHECK-NEXT: cmpwi cr6, r4, 0 62; CHECK-NEXT: crand 4*cr5+gt, 4*cr2+gt, 4*cr1+lt 63; CHECK-NEXT: crand 4*cr5+lt, 4*cr3+gt, 4*cr5+un 64; CHECK-NEXT: # implicit-def: $x3 65; CHECK-NEXT: bc 4, 4*cr5+gt, .LBB0_10 66; CHECK-NEXT: # %bb.9: # %bb34 67; CHECK-NEXT: ld r3, 0(r3) 68; CHECK-NEXT: .LBB0_10: # %bb36 69; CHECK-NEXT: cmpwi cr2, r5, 0 70; CHECK-NEXT: # implicit-def: $x4 71; CHECK-NEXT: bc 4, 4*cr5+lt, .LBB0_12 72; CHECK-NEXT: # %bb.11: # %bb38 73; CHECK-NEXT: ld r4, 0(r3) 74; CHECK-NEXT: .LBB0_12: # %bb40 75; CHECK-NEXT: crand 4*cr6+gt, 4*cr7+lt, 4*cr1+lt 76; CHECK-NEXT: crand 4*cr6+lt, 4*cr6+lt, 4*cr5+un 77; CHECK-NEXT: crnot 4*cr6+un, 4*cr1+eq 78; CHECK-NEXT: # implicit-def: $x6 79; CHECK-NEXT: bc 4, 4*cr6+lt, .LBB0_14 80; CHECK-NEXT: # %bb.13: # %bb48 81; CHECK-NEXT: ld r6, 0(r3) 82; CHECK-NEXT: .LBB0_14: # %bb50 83; CHECK-NEXT: cmpwi cr3, r5, -1 84; CHECK-NEXT: crand 4*cr7+lt, 4*cr2+lt, 4*cr6+un 85; CHECK-NEXT: # implicit-def: $r5 86; CHECK-NEXT: bc 4, 4*cr6+gt, .LBB0_16 87; CHECK-NEXT: # %bb.15: # %bb52 88; CHECK-NEXT: lwz r5, 0(r3) 89; CHECK-NEXT: .LBB0_16: # %bb54 90; CHECK-NEXT: mfocrf r7, 128 91; CHECK-NEXT: stw r7, -4(r1) 92; CHECK-NEXT: # implicit-def: $r7 93; CHECK-NEXT: bc 4, 4*cr7+lt, .LBB0_18 94; CHECK-NEXT: # %bb.17: # %bb56 95; CHECK-NEXT: lwz r7, 0(r3) 96; CHECK-NEXT: .LBB0_18: # %bb58 97; CHECK-NEXT: lwz r6, 92(r6) 98; CHECK-NEXT: crand 4*cr7+un, 4*cr3+gt, 4*cr6+un 99; CHECK-NEXT: cmpwi cr3, r5, 1 100; CHECK-NEXT: cmpwi cr4, r7, 1 101; CHECK-NEXT: crand 4*cr7+gt, 4*cr7+eq, 4*cr1+lt 102; CHECK-NEXT: # implicit-def: $x5 103; CHECK-NEXT: crand 4*cr6+un, 4*cr2+eq, 4*cr6+un 104; CHECK-NEXT: crand 4*cr5+un, 4*cr6+eq, 4*cr5+un 105; CHECK-NEXT: crand 4*cr6+gt, 4*cr3+lt, 4*cr6+gt 106; CHECK-NEXT: crand 4*cr7+lt, 4*cr4+lt, 4*cr7+lt 107; CHECK-NEXT: cmpwi r6, 1 108; CHECK-NEXT: crand 4*cr6+lt, lt, 4*cr6+lt 109; CHECK-NEXT: bc 4, 4*cr6+gt, .LBB0_20 110; CHECK-NEXT: # %bb.19: # %bb68 111; CHECK-NEXT: ld r5, 0(r3) 112; CHECK-NEXT: .LBB0_20: # %bb70 113; CHECK-NEXT: ld r6, 0(r3) 114; CHECK-NEXT: lwz r9, -4(r1) 115; CHECK-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr7+eq 116; CHECK-NEXT: crandc 4*cr7+eq, 4*cr7+un, 4*cr2+eq 117; CHECK-NEXT: crandc 4*cr5+lt, 4*cr5+lt, 4*cr6+eq 118; CHECK-NEXT: setbc r7, 4*cr6+un 119; CHECK-NEXT: setbc r8, 4*cr5+un 120; CHECK-NEXT: lwz r12, 8(r1) 121; CHECK-NEXT: xxlxor f2, f2, f2 122; CHECK-NEXT: isel r3, r3, r5, 4*cr5+gt 123; CHECK-NEXT: setbc r5, 4*cr7+gt 124; CHECK-NEXT: crnor 4*cr5+gt, 4*cr6+gt, 4*cr5+gt 125; CHECK-NEXT: crnor 4*cr6+gt, 4*cr7+lt, 4*cr7+eq 126; CHECK-NEXT: crnor 4*cr5+lt, 4*cr6+lt, 4*cr5+lt 127; CHECK-NEXT: add r5, r7, r5 128; CHECK-NEXT: add r5, r8, r5 129; CHECK-NEXT: isel r3, 0, r3, 4*cr5+gt 130; CHECK-NEXT: isel r4, 0, r4, 4*cr5+lt 131; CHECK-NEXT: isel r6, 0, r6, 4*cr6+gt 132; CHECK-NEXT: mtocrf 128, r9 133; CHECK-NEXT: mtfprd f0, r5 134; CHECK-NEXT: isel r4, 0, r4, 4*cr5+eq 135; CHECK-NEXT: mtocrf 32, r12 136; CHECK-NEXT: mtocrf 16, r12 137; CHECK-NEXT: mtocrf 8, r12 138; CHECK-NEXT: iseleq r3, 0, r3 139; CHECK-NEXT: isel r6, 0, r6, 4*cr1+eq 140; CHECK-NEXT: xscvsxddp f0, f0 141; CHECK-NEXT: add r3, r6, r3 142; CHECK-NEXT: add r3, r4, r3 143; CHECK-NEXT: mtfprd f1, r3 144; CHECK-NEXT: xsmuldp f0, f0, f2 145; CHECK-NEXT: xscvsxddp f1, f1 146; CHECK-NEXT: xsadddp f1, f0, f1 147; CHECK-NEXT: blr 148bb: 149 %tmp = getelementptr inbounds %4, ptr null, i64 undef, i32 7 150 %tmp1 = load i64, ptr undef, align 8 151 %tmp2 = load i64, ptr null, align 8 152 %tmp3 = load i64, ptr %tmp, align 8 153 %tmp4 = icmp eq i64 %tmp1, 0 154 %tmp5 = icmp eq i64 %tmp2, 0 155 %tmp6 = icmp eq i64 %tmp3, 0 156 %tmp7 = xor i1 %tmp4, true 157 %tmp8 = xor i1 %tmp5, true 158 %tmp9 = xor i1 %tmp6, true 159 br i1 %tmp4, label %bb12, label %bb10 160 161bb10: ; preds = %bb 162 %tmp11 = load i32, ptr undef, align 8 163 br label %bb12 164 165bb12: ; preds = %bb10, %bb 166 %tmp13 = phi i32 [ undef, %bb ], [ %tmp11, %bb10 ] 167 br i1 %tmp5, label %bb16, label %bb14 168 169bb14: ; preds = %bb12 170 %tmp15 = load i32, ptr undef, align 8 171 br label %bb16 172 173bb16: ; preds = %bb14, %bb12 174 %tmp17 = phi i32 [ undef, %bb12 ], [ %tmp15, %bb14 ] 175 br i1 %tmp6, label %bb20, label %bb18 176 177bb18: ; preds = %bb16 178 %tmp19 = load i32, ptr undef, align 8 179 br label %bb20 180 181bb20: ; preds = %bb18, %bb16 182 %tmp21 = phi i32 [ undef, %bb16 ], [ %tmp19, %bb18 ] 183 %tmp22 = icmp slt i32 %tmp13, 0 184 %tmp23 = icmp slt i32 %tmp17, 0 185 %tmp24 = icmp slt i32 %tmp21, 0 186 %tmp25 = icmp eq i32 %tmp13, 0 187 %tmp26 = icmp eq i32 %tmp17, 0 188 %tmp27 = icmp eq i32 %tmp21, 0 189 %tmp28 = xor i1 %tmp22, true 190 %tmp29 = xor i1 %tmp23, true 191 %tmp30 = xor i1 %tmp24, true 192 %tmp31 = and i1 %tmp28, %tmp7 193 %tmp32 = and i1 %tmp29, %tmp8 194 %tmp33 = and i1 %tmp30, %tmp9 195 br i1 %tmp31, label %bb34, label %bb36 196 197bb34: ; preds = %bb20 198 %tmp35 = load i64, ptr undef, align 8 199 br label %bb36 200 201bb36: ; preds = %bb34, %bb20 202 %tmp37 = phi i64 [ undef, %bb20 ], [ %tmp35, %bb34 ] 203 br i1 %tmp33, label %bb38, label %bb40 204 205bb38: ; preds = %bb36 206 %tmp39 = load i64, ptr undef, align 8 207 br label %bb40 208 209bb40: ; preds = %bb38, %bb36 210 %tmp41 = phi i64 [ undef, %bb36 ], [ %tmp39, %bb38 ] 211 %tmp42 = and i1 %tmp25, %tmp7 212 %tmp43 = and i1 %tmp26, %tmp8 213 %tmp44 = and i1 %tmp27, %tmp9 214 %tmp45 = and i1 %tmp22, %tmp7 215 %tmp46 = and i1 %tmp23, %tmp8 216 %tmp47 = and i1 %tmp24, %tmp9 217 br i1 %tmp47, label %bb48, label %bb50 218 219bb48: ; preds = %bb40 220 %tmp49 = load ptr, ptr undef, align 8 221 br label %bb50 222 223bb50: ; preds = %bb48, %bb40 224 %tmp51 = phi ptr [ undef, %bb40 ], [ %tmp49, %bb48 ] 225 br i1 %tmp45, label %bb52, label %bb54 226 227bb52: ; preds = %bb50 228 %tmp53 = load i32, ptr undef, align 8 229 br label %bb54 230 231bb54: ; preds = %bb52, %bb50 232 %tmp55 = phi i32 [ undef, %bb50 ], [ %tmp53, %bb52 ] 233 br i1 %tmp46, label %bb56, label %bb58 234 235bb56: ; preds = %bb54 236 %tmp57 = load i32, ptr undef, align 8 237 br label %bb58 238 239bb58: ; preds = %bb56, %bb54 240 %tmp59 = phi i32 [ undef, %bb54 ], [ %tmp57, %bb56 ] 241 %tmp60 = getelementptr inbounds %3, ptr %tmp51, i64 0, i32 12 242 %tmp61 = load i32, ptr %tmp60, align 8 243 %tmp62 = icmp slt i32 %tmp55, 1 244 %tmp63 = icmp slt i32 %tmp59, 1 245 %tmp64 = icmp slt i32 %tmp61, 1 246 %tmp65 = and i1 %tmp62, %tmp45 247 %tmp66 = and i1 %tmp63, %tmp46 248 %tmp67 = and i1 %tmp64, %tmp47 249 br i1 %tmp65, label %bb68, label %bb70 250 251bb68: ; preds = %bb58 252 %tmp69 = load i64, ptr undef, align 8 253 br label %bb70 254 255bb70: ; preds = %bb68, %bb58 256 %tmp71 = phi i64 [ undef, %bb58 ], [ %tmp69, %bb68 ] 257 %tmp72 = load i64, ptr undef, align 8 258 %tmp73 = xor i1 %tmp25, true 259 %tmp74 = xor i1 %tmp26, true 260 %tmp75 = xor i1 %tmp27, true 261 %tmp76 = and i1 %tmp31, %tmp73 262 %tmp77 = and i1 %tmp32, %tmp74 263 %tmp78 = and i1 %tmp33, %tmp75 264 %tmp79 = select i1 %tmp76, i64 %tmp37, i64 %tmp71 265 %tmp80 = select i1 %tmp77, i64 undef, i64 %tmp72 266 %tmp81 = select i1 %tmp78, i64 %tmp41, i64 undef 267 %tmp82 = or i1 %tmp65, %tmp76 268 %tmp83 = or i1 %tmp66, %tmp77 269 %tmp84 = or i1 %tmp67, %tmp78 270 %tmp85 = zext i1 %tmp42 to i64 271 %tmp86 = add i64 0, %tmp85 272 %tmp87 = zext i1 %tmp43 to i64 273 %tmp88 = add i64 0, %tmp87 274 %tmp89 = zext i1 %tmp44 to i64 275 %tmp90 = add i64 0, %tmp89 276 %tmp91 = select i1 %tmp82, i64 %tmp79, i64 0 277 %tmp92 = add i64 0, %tmp91 278 %tmp93 = select i1 %tmp83, i64 %tmp80, i64 0 279 %tmp94 = add i64 0, %tmp93 280 %tmp95 = select i1 %tmp84, i64 %tmp81, i64 0 281 %tmp96 = add i64 0, %tmp95 282 %tmp97 = select i1 %tmp42, i64 undef, i64 %tmp92 283 %tmp98 = select i1 %tmp43, i64 undef, i64 %tmp94 284 %tmp99 = select i1 %tmp44, i64 undef, i64 %tmp96 285 %tmp100 = select i1 %tmp4, i64 0, i64 %tmp97 286 %tmp101 = select i1 %tmp5, i64 0, i64 %tmp98 287 %tmp102 = select i1 %tmp6, i64 0, i64 %tmp99 288 %tmp103 = add i64 %tmp88, %tmp86 289 %tmp104 = add i64 %tmp90, %tmp103 290 %tmp105 = add i64 0, %tmp104 291 %tmp106 = add i64 %tmp101, %tmp100 292 %tmp107 = add i64 %tmp102, %tmp106 293 %tmp108 = add i64 0, %tmp107 294 %tmp109 = sitofp i64 %tmp105 to double 295 %tmp110 = sitofp i64 %tmp108 to double 296 %tmp111 = fmul double %tmp109, 0.000000e+00 297 %tmp112 = fadd double %tmp111, %tmp110 298 ret double %tmp112 299} 300