@@ -399,81 +399,81 @@ void TailDuplicator::duplicateInstruction(
399
399
return ;
400
400
}
401
401
MachineInstr &NewMI = TII->duplicate (*PredBB, PredBB->end (), *MI);
402
- if (PreRegAlloc) {
403
- for (unsigned i = 0 , e = NewMI.getNumOperands (); i != e; ++i) {
404
- MachineOperand &MO = NewMI.getOperand (i);
405
- if (!MO.isReg ())
406
- continue ;
407
- Register Reg = MO.getReg ();
408
- if (!Reg.isVirtual ())
409
- continue ;
410
- if (MO.isDef ()) {
411
- const TargetRegisterClass *RC = MRI->getRegClass (Reg);
412
- Register NewReg = MRI->createVirtualRegister (RC);
413
- MO.setReg (NewReg);
414
- LocalVRMap.insert (std::make_pair (Reg, RegSubRegPair (NewReg, 0 )));
415
- if (isDefLiveOut (Reg, TailBB, MRI) || UsedByPhi.count (Reg))
416
- addSSAUpdateEntry (Reg, NewReg, PredBB);
417
- } else {
418
- auto VI = LocalVRMap.find (Reg);
419
- if (VI != LocalVRMap.end ()) {
420
- // Need to make sure that the register class of the mapped register
421
- // will satisfy the constraints of the class of the register being
422
- // replaced.
423
- auto *OrigRC = MRI->getRegClass (Reg);
424
- auto *MappedRC = MRI->getRegClass (VI->second .Reg );
425
- const TargetRegisterClass *ConstrRC;
426
- if (VI->second .SubReg != 0 ) {
427
- ConstrRC = TRI->getMatchingSuperRegClass (MappedRC, OrigRC,
428
- VI->second .SubReg );
429
- if (ConstrRC) {
430
- // The actual constraining (as in "find appropriate new class")
431
- // is done by getMatchingSuperRegClass, so now we only need to
432
- // change the class of the mapped register.
433
- MRI->setRegClass (VI->second .Reg , ConstrRC);
434
- }
435
- } else {
436
- // For mapped registers that do not have sub-registers, simply
437
- // restrict their class to match the original one.
438
-
439
- // We don't want debug instructions affecting the resulting code so
440
- // if we're cloning a debug instruction then just use MappedRC
441
- // rather than constraining the register class further.
442
- ConstrRC = NewMI.isDebugInstr ()
443
- ? MappedRC
444
- : MRI->constrainRegClass (VI->second .Reg , OrigRC);
445
- }
446
-
447
- if (ConstrRC) {
448
- // If the class constraining succeeded, we can simply replace
449
- // the old register with the mapped one.
450
- MO.setReg (VI->second .Reg );
451
- // We have Reg -> VI.Reg:VI.SubReg, so if Reg is used with a
452
- // sub-register, we need to compose the sub-register indices.
453
- MO.setSubReg (
454
- TRI->composeSubRegIndices (VI->second .SubReg , MO.getSubReg ()));
455
- } else {
456
- // The direct replacement is not possible, due to failing register
457
- // class constraints. An explicit COPY is necessary. Create one
458
- // that can be reused.
459
- Register NewReg = MRI->createVirtualRegister (OrigRC);
460
- BuildMI (*PredBB, NewMI, NewMI.getDebugLoc (),
461
- TII->get (TargetOpcode::COPY), NewReg)
462
- .addReg (VI->second .Reg , 0 , VI->second .SubReg );
463
- LocalVRMap.erase (VI);
464
- LocalVRMap.insert (std::make_pair (Reg, RegSubRegPair (NewReg, 0 )));
465
- MO.setReg (NewReg);
466
- // The composed VI.Reg:VI.SubReg is replaced with NewReg, which
467
- // is equivalent to the whole register Reg. Hence, Reg:subreg
468
- // is same as NewReg:subreg, so keep the sub-register index
469
- // unchanged.
470
- }
471
- // Clear any kill flags from this operand. The new register could
472
- // have uses after this one, so kills are not valid here.
473
- MO.setIsKill (false );
474
- }
402
+ if (!PreRegAlloc)
403
+ return ;
404
+ for (unsigned i = 0 , e = NewMI.getNumOperands (); i != e; ++i) {
405
+ MachineOperand &MO = NewMI.getOperand (i);
406
+ if (!MO.isReg ())
407
+ continue ;
408
+ Register Reg = MO.getReg ();
409
+ if (!Reg.isVirtual ())
410
+ continue ;
411
+ if (MO.isDef ()) {
412
+ const TargetRegisterClass *RC = MRI->getRegClass (Reg);
413
+ Register NewReg = MRI->createVirtualRegister (RC);
414
+ MO.setReg (NewReg);
415
+ LocalVRMap.insert (std::make_pair (Reg, RegSubRegPair (NewReg, 0 )));
416
+ if (isDefLiveOut (Reg, TailBB, MRI) || UsedByPhi.count (Reg))
417
+ addSSAUpdateEntry (Reg, NewReg, PredBB);
418
+ continue ;
419
+ }
420
+ auto VI = LocalVRMap.find (Reg);
421
+ if (VI == LocalVRMap.end ())
422
+ continue ;
423
+ // Need to make sure that the register class of the mapped register
424
+ // will satisfy the constraints of the class of the register being
425
+ // replaced.
426
+ auto *OrigRC = MRI->getRegClass (Reg);
427
+ auto *MappedRC = MRI->getRegClass (VI->second .Reg );
428
+ const TargetRegisterClass *ConstrRC;
429
+ if (VI->second .SubReg != 0 ) {
430
+ ConstrRC =
431
+ TRI->getMatchingSuperRegClass (MappedRC, OrigRC, VI->second .SubReg );
432
+ if (ConstrRC) {
433
+ // The actual constraining (as in "find appropriate new class")
434
+ // is done by getMatchingSuperRegClass, so now we only need to
435
+ // change the class of the mapped register.
436
+ MRI->setRegClass (VI->second .Reg , ConstrRC);
475
437
}
438
+ } else {
439
+ // For mapped registers that do not have sub-registers, simply
440
+ // restrict their class to match the original one.
441
+
442
+ // We don't want debug instructions affecting the resulting code so
443
+ // if we're cloning a debug instruction then just use MappedRC
444
+ // rather than constraining the register class further.
445
+ ConstrRC = NewMI.isDebugInstr ()
446
+ ? MappedRC
447
+ : MRI->constrainRegClass (VI->second .Reg , OrigRC);
448
+ }
449
+
450
+ if (ConstrRC) {
451
+ // If the class constraining succeeded, we can simply replace
452
+ // the old register with the mapped one.
453
+ MO.setReg (VI->second .Reg );
454
+ // We have Reg -> VI.Reg:VI.SubReg, so if Reg is used with a
455
+ // sub-register, we need to compose the sub-register indices.
456
+ MO.setSubReg (
457
+ TRI->composeSubRegIndices (VI->second .SubReg , MO.getSubReg ()));
458
+ } else {
459
+ // The direct replacement is not possible, due to failing register
460
+ // class constraints. An explicit COPY is necessary. Create one
461
+ // that can be reused.
462
+ Register NewReg = MRI->createVirtualRegister (OrigRC);
463
+ BuildMI (*PredBB, NewMI, NewMI.getDebugLoc (), TII->get (TargetOpcode::COPY),
464
+ NewReg)
465
+ .addReg (VI->second .Reg , 0 , VI->second .SubReg );
466
+ LocalVRMap.erase (VI);
467
+ LocalVRMap.insert (std::make_pair (Reg, RegSubRegPair (NewReg, 0 )));
468
+ MO.setReg (NewReg);
469
+ // The composed VI.Reg:VI.SubReg is replaced with NewReg, which
470
+ // is equivalent to the whole register Reg. Hence, Reg:subreg
471
+ // is same as NewReg:subreg, so keep the sub-register index
472
+ // unchanged.
476
473
}
474
+ // Clear any kill flags from this operand. The new register could
475
+ // have uses after this one, so kills are not valid here.
476
+ MO.setIsKill (false );
477
477
}
478
478
}
479
479
0 commit comments