diff --git a/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp b/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp --- a/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp +++ b/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp @@ -638,6 +638,19 @@ DefMI->getOperand(0).setReg(MI.getOperand(0).getReg()); LLVM_DEBUG(dbgs() << "Removing redundant splat: "); LLVM_DEBUG(MI.dump()); + } else if (Immed == 2 && + (DefOpc == PPC::VSPLTISB || DefOpc == PPC::VSPLTISH || + DefOpc == PPC::VSPLTISW)) { + // Swap of a vector splat immediate, convert to copy. + ToErase = &MI; + Simplified = true; + LLVM_DEBUG( + dbgs() + << "Optimizing swap(vspltis[b|h|w]) => copy(vspltis[b|h|w]): "); + LLVM_DEBUG(MI.dump()); + BuildMI(MBB, &MI, MI.getDebugLoc(), TII->get(PPC::COPY), + MI.getOperand(0).getReg()) + .add(MI.getOperand(1)); } break; } diff --git a/llvm/test/CodeGen/PowerPC/memset-tail.ll b/llvm/test/CodeGen/PowerPC/memset-tail.ll --- a/llvm/test/CodeGen/PowerPC/memset-tail.ll +++ b/llvm/test/CodeGen/PowerPC/memset-tail.ll @@ -192,9 +192,8 @@ ; P8-LE: # %bb.0: # %entry ; P8-LE-NEXT: vspltisb 2, 15 ; P8-LE-NEXT: li 4, 16 -; P8-LE-NEXT: xxswapd 0, 34 ; P8-LE-NEXT: stxsdx 34, 3, 4 -; P8-LE-NEXT: stxvd2x 0, 0, 3 +; P8-LE-NEXT: stxvd2x 34, 0, 3 ; P8-LE-NEXT: blr ; ; P9-LE-LABEL: memsetTailV1B8: @@ -243,9 +242,8 @@ ; P8-LE: # %bb.0: # %entry ; P8-LE-NEXT: vspltisb 2, 15 ; P8-LE-NEXT: li 4, 15 -; P8-LE-NEXT: xxswapd 0, 34 ; P8-LE-NEXT: stxsdx 34, 3, 4 -; P8-LE-NEXT: stxvd2x 0, 0, 3 +; P8-LE-NEXT: stxvd2x 34, 0, 3 ; P8-LE-NEXT: blr ; ; P9-LE-LABEL: memsetTailV1B7: @@ -296,9 +294,8 @@ ; P8-LE: # %bb.0: # %entry ; P8-LE-NEXT: vspltisb 2, 15 ; P8-LE-NEXT: li 4, 16 -; P8-LE-NEXT: xxswapd 0, 34 ; P8-LE-NEXT: stxsiwx 34, 3, 4 -; P8-LE-NEXT: stxvd2x 0, 0, 3 +; P8-LE-NEXT: stxvd2x 34, 0, 3 ; P8-LE-NEXT: blr ; ; P9-LE-LABEL: memsetTailV1B4: @@ -350,9 +347,8 @@ ; P8-LE: # %bb.0: # %entry ; P8-LE-NEXT: vspltisb 2, 15 ; P8-LE-NEXT: li 4, 15 -; P8-LE-NEXT: xxswapd 0, 34 ; P8-LE-NEXT: stxsiwx 34, 3, 4 -; P8-LE-NEXT: stxvd2x 0, 0, 3 +; P8-LE-NEXT: stxvd2x 34, 0, 3 ; P8-LE-NEXT: blr ; ; P9-LE-LABEL: memsetTailV1B3: