543 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -O3 -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \3; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names \4; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s5; RUN: llc -O3 -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \6; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names \7; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-BE8; RUN: llc -O3 -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \9; RUN: -mcpu=future -ppc-asm-full-reg-names \10; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-WACC11; RUN: llc -O3 -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \12; RUN: -mcpu=future -ppc-asm-full-reg-names \13; RUN: -ppc-vsr-nums-as-vr < %s | FileCheck %s --check-prefix=CHECK-BE-WACC14 15declare <256 x i1> @llvm.ppc.vsx.assemble.pair(<16 x i8>, <16 x i8>)16declare <512 x i1> @llvm.ppc.mma.xxsetaccz()17declare <512 x i1> @llvm.ppc.mma.xvf64gerpp(<512 x i1>, <256 x i1>, <16 x i8>)18declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.ppc.mma.disassemble.acc(<512 x i1>)19define void @testPHI1(ptr %Dst, ptr %Src, i32 signext %Len) {20; CHECK-LABEL: testPHI1:21; CHECK: # %bb.0: # %entry22; CHECK-NEXT: xxsetaccz acc023; CHECK-NEXT: cmpwi r5, 324; CHECK-NEXT: blt cr0, .LBB0_325; CHECK-NEXT: # %bb.1: # %for.body.preheader26; CHECK-NEXT: lxv v2, 0(r4)27; CHECK-NEXT: lxv v3, 16(r4)28; CHECK-NEXT: clrldi r5, r5, 3229; CHECK-NEXT: addi r4, r4, 3230; CHECK-NEXT: addi r5, r5, -231; CHECK-NEXT: mtctr r532; CHECK-NEXT: .p2align 433; CHECK-NEXT: .LBB0_2: # %for.body34; CHECK-NEXT: #35; CHECK-NEXT: lxv vs4, 0(r4)36; CHECK-NEXT: addi r4, r4, 1637; CHECK-NEXT: xvf64gerpp acc0, vsp34, vs438; CHECK-NEXT: bdnz .LBB0_239; CHECK-NEXT: .LBB0_3: # %for.cond.cleanup40; CHECK-NEXT: xxmfacc acc041; CHECK-NEXT: stxv vs3, 0(r3)42; CHECK-NEXT: stxv vs2, 16(r3)43; CHECK-NEXT: stxv vs1, 32(r3)44; CHECK-NEXT: stxv vs0, 48(r3)45; CHECK-NEXT: blr46;47; CHECK-BE-LABEL: testPHI1:48; CHECK-BE: # %bb.0: # %entry49; CHECK-BE-NEXT: xxsetaccz acc050; CHECK-BE-NEXT: cmpwi r5, 351; CHECK-BE-NEXT: blt cr0, .LBB0_352; CHECK-BE-NEXT: # %bb.1: # %for.body.preheader53; CHECK-BE-NEXT: lxv v2, 0(r4)54; CHECK-BE-NEXT: lxv v3, 16(r4)55; CHECK-BE-NEXT: clrldi r5, r5, 3256; CHECK-BE-NEXT: addi r4, r4, 3257; CHECK-BE-NEXT: addi r5, r5, -258; CHECK-BE-NEXT: mtctr r559; CHECK-BE-NEXT: .p2align 460; CHECK-BE-NEXT: .LBB0_2: # %for.body61; CHECK-BE-NEXT: #62; CHECK-BE-NEXT: lxv vs4, 0(r4)63; CHECK-BE-NEXT: addi r4, r4, 1664; CHECK-BE-NEXT: xvf64gerpp acc0, vsp34, vs465; CHECK-BE-NEXT: bdnz .LBB0_266; CHECK-BE-NEXT: .LBB0_3: # %for.cond.cleanup67; CHECK-BE-NEXT: xxmfacc acc068; CHECK-BE-NEXT: stxv vs0, 0(r3)69; CHECK-BE-NEXT: stxv vs1, 16(r3)70; CHECK-BE-NEXT: stxv vs2, 32(r3)71; CHECK-BE-NEXT: stxv vs3, 48(r3)72; CHECK-BE-NEXT: blr73;74; CHECK-WACC-LABEL: testPHI1:75; CHECK-WACC: # %bb.0: # %entry76; CHECK-WACC-NEXT: cmpwi r5, 377; CHECK-WACC-NEXT: dmxxsetaccz wacc078; CHECK-WACC-NEXT: blt cr0, .LBB0_379; CHECK-WACC-NEXT: # %bb.1: # %for.body.preheader80; CHECK-WACC-NEXT: clrldi r5, r5, 3281; CHECK-WACC-NEXT: addi r5, r5, -282; CHECK-WACC-NEXT: lxv v2, 0(r4)83; CHECK-WACC-NEXT: lxv v3, 16(r4)84; CHECK-WACC-NEXT: mtctr r585; CHECK-WACC-NEXT: addi r4, r4, 3286; CHECK-WACC-NEXT: .p2align 487; CHECK-WACC-NEXT: .LBB0_2: # %for.body88; CHECK-WACC-NEXT: #89; CHECK-WACC-NEXT: lxv vs0, 0(r4)90; CHECK-WACC-NEXT: addi r4, r4, 1691; CHECK-WACC-NEXT: xvf64gerpp wacc0, vsp34, vs092; CHECK-WACC-NEXT: bdnz .LBB0_293; CHECK-WACC-NEXT: .LBB0_3: # %for.cond.cleanup94; CHECK-WACC-NEXT: dmxxextfdmr512 vsp34, vsp36, wacc0, 095; CHECK-WACC-NEXT: stxv v5, 0(r3)96; CHECK-WACC-NEXT: stxv v4, 16(r3)97; CHECK-WACC-NEXT: stxv v3, 32(r3)98; CHECK-WACC-NEXT: stxv v2, 48(r3)99; CHECK-WACC-NEXT: blr100;101; CHECK-BE-WACC-LABEL: testPHI1:102; CHECK-BE-WACC: # %bb.0: # %entry103; CHECK-BE-WACC-NEXT: cmpwi r5, 3104; CHECK-BE-WACC-NEXT: dmxxsetaccz wacc0105; CHECK-BE-WACC-NEXT: blt cr0, .LBB0_3106; CHECK-BE-WACC-NEXT: # %bb.1: # %for.body.preheader107; CHECK-BE-WACC-NEXT: clrldi r5, r5, 32108; CHECK-BE-WACC-NEXT: addi r5, r5, -2109; CHECK-BE-WACC-NEXT: lxv v2, 0(r4)110; CHECK-BE-WACC-NEXT: lxv v3, 16(r4)111; CHECK-BE-WACC-NEXT: mtctr r5112; CHECK-BE-WACC-NEXT: addi r4, r4, 32113; CHECK-BE-WACC-NEXT: .p2align 4114; CHECK-BE-WACC-NEXT: .LBB0_2: # %for.body115; CHECK-BE-WACC-NEXT: #116; CHECK-BE-WACC-NEXT: lxv vs0, 0(r4)117; CHECK-BE-WACC-NEXT: addi r4, r4, 16118; CHECK-BE-WACC-NEXT: xvf64gerpp wacc0, vsp34, vs0119; CHECK-BE-WACC-NEXT: bdnz .LBB0_2120; CHECK-BE-WACC-NEXT: .LBB0_3: # %for.cond.cleanup121; CHECK-BE-WACC-NEXT: dmxxextfdmr512 vsp34, vsp36, wacc0, 0122; CHECK-BE-WACC-NEXT: stxv v2, 0(r3)123; CHECK-BE-WACC-NEXT: stxv v3, 16(r3)124; CHECK-BE-WACC-NEXT: stxv v4, 32(r3)125; CHECK-BE-WACC-NEXT: stxv v5, 48(r3)126; CHECK-BE-WACC-NEXT: blr127entry:128 %0 = load <16 x i8>, ptr %Src, align 16129 %arrayidx1 = getelementptr inbounds <16 x i8>, ptr %Src, i64 1130 %1 = load <16 x i8>, ptr %arrayidx1, align 16131 %2 = tail call <256 x i1> @llvm.ppc.vsx.assemble.pair(<16 x i8> %0, <16 x i8> %1)132 %3 = tail call <512 x i1> @llvm.ppc.mma.xxsetaccz()133 %cmp11 = icmp sgt i32 %Len, 2134 br i1 %cmp11, label %for.body.preheader, label %for.cond.cleanup135 136for.body.preheader:137 %wide.trip.count = zext i32 %Len to i64138 br label %for.body139 140for.cond.cleanup:141 %Acc.0.lcssa = phi <512 x i1> [ %3, %entry ], [ %13, %for.body ]142 %4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.ppc.mma.disassemble.acc(<512 x i1> %Acc.0.lcssa)143 %5 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %4, 0144 store <16 x i8> %5, ptr %Dst, align 16145 %6 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %4, 1146 %7 = getelementptr inbounds <16 x i8>, ptr %Dst, i64 1147 store <16 x i8> %6, ptr %7, align 16148 %8 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %4, 2149 %9 = getelementptr inbounds <16 x i8>, ptr %Dst, i64 2150 store <16 x i8> %8, ptr %9, align 16151 %10 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %4, 3152 %11 = getelementptr inbounds <16 x i8>, ptr %Dst, i64 3153 store <16 x i8> %10, ptr %11, align 16154 ret void155 156for.body:157 %indvars.iv = phi i64 [ 2, %for.body.preheader ], [ %indvars.iv.next, %for.body ]158 %Acc.012 = phi <512 x i1> [ %3, %for.body.preheader ], [ %13, %for.body ]159 %arrayidx2 = getelementptr inbounds <16 x i8>, ptr %Src, i64 %indvars.iv160 %12 = load <16 x i8>, ptr %arrayidx2, align 16161 %13 = tail call <512 x i1> @llvm.ppc.mma.xvf64gerpp(<512 x i1> %Acc.012, <256 x i1> %2, <16 x i8> %12)162 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1163 %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count164 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body165}166 167declare <512 x i1> @llvm.ppc.mma.xvf64ger(<256 x i1>, <16 x i8>)168define dso_local void @testPHI2(ptr %Dst, ptr %Src, i32 signext %Len) {169; CHECK-LABEL: testPHI2:170; CHECK: # %bb.0: # %entry171; CHECK-NEXT: lxv v2, 0(r4)172; CHECK-NEXT: lxv v3, 16(r4)173; CHECK-NEXT: cmpwi r5, 4174; CHECK-NEXT: lxv vs4, 32(r4)175; CHECK-NEXT: xvf64ger acc0, vsp34, vs4176; CHECK-NEXT: blt cr0, .LBB1_3177; CHECK-NEXT: # %bb.1: # %for.body.preheader178; CHECK-NEXT: clrldi r5, r5, 32179; CHECK-NEXT: addi r4, r4, 48180; CHECK-NEXT: addi r5, r5, -3181; CHECK-NEXT: mtctr r5182; CHECK-NEXT: .p2align 4183; CHECK-NEXT: .LBB1_2: # %for.body184; CHECK-NEXT: #185; CHECK-NEXT: lxv vs4, 0(r4)186; CHECK-NEXT: addi r4, r4, 16187; CHECK-NEXT: xvf64gerpp acc0, vsp34, vs4188; CHECK-NEXT: bdnz .LBB1_2189; CHECK-NEXT: .LBB1_3: # %for.cond.cleanup190; CHECK-NEXT: xxmfacc acc0191; CHECK-NEXT: stxv vs3, 0(r3)192; CHECK-NEXT: stxv vs2, 16(r3)193; CHECK-NEXT: stxv vs1, 32(r3)194; CHECK-NEXT: stxv vs0, 48(r3)195; CHECK-NEXT: blr196;197; CHECK-BE-LABEL: testPHI2:198; CHECK-BE: # %bb.0: # %entry199; CHECK-BE-NEXT: lxv v2, 0(r4)200; CHECK-BE-NEXT: lxv v3, 16(r4)201; CHECK-BE-NEXT: cmpwi r5, 4202; CHECK-BE-NEXT: lxv vs4, 32(r4)203; CHECK-BE-NEXT: xvf64ger acc0, vsp34, vs4204; CHECK-BE-NEXT: blt cr0, .LBB1_3205; CHECK-BE-NEXT: # %bb.1: # %for.body.preheader206; CHECK-BE-NEXT: clrldi r5, r5, 32207; CHECK-BE-NEXT: addi r4, r4, 48208; CHECK-BE-NEXT: addi r5, r5, -3209; CHECK-BE-NEXT: mtctr r5210; CHECK-BE-NEXT: .p2align 4211; CHECK-BE-NEXT: .LBB1_2: # %for.body212; CHECK-BE-NEXT: #213; CHECK-BE-NEXT: lxv vs4, 0(r4)214; CHECK-BE-NEXT: addi r4, r4, 16215; CHECK-BE-NEXT: xvf64gerpp acc0, vsp34, vs4216; CHECK-BE-NEXT: bdnz .LBB1_2217; CHECK-BE-NEXT: .LBB1_3: # %for.cond.cleanup218; CHECK-BE-NEXT: xxmfacc acc0219; CHECK-BE-NEXT: stxv vs0, 0(r3)220; CHECK-BE-NEXT: stxv vs1, 16(r3)221; CHECK-BE-NEXT: stxv vs2, 32(r3)222; CHECK-BE-NEXT: stxv vs3, 48(r3)223; CHECK-BE-NEXT: blr224;225; CHECK-WACC-LABEL: testPHI2:226; CHECK-WACC: # %bb.0: # %entry227; CHECK-WACC-NEXT: lxv v2, 0(r4)228; CHECK-WACC-NEXT: lxv v3, 16(r4)229; CHECK-WACC-NEXT: lxv vs0, 32(r4)230; CHECK-WACC-NEXT: cmpwi r5, 4231; CHECK-WACC-NEXT: xvf64ger wacc0, vsp34, vs0232; CHECK-WACC-NEXT: blt cr0, .LBB1_3233; CHECK-WACC-NEXT: # %bb.1: # %for.body.preheader234; CHECK-WACC-NEXT: clrldi r5, r5, 32235; CHECK-WACC-NEXT: addi r5, r5, -3236; CHECK-WACC-NEXT: mtctr r5237; CHECK-WACC-NEXT: addi r4, r4, 48238; CHECK-WACC-NEXT: .p2align 4239; CHECK-WACC-NEXT: .LBB1_2: # %for.body240; CHECK-WACC-NEXT: #241; CHECK-WACC-NEXT: lxv vs0, 0(r4)242; CHECK-WACC-NEXT: addi r4, r4, 16243; CHECK-WACC-NEXT: xvf64gerpp wacc0, vsp34, vs0244; CHECK-WACC-NEXT: bdnz .LBB1_2245; CHECK-WACC-NEXT: .LBB1_3: # %for.cond.cleanup246; CHECK-WACC-NEXT: dmxxextfdmr512 vsp34, vsp36, wacc0, 0247; CHECK-WACC-NEXT: stxv v5, 0(r3)248; CHECK-WACC-NEXT: stxv v4, 16(r3)249; CHECK-WACC-NEXT: stxv v3, 32(r3)250; CHECK-WACC-NEXT: stxv v2, 48(r3)251; CHECK-WACC-NEXT: blr252;253; CHECK-BE-WACC-LABEL: testPHI2:254; CHECK-BE-WACC: # %bb.0: # %entry255; CHECK-BE-WACC-NEXT: lxv v2, 0(r4)256; CHECK-BE-WACC-NEXT: lxv v3, 16(r4)257; CHECK-BE-WACC-NEXT: lxv vs0, 32(r4)258; CHECK-BE-WACC-NEXT: cmpwi r5, 4259; CHECK-BE-WACC-NEXT: xvf64ger wacc0, vsp34, vs0260; CHECK-BE-WACC-NEXT: blt cr0, .LBB1_3261; CHECK-BE-WACC-NEXT: # %bb.1: # %for.body.preheader262; CHECK-BE-WACC-NEXT: clrldi r5, r5, 32263; CHECK-BE-WACC-NEXT: addi r5, r5, -3264; CHECK-BE-WACC-NEXT: mtctr r5265; CHECK-BE-WACC-NEXT: addi r4, r4, 48266; CHECK-BE-WACC-NEXT: .p2align 4267; CHECK-BE-WACC-NEXT: .LBB1_2: # %for.body268; CHECK-BE-WACC-NEXT: #269; CHECK-BE-WACC-NEXT: lxv vs0, 0(r4)270; CHECK-BE-WACC-NEXT: addi r4, r4, 16271; CHECK-BE-WACC-NEXT: xvf64gerpp wacc0, vsp34, vs0272; CHECK-BE-WACC-NEXT: bdnz .LBB1_2273; CHECK-BE-WACC-NEXT: .LBB1_3: # %for.cond.cleanup274; CHECK-BE-WACC-NEXT: dmxxextfdmr512 vsp34, vsp36, wacc0, 0275; CHECK-BE-WACC-NEXT: stxv v2, 0(r3)276; CHECK-BE-WACC-NEXT: stxv v3, 16(r3)277; CHECK-BE-WACC-NEXT: stxv v4, 32(r3)278; CHECK-BE-WACC-NEXT: stxv v5, 48(r3)279; CHECK-BE-WACC-NEXT: blr280entry:281 %0 = load <16 x i8>, ptr %Src, align 16282 %arrayidx1 = getelementptr inbounds <16 x i8>, ptr %Src, i64 1283 %1 = load <16 x i8>, ptr %arrayidx1, align 16284 %2 = tail call <256 x i1> @llvm.ppc.vsx.assemble.pair(<16 x i8> %0, <16 x i8> %1)285 %arrayidx2 = getelementptr inbounds <16 x i8>, ptr %Src, i64 2286 %3 = load <16 x i8>, ptr %arrayidx2, align 16287 %4 = tail call <512 x i1> @llvm.ppc.mma.xvf64ger(<256 x i1> %2, <16 x i8> %3)288 %cmp14 = icmp sgt i32 %Len, 3289 br i1 %cmp14, label %for.body.preheader, label %for.cond.cleanup290 291for.body.preheader:292 %wide.trip.count = zext i32 %Len to i64293 br label %for.body294 295for.cond.cleanup:296 %Acc.0.lcssa = phi <512 x i1> [ %4, %entry ], [ %14, %for.body ]297 %5 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.ppc.mma.disassemble.acc(<512 x i1> %Acc.0.lcssa)298 %6 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %5, 0299 store <16 x i8> %6, ptr %Dst, align 16300 %7 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %5, 1301 %8 = getelementptr inbounds <16 x i8>, ptr %Dst, i64 1302 store <16 x i8> %7, ptr %8, align 16303 %9 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %5, 2304 %10 = getelementptr inbounds <16 x i8>, ptr %Dst, i64 2305 store <16 x i8> %9, ptr %10, align 16306 %11 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %5, 3307 %12 = getelementptr inbounds <16 x i8>, ptr %Dst, i64 3308 store <16 x i8> %11, ptr %12, align 16309 ret void310 311for.body:312 %indvars.iv = phi i64 [ 3, %for.body.preheader ], [ %indvars.iv.next, %for.body ]313 %Acc.015 = phi <512 x i1> [ %4, %for.body.preheader ], [ %14, %for.body ]314 %arrayidx3 = getelementptr inbounds <16 x i8>, ptr %Src, i64 %indvars.iv315 %13 = load <16 x i8>, ptr %arrayidx3, align 16316 %14 = tail call <512 x i1> @llvm.ppc.mma.xvf64gerpp(<512 x i1> %Acc.015, <256 x i1> %2, <16 x i8> %13)317 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1318 %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count319 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body320}321 322; This test uses an unprimed accumulator PHI node with two operands: an323; implicitely defined unprimed accumulator and the unprimed result of the call324; to xvf64gerpp. The compiler should replace this PHI node by a primed325; accumulator PHI node.326define void @testImplicitDef(ptr %ptr) {327; CHECK-LABEL: testImplicitDef:328; CHECK: # %bb.0: # %label1329; CHECK-NEXT: # implicit-def: $acc0330; CHECK-NEXT: bc 12, 4*cr5+lt, .LBB2_2331; CHECK-NEXT: # %bb.1: # %label2332; CHECK-NEXT: xvf64gerpp acc0, vsp34, vs0333; CHECK-NEXT: .LBB2_2: # %label3334; CHECK-NEXT: xxmfacc acc0335; CHECK-NEXT: stxv vs0, 0(r3)336; CHECK-NEXT: blr337;338; CHECK-BE-LABEL: testImplicitDef:339; CHECK-BE: # %bb.0: # %label1340; CHECK-BE-NEXT: # implicit-def: $acc0341; CHECK-BE-NEXT: bc 12, 4*cr5+lt, .LBB2_2342; CHECK-BE-NEXT: # %bb.1: # %label2343; CHECK-BE-NEXT: xvf64gerpp acc0, vsp34, vs0344; CHECK-BE-NEXT: .LBB2_2: # %label3345; CHECK-BE-NEXT: xxmfacc acc0346; CHECK-BE-NEXT: stxv vs3, 0(r3)347; CHECK-BE-NEXT: blr348;349; CHECK-WACC-LABEL: testImplicitDef:350; CHECK-WACC: # %bb.0: # %label1351; CHECK-WACC-NEXT: # implicit-def: $wacc0352; CHECK-WACC-NEXT: bc 12, 4*cr5+lt, .LBB2_2353; CHECK-WACC-NEXT: # %bb.1: # %label2354; CHECK-WACC-NEXT: xvf64gerpp wacc0, vsp34, vs0355; CHECK-WACC-NEXT: .LBB2_2: # %label3356; CHECK-WACC-NEXT: dmxxextfdmr512 vsp34, vsp36, wacc0, 0357; CHECK-WACC-NEXT: stxv v2, 0(r3)358; CHECK-WACC-NEXT: blr359;360; CHECK-BE-WACC-LABEL: testImplicitDef:361; CHECK-BE-WACC: # %bb.0: # %label1362; CHECK-BE-WACC-NEXT: # implicit-def: $wacc0363; CHECK-BE-WACC-NEXT: bc 12, 4*cr5+lt, .LBB2_2364; CHECK-BE-WACC-NEXT: # %bb.1: # %label2365; CHECK-BE-WACC-NEXT: xvf64gerpp wacc0, vsp34, vs0366; CHECK-BE-WACC-NEXT: .LBB2_2: # %label3367; CHECK-BE-WACC-NEXT: dmxxextfdmr512 vsp34, vsp36, wacc0, 0368; CHECK-BE-WACC-NEXT: stxv v5, 0(r3)369; CHECK-BE-WACC-NEXT: blr370label1:371 br i1 undef, label %label3, label %label2372 373label2:374 %0 = call <512 x i1> @llvm.ppc.mma.xvf64gerpp(<512 x i1> undef, <256 x i1> undef, <16 x i8> undef)375 br label %label3376 377label3:378 %1 = phi <512 x i1> [ undef, %label1 ], [ %0, %label2 ]379 %2 = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.ppc.mma.disassemble.acc(<512 x i1> %1)380 %3 = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %2, 3381 store <16 x i8> %3, ptr %ptr, align 16382 ret void383}384 385; This test uses an unprimed accumulator PHI node with an unprimed accumulator386; PHI node operand. The compiler should replace these PHI nodes by primed387; accumulator PHI nodes.388declare <512 x i1> @llvm.ppc.mma.xvf32gernp(<512 x i1>, <16 x i8>, <16 x i8>)389define dso_local signext i32 @testNestedPHI(i32 signext %cond, i32 signext %count, ptr nocapture %ptr, <16 x i8> %vc) {390; CHECK-LABEL: testNestedPHI:391; CHECK: # %bb.0: # %entry392; CHECK-NEXT: cmplwi r3, 0393; CHECK-NEXT: beq cr0, .LBB3_2394; CHECK-NEXT: # %bb.1: # %if.then395; CHECK-NEXT: xvf32gernp acc0, v2, v2396; CHECK-NEXT: cmpwi r4, 1397; CHECK-NEXT: bge cr0, .LBB3_3398; CHECK-NEXT: b .LBB3_5399; CHECK-NEXT: .LBB3_2:400; CHECK-NEXT: # implicit-def: $acc0401; CHECK-NEXT: cmpwi r4, 1402; CHECK-NEXT: blt cr0, .LBB3_5403; CHECK-NEXT: .LBB3_3: # %for.body.preheader404; CHECK-NEXT: addi r3, r4, -1405; CHECK-NEXT: clrldi r3, r3, 32406; CHECK-NEXT: addi r3, r3, 1407; CHECK-NEXT: mtctr r3408; CHECK-NEXT: .p2align 4409; CHECK-NEXT: .LBB3_4: # %for.body410; CHECK-NEXT: #411; CHECK-NEXT: xvf32gernp acc0, v2, v2412; CHECK-NEXT: bdnz .LBB3_4413; CHECK-NEXT: .LBB3_5: # %for.cond.cleanup414; CHECK-NEXT: xxmfacc acc0415; CHECK-NEXT: li r3, 0416; CHECK-NEXT: stxv vs0, 48(r5)417; CHECK-NEXT: stxv vs1, 32(r5)418; CHECK-NEXT: stxv vs2, 16(r5)419; CHECK-NEXT: stxv vs3, 0(r5)420; CHECK-NEXT: blr421;422; CHECK-BE-LABEL: testNestedPHI:423; CHECK-BE: # %bb.0: # %entry424; CHECK-BE-NEXT: cmplwi r3, 0425; CHECK-BE-NEXT: beq cr0, .LBB3_2426; CHECK-BE-NEXT: # %bb.1: # %if.then427; CHECK-BE-NEXT: xvf32gernp acc0, v2, v2428; CHECK-BE-NEXT: cmpwi r4, 1429; CHECK-BE-NEXT: bge cr0, .LBB3_3430; CHECK-BE-NEXT: b .LBB3_5431; CHECK-BE-NEXT: .LBB3_2:432; CHECK-BE-NEXT: # implicit-def: $acc0433; CHECK-BE-NEXT: cmpwi r4, 1434; CHECK-BE-NEXT: blt cr0, .LBB3_5435; CHECK-BE-NEXT: .LBB3_3: # %for.body.preheader436; CHECK-BE-NEXT: addi r3, r4, -1437; CHECK-BE-NEXT: clrldi r3, r3, 32438; CHECK-BE-NEXT: addi r3, r3, 1439; CHECK-BE-NEXT: mtctr r3440; CHECK-BE-NEXT: .p2align 4441; CHECK-BE-NEXT: .LBB3_4: # %for.body442; CHECK-BE-NEXT: #443; CHECK-BE-NEXT: xvf32gernp acc0, v2, v2444; CHECK-BE-NEXT: bdnz .LBB3_4445; CHECK-BE-NEXT: .LBB3_5: # %for.cond.cleanup446; CHECK-BE-NEXT: xxmfacc acc0447; CHECK-BE-NEXT: li r3, 0448; CHECK-BE-NEXT: stxv vs1, 16(r5)449; CHECK-BE-NEXT: stxv vs0, 0(r5)450; CHECK-BE-NEXT: stxv vs3, 48(r5)451; CHECK-BE-NEXT: stxv vs2, 32(r5)452; CHECK-BE-NEXT: blr453;454; CHECK-WACC-LABEL: testNestedPHI:455; CHECK-WACC: # %bb.0: # %entry456; CHECK-WACC-NEXT: cmplwi r3, 0457; CHECK-WACC-NEXT: beq cr0, .LBB3_2458; CHECK-WACC-NEXT: # %bb.1: # %if.then459; CHECK-WACC-NEXT: xvf32gernp wacc0, v2, v2460; CHECK-WACC-NEXT: cmpwi r4, 1461; CHECK-WACC-NEXT: bge cr0, .LBB3_3462; CHECK-WACC-NEXT: b .LBB3_5463; CHECK-WACC-NEXT: .LBB3_2:464; CHECK-WACC-NEXT: # implicit-def: $wacc0465; CHECK-WACC-NEXT: cmpwi r4, 1466; CHECK-WACC-NEXT: blt cr0, .LBB3_5467; CHECK-WACC-NEXT: .LBB3_3: # %for.body.preheader468; CHECK-WACC-NEXT: addi r3, r4, -1469; CHECK-WACC-NEXT: clrldi r3, r3, 32470; CHECK-WACC-NEXT: addi r3, r3, 1471; CHECK-WACC-NEXT: mtctr r3472; CHECK-WACC-NEXT: .p2align 4473; CHECK-WACC-NEXT: .LBB3_4: # %for.body474; CHECK-WACC-NEXT: #475; CHECK-WACC-NEXT: xvf32gernp wacc0, v2, v2476; CHECK-WACC-NEXT: bdnz .LBB3_4477; CHECK-WACC-NEXT: .LBB3_5: # %for.cond.cleanup478; CHECK-WACC-NEXT: dmxxextfdmr512 vsp34, vsp36, wacc0, 0479; CHECK-WACC-NEXT: li r3, 0480; CHECK-WACC-NEXT: stxv v4, 48(r5)481; CHECK-WACC-NEXT: stxv v5, 32(r5)482; CHECK-WACC-NEXT: stxv v2, 16(r5)483; CHECK-WACC-NEXT: stxv v3, 0(r5)484; CHECK-WACC-NEXT: blr485;486; CHECK-BE-WACC-LABEL: testNestedPHI:487; CHECK-BE-WACC: # %bb.0: # %entry488; CHECK-BE-WACC-NEXT: cmplwi r3, 0489; CHECK-BE-WACC-NEXT: beq cr0, .LBB3_2490; CHECK-BE-WACC-NEXT: # %bb.1: # %if.then491; CHECK-BE-WACC-NEXT: xvf32gernp wacc0, v2, v2492; CHECK-BE-WACC-NEXT: cmpwi r4, 1493; CHECK-BE-WACC-NEXT: bge cr0, .LBB3_3494; CHECK-BE-WACC-NEXT: b .LBB3_5495; CHECK-BE-WACC-NEXT: .LBB3_2:496; CHECK-BE-WACC-NEXT: # implicit-def: $wacc0497; CHECK-BE-WACC-NEXT: cmpwi r4, 1498; CHECK-BE-WACC-NEXT: blt cr0, .LBB3_5499; CHECK-BE-WACC-NEXT: .LBB3_3: # %for.body.preheader500; CHECK-BE-WACC-NEXT: addi r3, r4, -1501; CHECK-BE-WACC-NEXT: clrldi r3, r3, 32502; CHECK-BE-WACC-NEXT: addi r3, r3, 1503; CHECK-BE-WACC-NEXT: mtctr r3504; CHECK-BE-WACC-NEXT: .p2align 4505; CHECK-BE-WACC-NEXT: .LBB3_4: # %for.body506; CHECK-BE-WACC-NEXT: #507; CHECK-BE-WACC-NEXT: xvf32gernp wacc0, v2, v2508; CHECK-BE-WACC-NEXT: bdnz .LBB3_4509; CHECK-BE-WACC-NEXT: .LBB3_5: # %for.cond.cleanup510; CHECK-BE-WACC-NEXT: dmxxextfdmr512 vsp34, vsp36, wacc0, 0511; CHECK-BE-WACC-NEXT: li r3, 0512; CHECK-BE-WACC-NEXT: stxv v5, 48(r5)513; CHECK-BE-WACC-NEXT: stxv v4, 32(r5)514; CHECK-BE-WACC-NEXT: stxv v3, 16(r5)515; CHECK-BE-WACC-NEXT: stxv v2, 0(r5)516; CHECK-BE-WACC-NEXT: blr517entry:518 %tobool.not = icmp eq i32 %cond, 0519 br i1 %tobool.not, label %if.end, label %if.then520 521if.then:522 %0 = tail call <512 x i1> @llvm.ppc.mma.xvf32gernp(<512 x i1> undef, <16 x i8> %vc, <16 x i8> %vc)523 br label %if.end524 525if.end:526 %vq.0 = phi <512 x i1> [ %0, %if.then ], [ undef, %entry ]527 %cmp9 = icmp sgt i32 %count, 0528 br i1 %cmp9, label %for.body, label %for.cond.cleanup529 530for.cond.cleanup:531 %vq.1.lcssa = phi <512 x i1> [ %vq.0, %if.end ], [ %1, %for.body ]532 store <512 x i1> %vq.1.lcssa, ptr %ptr, align 64533 ret i32 0534 535for.body:536 %i.011 = phi i32 [ %inc, %for.body ], [ 0, %if.end ]537 %vq.110 = phi <512 x i1> [ %1, %for.body ], [ %vq.0, %if.end ]538 %1 = tail call <512 x i1> @llvm.ppc.mma.xvf32gernp(<512 x i1> %vq.110, <16 x i8> %vc, <16 x i8> %vc)539 %inc = add nuw nsw i32 %i.011, 1540 %exitcond.not = icmp eq i32 %inc, %count541 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body542}543