Skip to content

Commit 639642e

Browse files
committed
Track copies by MBB
Change-Id: Icd3934749a199e29660bfb0d187f045b18f1bd7d
1 parent 678aa74 commit 639642e

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,7 +1241,7 @@ bool RewriteScheduleStage::initGCNSchedStage() {
12411241
for (auto &UseMI : DAG.MRI.use_nodbg_instructions(DefReg))
12421242
UseInstrs.push_back(&UseMI);
12431243

1244-
DenseMap<Register, MachineInstr *> NewCopies;
1244+
DenseMap<Register, DenseMap<MachineBasicBlock *, MachineInstr *>> NewCopies;
12451245
for (auto UseMI : UseInstrs) {
12461246
for (unsigned OpNo = 0; OpNo < UseMI->getNumOperands(); OpNo++) {
12471247
auto &TheOp = UseMI->getOperand(OpNo);
@@ -1256,29 +1256,32 @@ bool RewriteScheduleStage::initGCNSchedStage() {
12561256
continue;
12571257

12581258
Register DestVGPR;
1259-
if (!NewCopies.contains(DefReg)) {
1259+
if (!NewCopies.contains(DefReg) || !NewCopies[DefReg].contains(UseMI->getParent())) {
12601260
Register DestVGPR = DAG.MRI.createVirtualRegister(
12611261
SRI->getEquivalentVGPRClass(DAG.MRI.getRegClass(DefReg)));
12621262

12631263
// Insert copy near the user to avoid inserting inside loops.
1264+
// TODO insert point
12641265
MachineInstrBuilder VGPRCopy =
1265-
BuildMI(*UseMI->getParent(), UseMI->getIterator(),
1266+
BuildMI(*UseMI->getParent(), UseMI->getParent()->getFirstNonPHI(),
12661267
UseMI->getDebugLoc(), TII->get(TargetOpcode::COPY))
12671268
.addDef(DestVGPR, 0, 0)
12681269
.addUse(DefReg, 0, 0);
12691270

1270-
NewCopies[DefReg] = VGPRCopy;
1271+
NewCopies[DefReg][UseMI->getParent()] = VGPRCopy;
12711272
}
1272-
DestVGPR = NewCopies[DefReg]->getOperand(0).getReg();
1273+
DestVGPR = NewCopies[DefReg][UseMI->getParent()]->getOperand(0).getReg();
12731274
TheOp.setReg(DestVGPR);
12741275
}
12751276
}
12761277
if (NewCopies.contains(DefReg)) {
1277-
DAG.LIS->InsertMachineInstrInMaps(*NewCopies[DefReg]);
1278-
DAG.LIS->removeInterval(DefReg);
1279-
DAG.LIS->createAndComputeVirtRegInterval(DefReg);
1280-
DAG.LIS->createAndComputeVirtRegInterval(
1281-
NewCopies[DefReg]->getOperand(0).getReg());
1278+
for (auto NewCopy : NewCopies[DefReg]) {
1279+
DAG.LIS->InsertMachineInstrInMaps(*NewCopy.second);
1280+
DAG.LIS->removeInterval(DefReg);
1281+
DAG.LIS->createAndComputeVirtRegInterval(DefReg);
1282+
DAG.LIS->createAndComputeVirtRegInterval(
1283+
NewCopy.second->getOperand(0).getReg());
1284+
}
12821285
}
12831286
}
12841287

@@ -1294,7 +1297,7 @@ bool RewriteScheduleStage::initGCNSchedStage() {
12941297
for (auto &DefMI : DAG.MRI.def_instructions(Src2Reg))
12951298
DefInstrs.push_back(&DefMI);
12961299

1297-
DenseMap<Register, MachineInstr *> NewCopies;
1300+
DenseMap<Register, DenseMap<MachineBasicBlock *, MachineInstr *>> NewCopies;
12981301
for (auto DefMI : DefInstrs) {
12991302
for (unsigned OpNo = 0; OpNo < DefMI->getNumOperands(); OpNo++) {
13001303
auto &TheOp = DefMI->getOperand(OpNo);
@@ -1309,31 +1312,33 @@ bool RewriteScheduleStage::initGCNSchedStage() {
13091312
continue;
13101313

13111314
Register SrcVGPR;
1312-
if (!NewCopies.contains(Src2Reg)) {
1315+
if (!NewCopies.contains(Src2Reg) || !NewCopies[Src2Reg].contains(DefMI->getParent())) {
13131316
Register SrcVGPR = DAG.MRI.createVirtualRegister(
13141317
SRI->getEquivalentVGPRClass(DAG.MRI.getRegClass(Src2Reg)));
13151318

13161319
// Insert copy near the def to avoid inserting inside loops.
13171320
MachineInstrBuilder VGPRCopy =
1318-
BuildMI(*DefMI->getParent(), ++DefMI->getIterator(),
1321+
BuildMI(*DefMI->getParent(), DefMI->getParent()->end(),
13191322
DefMI->getDebugLoc(), TII->get(TargetOpcode::COPY))
13201323
.addDef(Src2Reg, 0, 0)
13211324
.addUse(SrcVGPR, 0, 0);
13221325

1323-
NewCopies[Src2Reg] = VGPRCopy;
1326+
NewCopies[Src2Reg][DefMI->getParent()] = VGPRCopy;
13241327
}
13251328

1326-
SrcVGPR = NewCopies[Src2Reg]->getOperand(1).getReg();
1329+
SrcVGPR = NewCopies[Src2Reg][DefMI->getParent()]->getOperand(1).getReg();
13271330
TheOp.setReg(SrcVGPR);
13281331
}
13291332
}
13301333

13311334
if (NewCopies.contains(Src2Reg)) {
1332-
DAG.LIS->InsertMachineInstrInMaps(*NewCopies[Src2Reg]);
1333-
DAG.LIS->removeInterval(Src2Reg);
1334-
DAG.LIS->createAndComputeVirtRegInterval(Src2Reg);
1335-
DAG.LIS->createAndComputeVirtRegInterval(
1336-
NewCopies[Src2Reg]->getOperand(1).getReg());
1335+
for (auto NewCopy : NewCopies[Src2Reg]) {
1336+
DAG.LIS->InsertMachineInstrInMaps(*NewCopy.second);
1337+
DAG.LIS->removeInterval(Src2Reg);
1338+
DAG.LIS->createAndComputeVirtRegInterval(Src2Reg);
1339+
DAG.LIS->createAndComputeVirtRegInterval(
1340+
NewCopy.second->getOperand(1).getReg());
1341+
}
13371342
}
13381343
}
13391344

0 commit comments

Comments
 (0)