summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ae46a33)
raw | patch | inline | side by side (parent: ae46a33)
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | |
Fri, 3 Feb 2012 21:23:14 +0000 (21:23 +0000) | ||
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | |
Fri, 3 Feb 2012 21:23:14 +0000 (21:23 +0000) |
Calls that use register mask operands don't have implicit defs for
returned values. The register mask operand handles the call clobber,
but it always behaves like a set of dead defs.
Add live implicit defs for any implicitly defined physregs that are
actually used.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149715 91177308-0d34-0410-b5e6-96231b3b80d8
returned values. The register mask operand handles the call clobber,
but it always behaves like a set of dead defs.
Add live implicit defs for any implicitly defined physregs that are
actually used.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149715 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/CodeGen/MachineInstr.h | patch | blob | history | |
lib/CodeGen/MachineInstr.cpp | patch | blob | history |
index 22a7ef205db0ab9e285b09d703559ac873219d37..4ccc37299c34da8f8bd6d518047f7af0eaba7089 100644 (file)
/// setPhysRegsDeadExcept - Mark every physreg used by this instruction as
/// dead except those in the UsedRegs list.
+ ///
+ /// On instructions with register mask operands, also add implicit-def
+ /// operands for all registers in UsedRegs.
void setPhysRegsDeadExcept(ArrayRef<unsigned> UsedRegs,
const TargetRegisterInfo &TRI);
index 6ce01a46ed18aa77bcc58b6407ddbec27bfe7941..de2082a779b4df13e8c87bfa0eefa7325766ab18 100644 (file)
void MachineInstr::setPhysRegsDeadExcept(ArrayRef<unsigned> UsedRegs,
const TargetRegisterInfo &TRI) {
+ bool HasRegMask = false;
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
MachineOperand &MO = getOperand(i);
+ if (MO.isRegMask()) {
+ HasRegMask = true;
+ continue;
+ }
if (!MO.isReg() || !MO.isDef()) continue;
unsigned Reg = MO.getReg();
if (!TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
// If there are no uses, including partial uses, the def is dead.
if (Dead) MO.setIsDead();
}
+
+ // This is a call with a register mask operand.
+ // Mask clobbers are always dead, so add defs for the non-dead defines.
+ if (HasRegMask)
+ for (ArrayRef<unsigned>::iterator I = UsedRegs.begin(), E = UsedRegs.end();
+ I != E; ++I)
+ addRegisterDefined(*I, &TRI);
}
unsigned