mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-30 17:25:21 +00:00
Also add <imp-def> operands for defined and dead super-registers when rewriting.
We cannot rely on the <imp-def> operands added by LiveIntervals in all cases as demonstrated by the test case. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130313 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -260,6 +260,8 @@ void VirtRegMap::rewrite(SlotIndexes *Indexes) {
|
||||
<< "********** Function: "
|
||||
<< MF->getFunction()->getName() << '\n');
|
||||
DEBUG(dump());
|
||||
SmallVector<unsigned, 8> SuperDeads;
|
||||
SmallVector<unsigned, 8> SuperDefs;
|
||||
SmallVector<unsigned, 8> SuperKills;
|
||||
|
||||
for (MachineFunction::iterator MBBI = MF->begin(), MBBE = MF->end();
|
||||
@@ -283,12 +285,13 @@ void VirtRegMap::rewrite(SlotIndexes *Indexes) {
|
||||
if (MO.getSubReg()) {
|
||||
// A virtual register kill refers to the whole register, so we may
|
||||
// have to add <imp-use,kill> operands for the super-register.
|
||||
if (MO.isUse() && MO.isKill() && !MO.isUndef())
|
||||
SuperKills.push_back(PhysReg);
|
||||
|
||||
// We don't have to deal with sub-register defs because
|
||||
// LiveIntervalAnalysis already added the necessary <imp-def>
|
||||
// operands.
|
||||
if (MO.isUse()) {
|
||||
if (MO.isKill() && !MO.isUndef())
|
||||
SuperKills.push_back(PhysReg);
|
||||
} else if (MO.isDead())
|
||||
SuperDeads.push_back(PhysReg);
|
||||
else
|
||||
SuperDefs.push_back(PhysReg);
|
||||
|
||||
// PhysReg operands cannot have subregister indexes.
|
||||
PhysReg = TRI->getSubReg(PhysReg, MO.getSubReg());
|
||||
@@ -305,6 +308,12 @@ void VirtRegMap::rewrite(SlotIndexes *Indexes) {
|
||||
while (!SuperKills.empty())
|
||||
MI->addRegisterKilled(SuperKills.pop_back_val(), TRI, true);
|
||||
|
||||
while (!SuperDeads.empty())
|
||||
MI->addRegisterDead(SuperDeads.pop_back_val(), TRI, true);
|
||||
|
||||
while (!SuperDefs.empty())
|
||||
MI->addRegisterDefined(SuperDefs.pop_back_val(), TRI);
|
||||
|
||||
DEBUG(dbgs() << "> " << *MI);
|
||||
|
||||
// Finally, remove any identity copies.
|
||||
|
Reference in New Issue
Block a user