summaryrefslogtreecommitdiff
path: root/lib/CodeGen/MachineInstr.cpp
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2008-09-17 21:13:11 +0000
committerDale Johannesen <dalej@apple.com>2008-09-17 21:13:11 +0000
commit91aac1015e6714d959801dd8d60f55a72827dc4d (patch)
treec8440b8031a0fe3d7c63fcf9145ffc930759c547 /lib/CodeGen/MachineInstr.cpp
parent870e4bef419b1bd3e5ee05673975f1c05198b612 (diff)
downloadllvm-91aac1015e6714d959801dd8d60f55a72827dc4d.tar.gz
llvm-91aac1015e6714d959801dd8d60f55a72827dc4d.tar.bz2
llvm-91aac1015e6714d959801dd8d60f55a72827dc4d.tar.xz
Add a bit to mark operands of asm's that conflict
with an earlyclobber operand elsewhere. Propagate this bit and the earlyclobber bit through SDISel. Change linear-scan RA not to allocate regs in a way that conflicts with an earlyclobber. See also comments. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56290 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/MachineInstr.cpp')
-rw-r--r--lib/CodeGen/MachineInstr.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp
index 7f2a7b6a07..a365f20300 100644
--- a/lib/CodeGen/MachineInstr.cpp
+++ b/lib/CodeGen/MachineInstr.cpp
@@ -109,6 +109,7 @@ void MachineOperand::ChangeToRegister(unsigned Reg, bool isDef, bool isImp,
// register's use/def lists.
if (isRegister()) {
assert(!isEarlyClobber());
+ assert(!isEarlyClobber() && !overlapsEarlyClobber());
setReg(Reg);
} else {
// Otherwise, change this to a register and set the reg#.
@@ -128,6 +129,7 @@ void MachineOperand::ChangeToRegister(unsigned Reg, bool isDef, bool isImp,
IsKill = isKill;
IsDead = isDead;
IsEarlyClobber = false;
+ OverlapsEarlyClobber = false;
SubReg = 0;
}
@@ -183,13 +185,20 @@ void MachineOperand::print(std::ostream &OS, const TargetMachine *TM) const {
OS << "%mreg" << getReg();
}
- if (isDef() || isKill() || isDead() || isImplicit() || isEarlyClobber()) {
+ if (isDef() || isKill() || isDead() || isImplicit() || isEarlyClobber() ||
+ overlapsEarlyClobber()) {
OS << "<";
bool NeedComma = false;
+ if (overlapsEarlyClobber()) {
+ NeedComma = true;
+ OS << "overlapsearly";
+ }
if (isImplicit()) {
+ if (NeedComma) OS << ",";
OS << (isDef() ? "imp-def" : "imp-use");
NeedComma = true;
} else if (isDef()) {
+ if (NeedComma) OS << ",";
if (isEarlyClobber())
OS << "earlyclobber,";
OS << "def";