summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/LiveVariables.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-08-01 20:18:21 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-08-01 20:18:21 +0000
commitd8ded48468f1f651485bd38892fc533a62197b66 (patch)
tree20a7501bc3f33afd7b41dd45ec862aac49be7a40 /llvm/lib/CodeGen/LiveVariables.cpp
parente2e7e384e33a76444647aa27e1f40dbabe6a043d (diff)
downloadbcm5719-llvm-d8ded48468f1f651485bd38892fc533a62197b66.tar.gz
bcm5719-llvm-d8ded48468f1f651485bd38892fc533a62197b66.zip
Bugs: missing partial uses and redundant partial defs.
llvm-svn: 40688
Diffstat (limited to 'llvm/lib/CodeGen/LiveVariables.cpp')
-rw-r--r--llvm/lib/CodeGen/LiveVariables.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/LiveVariables.cpp b/llvm/lib/CodeGen/LiveVariables.cpp
index d1ebaf102fc..e8d07bfcaf1 100644
--- a/llvm/lib/CodeGen/LiveVariables.cpp
+++ b/llvm/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;
}
}
OpenPOWER on IntegriCloud