diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-08-01 20:18:21 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-08-01 20:18:21 +0000 |
commit | 21b3bf06508e8a9af86276099e6845961c883a62 (patch) | |
tree | a5f3c756c35a22617510138ca9a5fcff069d3984 /lib/CodeGen/LiveVariables.cpp | |
parent | dd487c159bb93639ce574ab2e5340be5cbf4a4d1 (diff) |
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
Diffstat (limited to 'lib/CodeGen/LiveVariables.cpp')
-rw-r--r-- | lib/CodeGen/LiveVariables.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/CodeGen/LiveVariables.cpp b/lib/CodeGen/LiveVariables.cpp index d1ebaf102f..e8d07bfcaf 100644 --- a/lib/CodeGen/LiveVariables.cpp +++ b/lib/CodeGen/LiveVariables.cpp @@ -281,10 +281,24 @@ void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) { PhysRegUsed[SubReg] = true; } - // Remember the partial uses. for (const unsigned *SuperRegs = RegInfo->getSuperRegisters(Reg); - unsigned SuperReg = *SuperRegs; ++SuperRegs) - PhysRegPartUse[SuperReg] = MI; + unsigned SuperReg = *SuperRegs; ++SuperRegs) { + // 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, @@ -342,7 +356,7 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) { addRegisterKilled(Reg, PhysRegPartUse[Reg], true); } } 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); else addRegisterDead(Reg, LastRef); @@ -385,11 +399,13 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI) { PhysRegInfo[Reg] = MI; PhysRegUsed[Reg] = false; + PhysRegPartDef[Reg].clear(); PhysRegPartUse[Reg] = NULL; for (const unsigned *SubRegs = RegInfo->getSubRegisters(Reg); unsigned SubReg = *SubRegs; ++SubRegs) { PhysRegInfo[SubReg] = MI; PhysRegUsed[SubReg] = false; + PhysRegPartDef[SubReg].clear(); PhysRegPartUse[SubReg] = NULL; } } |