[llvm-commits] [llvm] r47862 - /llvm/trunk/lib/CodeGen/MachineInstr.cpp
Bill Wendling
isanbard at gmail.com
Mon Mar 3 14:14:33 PST 2008
Author: void
Date: Mon Mar 3 16:14:33 2008
New Revision: 47862
URL: http://llvm.org/viewvc/llvm-project?rev=47862&view=rev
Log:
Go through the machine instruction's operands to make sure that we're not
marking both a super- and sub-register as "killed". This removes implicit uses
that are marked as "killed".
Modified:
llvm/trunk/lib/CodeGen/MachineInstr.cpp
Modified: llvm/trunk/lib/CodeGen/MachineInstr.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineInstr.cpp?rev=47862&r1=47861&r2=47862&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MachineInstr.cpp (original)
+++ llvm/trunk/lib/CodeGen/MachineInstr.cpp Mon Mar 3 16:14:33 2008
@@ -678,34 +678,74 @@
bool MachineInstr::addRegisterKilled(unsigned IncomingReg,
const TargetRegisterInfo *RegInfo,
bool AddIfNotFound) {
- bool Found = false;
- for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
+ // Go through the machine instruction's operands to eliminate any potentially
+ // illegal conditions. I.e., a super- and sub-register both marked "kill".
+ Restart:
+ for (unsigned i = 0, e = getNumOperands(); i < e; ++i) {
MachineOperand &MO = getOperand(i);
+
if (MO.isRegister() && MO.isUse()) {
unsigned Reg = MO.getReg();
- if (!Reg)
+
+ if (!Reg || IncomingReg == Reg ||
+ !TargetRegisterInfo::isPhysicalRegister(Reg) ||
+ !TargetRegisterInfo::isPhysicalRegister(IncomingReg))
continue;
+
+ if (RegInfo->isSubRegister(IncomingReg, Reg)) {
+ if (MO.isKill()) {
+ if (MO.isImplicit()) {
+ // Remove this implicit use that marks the sub-register "kill". Let
+ // the super-register take care of this information.
+ RemoveOperand(i);
+ goto Restart; // Instruction was modified, redo checking.
+ } else {
+ // The super-register is going to take care of this kill
+ // information.
+ MO.setIsKill(false);
+ }
+ }
+ } else if (RegInfo->isSuperRegister(IncomingReg, Reg) && MO.isKill()) {
+ // The kill information is already handled by a super-register. Don't
+ // add this sub-register as a kill.
+ return true;
+ }
+ }
+ }
+
+ // If the register already exists, then make sure it or its super-register is
+ // marked "kill".
+ for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
+ MachineOperand &MO = getOperand(i);
+
+ if (MO.isRegister() && MO.isUse()) {
+ unsigned Reg = MO.getReg();
+ if (!Reg) continue;
+
if (Reg == IncomingReg) {
MO.setIsKill();
- Found = true;
- break;
+ return true;
} else if (TargetRegisterInfo::isPhysicalRegister(Reg) &&
TargetRegisterInfo::isPhysicalRegister(IncomingReg) &&
RegInfo->isSuperRegister(IncomingReg, Reg) &&
- MO.isKill())
+ MO.isKill()) {
// A super-register kill already exists.
- Found = true;
+ return true;
+ }
}
}
- // If not found, this means an alias of one of the operand is killed. Add a
+ // If not found, this means an alias of one of the operands is killed. Add a
// new implicit operand if required.
- if (!Found && AddIfNotFound) {
- addOperand(MachineOperand::CreateReg(IncomingReg, false/*IsDef*/,
- true/*IsImp*/,true/*IsKill*/));
+ if (AddIfNotFound) {
+ addOperand(MachineOperand::CreateReg(IncomingReg,
+ false /*IsDef*/,
+ true /*IsImp*/,
+ true /*IsKill*/));
return true;
}
- return Found;
+
+ return false;
}
bool MachineInstr::addRegisterDead(unsigned IncomingReg,
More information about the llvm-commits
mailing list