diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index 815a84e8c320..ff8e2382ec65 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -9896,9 +9896,10 @@ SDValue PPCTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, // to vector legalization will not be sent to the target combine. Try to // combine it here. if (SDValue NewShuffle = combineVectorShuffle(SVOp, DAG)) { - DAG.ReplaceAllUsesOfValueWith(Op, NewShuffle); Op = NewShuffle; SVOp = cast(Op); + V1 = Op.getOperand(0); + V2 = Op.getOperand(1); } EVT VT = Op.getValueType(); bool isLittleEndian = Subtarget.isLittleEndian(); diff --git a/llvm/test/CodeGen/PowerPC/canonical-merge-shuffles.ll b/llvm/test/CodeGen/PowerPC/canonical-merge-shuffles.ll index 53e48b185714..ada7c73cd9ed 100644 --- a/llvm/test/CodeGen/PowerPC/canonical-merge-shuffles.ll +++ b/llvm/test/CodeGen/PowerPC/canonical-merge-shuffles.ll @@ -375,5 +375,49 @@ entry: ret <4 x i32> %vecins1 } +define dso_local <16 x i8> @no_RAUW_in_combine_during_legalize(i32* nocapture readonly %ptr, i32 signext %offset) local_unnamed_addr #0 { +; CHECK-P8-LABEL: no_RAUW_in_combine_during_legalize: +; CHECK-P8: # %bb.0: # %entry +; CHECK-P8-NEXT: addis r5, r2, .LCPI15_0@toc@ha +; CHECK-P8-NEXT: sldi r4, r4, 2 +; CHECK-P8-NEXT: xxlxor v4, v4, v4 +; CHECK-P8-NEXT: addi r5, r5, .LCPI15_0@toc@l +; CHECK-P8-NEXT: lxsiwzx v2, r3, r4 +; CHECK-P8-NEXT: lvx v3, 0, r5 +; CHECK-P8-NEXT: vperm v2, v4, v2, v3 +; CHECK-P8-NEXT: blr +; +; CHECK-P9-LABEL: no_RAUW_in_combine_during_legalize: +; CHECK-P9: # %bb.0: # %entry +; CHECK-P9-NEXT: sldi r4, r4, 2 +; CHECK-P9-NEXT: lxsiwzx v2, r3, r4 +; CHECK-P9-NEXT: addis r3, r2, .LCPI15_0@toc@ha +; CHECK-P9-NEXT: addi r3, r3, .LCPI15_0@toc@l +; CHECK-P9-NEXT: lxvx v3, 0, r3 +; CHECK-P9-NEXT: xxlxor v4, v4, v4 +; CHECK-P9-NEXT: vperm v2, v4, v2, v3 +; CHECK-P9-NEXT: blr +; +; CHECK-NOVSX-LABEL: no_RAUW_in_combine_during_legalize: +; CHECK-NOVSX: # %bb.0: # %entry +; CHECK-NOVSX-NEXT: sldi r4, r4, 2 +; CHECK-NOVSX-NEXT: vxor v2, v2, v2 +; CHECK-NOVSX-NEXT: lwzx r3, r3, r4 +; CHECK-NOVSX-NEXT: std r3, -16(r1) +; CHECK-NOVSX-NEXT: addi r3, r1, -16 +; CHECK-NOVSX-NEXT: lvx v3, 0, r3 +; CHECK-NOVSX-NEXT: vmrglb v2, v2, v3 +; CHECK-NOVSX-NEXT: blr +entry: + %idx.ext = sext i32 %offset to i64 + %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 %idx.ext + %0 = load i32, i32* %add.ptr, align 4 + %conv = zext i32 %0 to i64 + %splat.splatinsert = insertelement <2 x i64> undef, i64 %conv, i32 0 + %1 = bitcast <2 x i64> %splat.splatinsert to <16 x i8> + %shuffle = shufflevector <16 x i8> %1, <16 x i8> , <16 x i32> + ret <16 x i8> %shuffle +} + declare double @dummy() local_unnamed_addr attributes #0 = { nounwind }