mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-10 02:25:47 +00:00
Bugs: missing partial uses and redundant partial defs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40688 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -281,10 +281,24 @@ void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
|
|||||||
PhysRegUsed[SubReg] = true;
|
PhysRegUsed[SubReg] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remember the partial uses.
|
|
||||||
for (const unsigned *SuperRegs = RegInfo->getSuperRegisters(Reg);
|
for (const unsigned *SuperRegs = RegInfo->getSuperRegisters(Reg);
|
||||||
unsigned SuperReg = *SuperRegs; ++SuperRegs)
|
unsigned SuperReg = *SuperRegs; ++SuperRegs) {
|
||||||
PhysRegPartUse[SuperReg] = MI;
|
// Remember the partial use of this superreg if it was previously defined.
|
||||||
|
bool HasPrevDef = PhysRegInfo[SuperReg] != NULL;
|
||||||
|
if (!HasPrevDef) {
|
||||||
|
for (const unsigned *SSRegs = RegInfo->getSuperRegisters(SuperReg);
|
||||||
|
unsigned SSReg = *SSRegs; ++SSRegs) {
|
||||||
|
if (PhysRegInfo[SSReg] != NULL) {
|
||||||
|
HasPrevDef = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (HasPrevDef) {
|
||||||
|
PhysRegInfo[SuperReg] = MI;
|
||||||
|
PhysRegPartUse[SuperReg] = MI;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *RefMI,
|
bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *RefMI,
|
||||||
@@ -342,7 +356,7 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) {
|
|||||||
addRegisterKilled(Reg, PhysRegPartUse[Reg], true);
|
addRegisterKilled(Reg, PhysRegPartUse[Reg], true);
|
||||||
}
|
}
|
||||||
} else if (PhysRegPartUse[Reg])
|
} else if (PhysRegPartUse[Reg])
|
||||||
// Add implicit use / kill to last use of a sub-register.
|
// Add implicit use / kill to last partial use.
|
||||||
addRegisterKilled(Reg, PhysRegPartUse[Reg], true);
|
addRegisterKilled(Reg, PhysRegPartUse[Reg], true);
|
||||||
else
|
else
|
||||||
addRegisterDead(Reg, LastRef);
|
addRegisterDead(Reg, LastRef);
|
||||||
@@ -385,11 +399,13 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) {
|
|||||||
|
|
||||||
PhysRegInfo[Reg] = MI;
|
PhysRegInfo[Reg] = MI;
|
||||||
PhysRegUsed[Reg] = false;
|
PhysRegUsed[Reg] = false;
|
||||||
|
PhysRegPartDef[Reg].clear();
|
||||||
PhysRegPartUse[Reg] = NULL;
|
PhysRegPartUse[Reg] = NULL;
|
||||||
for (const unsigned *SubRegs = RegInfo->getSubRegisters(Reg);
|
for (const unsigned *SubRegs = RegInfo->getSubRegisters(Reg);
|
||||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||||
PhysRegInfo[SubReg] = MI;
|
PhysRegInfo[SubReg] = MI;
|
||||||
PhysRegUsed[SubReg] = false;
|
PhysRegUsed[SubReg] = false;
|
||||||
|
PhysRegPartDef[SubReg].clear();
|
||||||
PhysRegPartUse[SubReg] = NULL;
|
PhysRegPartUse[SubReg] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user