Skip to content

Commit 242d51a

Browse files
authored
[PowerPC] Add DMR and WACC COPY support (llvm#149129)
This patch updates PPCInstrInfo::copyPhysReg to support DMR and WACC register classes and extends the PPCVSXCopy pass to handle specific WACC copy patterns.
1 parent 319705d commit 242d51a

File tree

8 files changed

+476
-165
lines changed

8 files changed

+476
-165
lines changed

llvm/lib/Target/PowerPC/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ add_llvm_target(PowerPCCodeGen
4949
PPCTargetTransformInfo.cpp
5050
PPCTOCRegDeps.cpp
5151
PPCTLSDynamicCall.cpp
52-
PPCVSXCopy.cpp
52+
PPCVSXWACCCopy.cpp
5353
PPCReduceCRLogicals.cpp
5454
PPCVSXFMAMutate.cpp
5555
PPCVSXSwapRemoval.cpp

llvm/lib/Target/PowerPC/PPC.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class ModulePass;
3939
FunctionPass *createPPCLoopInstrFormPrepPass(PPCTargetMachine &TM);
4040
FunctionPass *createPPCTOCRegDepsPass();
4141
FunctionPass *createPPCEarlyReturnPass();
42-
FunctionPass *createPPCVSXCopyPass();
42+
FunctionPass *createPPCVSXWACCCopyPass();
4343
FunctionPass *createPPCVSXFMAMutatePass();
4444
FunctionPass *createPPCVSXSwapRemovalPass();
4545
FunctionPass *createPPCReduceCRLogicalsPass();
@@ -64,7 +64,7 @@ class ModulePass;
6464
void initializePPCLoopInstrFormPrepPass(PassRegistry&);
6565
void initializePPCTOCRegDepsPass(PassRegistry&);
6666
void initializePPCEarlyReturnPass(PassRegistry&);
67-
void initializePPCVSXCopyPass(PassRegistry&);
67+
void initializePPCVSXWACCCopyPass(PassRegistry &);
6868
void initializePPCVSXFMAMutatePass(PassRegistry&);
6969
void initializePPCVSXSwapRemovalPass(PassRegistry&);
7070
void initializePPCReduceCRLogicalsPass(PassRegistry&);

llvm/lib/Target/PowerPC/PPCInstrInfo.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "llvm/CodeGen/PseudoSourceValue.h"
3131
#include "llvm/CodeGen/RegisterClassInfo.h"
3232
#include "llvm/CodeGen/RegisterPressure.h"
33+
#include "llvm/CodeGen/RegisterScavenging.h"
3334
#include "llvm/CodeGen/ScheduleDAG.h"
3435
#include "llvm/CodeGen/SlotIndexes.h"
3536
#include "llvm/CodeGen/StackMaps.h"
@@ -1863,6 +1864,48 @@ void PPCInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
18631864
.addReg(SrcRegSub1)
18641865
.addReg(SrcRegSub1, getKillRegState(KillSrc));
18651866
return;
1867+
} else if ((PPC::WACCRCRegClass.contains(DestReg) ||
1868+
PPC::WACC_HIRCRegClass.contains(DestReg)) &&
1869+
(PPC::WACCRCRegClass.contains(SrcReg) ||
1870+
PPC::WACC_HIRCRegClass.contains(SrcReg))) {
1871+
1872+
Opc = PPC::WACCRCRegClass.contains(SrcReg) ? PPC::DMXXEXTFDMR512
1873+
: PPC::DMXXEXTFDMR512_HI;
1874+
1875+
RegScavenger RS;
1876+
RS.enterBasicBlockEnd(MBB);
1877+
RS.backward(std::next(I));
1878+
1879+
Register TmpReg1 = RS.scavengeRegisterBackwards(PPC::VSRpRCRegClass, I,
1880+
/* RestoreAfter */ false, 0,
1881+
/* AllowSpill */ false);
1882+
1883+
RS.setRegUsed(TmpReg1);
1884+
Register TmpReg2 = RS.scavengeRegisterBackwards(PPC::VSRpRCRegClass, I,
1885+
/* RestoreAfter */ false, 0,
1886+
/* AllowSpill */ false);
1887+
1888+
BuildMI(MBB, I, DL, get(Opc))
1889+
.addReg(TmpReg1, RegState::Define)
1890+
.addReg(TmpReg2, RegState::Define)
1891+
.addReg(SrcReg, getKillRegState(KillSrc));
1892+
1893+
Opc = PPC::WACCRCRegClass.contains(DestReg) ? PPC::DMXXINSTDMR512
1894+
: PPC::DMXXINSTDMR512_HI;
1895+
1896+
BuildMI(MBB, I, DL, get(Opc), DestReg)
1897+
.addReg(TmpReg1, RegState::Kill)
1898+
.addReg(TmpReg2, RegState::Kill);
1899+
1900+
return;
1901+
} else if (PPC::DMRRCRegClass.contains(DestReg) &&
1902+
PPC::DMRRCRegClass.contains(SrcReg)) {
1903+
1904+
BuildMI(MBB, I, DL, get(PPC::DMMR), DestReg)
1905+
.addReg(SrcReg, getKillRegState(KillSrc));
1906+
1907+
return;
1908+
18661909
} else
18671910
llvm_unreachable("Impossible reg-to-reg copy");
18681911

llvm/lib/Target/PowerPC/PPCTargetMachine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ LLVMInitializePowerPCTarget() {
129129
initializePPCLoopInstrFormPrepPass(PR);
130130
initializePPCTOCRegDepsPass(PR);
131131
initializePPCEarlyReturnPass(PR);
132-
initializePPCVSXCopyPass(PR);
132+
initializePPCVSXWACCCopyPass(PR);
133133
initializePPCVSXFMAMutatePass(PR);
134134
initializePPCVSXSwapRemovalPass(PR);
135135
initializePPCReduceCRLogicalsPass(PR);
@@ -528,7 +528,7 @@ bool PPCPassConfig::addInstSelector() {
528528
addPass(createPPCCTRLoopsVerify());
529529
#endif
530530

531-
addPass(createPPCVSXCopyPass());
531+
addPass(createPPCVSXWACCCopyPass());
532532
return false;
533533
}
534534

llvm/lib/Target/PowerPC/PPCVSXCopy.cpp

Lines changed: 0 additions & 159 deletions
This file was deleted.

0 commit comments

Comments
 (0)