@@ -86,6 +86,16 @@ namespace {
86
86
//
87
87
std::vector<unsigned > PhysRegsUseOrder;
88
88
89
+ // Virt2LastUseMap - This maps each virtual register to its last use
90
+ // (MachineInstr*, operand index pair).
91
+ IndexedMap<std::pair<MachineInstr*, unsigned >, VirtReg2IndexFunctor>
92
+ Virt2LastUseMap;
93
+
94
+ std::pair<MachineInstr*,unsigned >& getVirtRegLastUse (unsigned Reg) {
95
+ assert (MRegisterInfo::isVirtualRegister (Reg) && " Illegal VirtReg!" );
96
+ return Virt2LastUseMap[Reg];
97
+ }
98
+
89
99
// VirtRegModified - This bitset contains information about which virtual
90
100
// registers need to be spilled back to memory when their registers are
91
101
// scavenged. If a virtual register has simply been rematerialized, there
@@ -282,8 +292,12 @@ void RALocal::spillVirtReg(MachineBasicBlock &MBB,
282
292
283
293
const TargetInstrInfo* TII = MBB.getParent ()->getTarget ().getInstrInfo ();
284
294
285
- if (!isVirtRegModified (VirtReg))
295
+ if (!isVirtRegModified (VirtReg)) {
286
296
DOUT << " which has not been modified, so no store necessary!" ;
297
+ std::pair<MachineInstr*, unsigned > &LastUse = getVirtRegLastUse (VirtReg);
298
+ if (LastUse.first )
299
+ LastUse.first ->getOperand (LastUse.second ).setIsKill ();
300
+ }
287
301
288
302
// Otherwise, there is a virtual register corresponding to this physical
289
303
// register. We only need to spill it into its stack slot if it has been
@@ -507,6 +521,7 @@ MachineInstr *RALocal::reloadVirtReg(MachineBasicBlock &MBB, MachineInstr *MI,
507
521
508
522
MF->getRegInfo ().setPhysRegUsed (PhysReg);
509
523
MI->getOperand (OpNum).setReg (PhysReg); // Assign the input register
524
+ getVirtRegLastUse (VirtReg) = std::make_pair (MI, OpNum);
510
525
return MI;
511
526
}
512
527
@@ -722,6 +737,7 @@ void RALocal::AllocateBasicBlock(MachineBasicBlock &MBB) {
722
737
DestPhysReg = getReg (MBB, MI, DestVirtReg);
723
738
MF->getRegInfo ().setPhysRegUsed (DestPhysReg);
724
739
markVirtRegModified (DestVirtReg);
740
+ getVirtRegLastUse (DestVirtReg) = std::make_pair ((MachineInstr*)0 , 0 );
725
741
MI->getOperand (i).setReg (DestPhysReg); // Assign the output register
726
742
}
727
743
}
@@ -823,7 +839,8 @@ bool RALocal::runOnMachineFunction(MachineFunction &Fn) {
823
839
// mapping for all virtual registers
824
840
unsigned LastVirtReg = MF->getRegInfo ().getLastVirtReg ();
825
841
Virt2PhysRegMap.grow (LastVirtReg);
826
- VirtRegModified.resize (LastVirtReg-MRegisterInfo::FirstVirtualRegister);
842
+ Virt2LastUseMap.grow (LastVirtReg);
843
+ VirtRegModified.resize (LastVirtReg+1 -MRegisterInfo::FirstVirtualRegister);
827
844
828
845
// Loop over all of the basic blocks, eliminating virtual register references
829
846
for (MachineFunction::iterator MBB = Fn.begin (), MBBe = Fn.end ();
@@ -834,6 +851,7 @@ bool RALocal::runOnMachineFunction(MachineFunction &Fn) {
834
851
PhysRegsUsed.clear ();
835
852
VirtRegModified.clear ();
836
853
Virt2PhysRegMap.clear ();
854
+ Virt2LastUseMap.clear ();
837
855
return true ;
838
856
}
839
857
0 commit comments