@@ -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