[llvm-commits] CVS: llvm/lib/Target/ARM/ARMConstantIslandPass.cpp ARMMachineFunctionInfo.h ARMRegisterInfo.cpp
Evan Cheng
evan.cheng at apple.com
Thu Mar 1 00:27:19 PST 2007
Changes in directory llvm/lib/Target/ARM:
ARMConstantIslandPass.cpp updated: 1.32 -> 1.33
ARMMachineFunctionInfo.h updated: 1.7 -> 1.8
ARMRegisterInfo.cpp updated: 1.76 -> 1.77
---
Log message:
- Track which callee-saved registers are spilled.
- Some code clean up.
---
Diffs of the changes: (+47 -20)
ARMConstantIslandPass.cpp | 2 +-
ARMMachineFunctionInfo.h | 37 ++++++++++++++++++++++++++++---------
ARMRegisterInfo.cpp | 28 ++++++++++++++++++----------
3 files changed, 47 insertions(+), 20 deletions(-)
Index: llvm/lib/Target/ARM/ARMConstantIslandPass.cpp
diff -u llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.32 llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.33
--- llvm/lib/Target/ARM/ARMConstantIslandPass.cpp:1.32 Wed Feb 28 17:20:38 2007
+++ llvm/lib/Target/ARM/ARMConstantIslandPass.cpp Thu Mar 1 02:26:31 2007
@@ -213,7 +213,7 @@
// If LR has been forced spilled and no far jumps (i.e. BL) has been issued.
// Undo the spill / restore of LR if possible.
- if (!HasFarJump && AFI->isLRForceSpilled() && isThumb)
+ if (!HasFarJump && AFI->isLRSpilledForFarJump() && isThumb)
MadeChange |= UndoLRSpillRestore();
BBSizes.clear();
Index: llvm/lib/Target/ARM/ARMMachineFunctionInfo.h
diff -u llvm/lib/Target/ARM/ARMMachineFunctionInfo.h:1.7 llvm/lib/Target/ARM/ARMMachineFunctionInfo.h:1.8
--- llvm/lib/Target/ARM/ARMMachineFunctionInfo.h:1.7 Thu Mar 1 01:52:44 2007
+++ llvm/lib/Target/ARM/ARMMachineFunctionInfo.h Thu Mar 1 02:26:31 2007
@@ -16,6 +16,7 @@
#include "ARMSubtarget.h"
#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/Target/MRegisterInfo.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/ADT/BitVector.h"
@@ -37,9 +38,9 @@
/// processFunctionBeforeCalleeSavedScan().
bool HasStackFrame;
- /// LRSForceSpilled - True if the LR register has been for spilled to enable
- /// far jump.
- bool LRForceSpilled;
+ /// LRSpilledForFarJump - True if the LR register has been for spilled to
+ /// enable far jump.
+ bool LRSpilledForFarJump;
/// R3IsLiveIn - True if R3 is live in to this function.
/// FIXME: Remove when register scavenger for Thumb is done.
@@ -73,6 +74,10 @@
BitVector GPRCS2Frames;
BitVector DPRCSFrames;
+ /// SpilledCSRegs - A BitVector mask of all spilled callee-saved registers.
+ ///
+ BitVector SpilledCSRegs;
+
/// JumpTableUId - Unique id for jumptables.
///
unsigned JumpTableUId;
@@ -81,19 +86,20 @@
ARMFunctionInfo() :
isThumb(false),
VarArgsRegSaveSize(0), HasStackFrame(false),
- LRForceSpilled(false), R3IsLiveIn(false),
+ LRSpilledForFarJump(false), R3IsLiveIn(false),
FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0),
- GPRCS1Frames(32), GPRCS2Frames(32), DPRCSFrames(32),
+ GPRCS1Frames(0), GPRCS2Frames(0), DPRCSFrames(0),
JumpTableUId(0) {}
ARMFunctionInfo(MachineFunction &MF) :
isThumb(MF.getTarget().getSubtarget<ARMSubtarget>().isThumb()),
VarArgsRegSaveSize(0), HasStackFrame(false),
- LRForceSpilled(false), R3IsLiveIn(false),
+ LRSpilledForFarJump(false), R3IsLiveIn(false),
FramePtrSpillOffset(0), GPRCS1Offset(0), GPRCS2Offset(0), DPRCSOffset(0),
GPRCS1Size(0), GPRCS2Size(0), DPRCSSize(0),
GPRCS1Frames(32), GPRCS2Frames(32), DPRCSFrames(32),
+ SpilledCSRegs(MF.getTarget().getRegisterInfo()->getNumRegs()),
JumpTableUId(0) {}
bool isThumbFunction() const { return isThumb; }
@@ -104,10 +110,11 @@
bool hasStackFrame() const { return HasStackFrame; }
void setHasStackFrame(bool s) { HasStackFrame = s; }
- bool isLRForceSpilled() const { return LRForceSpilled; }
- void setLRIsForceSpilled(bool s) { LRForceSpilled = s; }
+ bool isLRSpilledForFarJump() const { return LRSpilledForFarJump; }
+ void setLRIsSpilledForFarJump(bool s) { LRSpilledForFarJump = s; }
- bool isR3IsLiveIn() const { return R3IsLiveIn; }
+ // FIXME: Remove when register scavenger for Thumb is done.
+ bool isR3LiveIn() const { return R3IsLiveIn; }
void setR3IsLiveIn(bool l) { R3IsLiveIn = l; }
unsigned getFramePtrSpillOffset() const { return FramePtrSpillOffset; }
@@ -182,6 +189,18 @@
}
}
+ void setCSRegisterIsSpilled(unsigned Reg) {
+ SpilledCSRegs.set(Reg);
+ }
+
+ bool isCSRegisterSpilled(unsigned Reg) {
+ return SpilledCSRegs[Reg];
+ }
+
+ const BitVector &getSpilledCSRegisters() const {
+ return SpilledCSRegs;
+ }
+
unsigned createJumpTableUId() {
return JumpTableUId++;
}
Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp
diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.76 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.77
--- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.76 Wed Feb 28 17:12:34 2007
+++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Thu Mar 1 02:26:31 2007
@@ -869,7 +869,7 @@
.addReg(ARM::R2, false, false, true);
TmpReg = ARM::R2;
}
- if (TmpReg == ARM::R3 && AFI->isR3IsLiveIn())
+ if (TmpReg == ARM::R3 && AFI->isR3LiveIn())
BuildMI(MBB, II, TII.get(ARM::tMOVrr), ARM::R12)
.addReg(ARM::R3, false, false, true);
if (Opcode == ARM::tSpill) {
@@ -892,7 +892,7 @@
if (ValReg == ARM::R3)
BuildMI(MBB, NII, TII.get(ARM::tMOVrr), ARM::R2)
.addReg(ARM::R12, false, false, true);
- if (TmpReg == ARM::R3 && AFI->isR3IsLiveIn())
+ if (TmpReg == ARM::R3 && AFI->isR3LiveIn())
BuildMI(MBB, NII, TII.get(ARM::tMOVrr), ARM::R3)
.addReg(ARM::R12, false, false, true);
} else
@@ -923,6 +923,7 @@
unsigned NumGPRSpills = 0;
SmallVector<unsigned, 4> UnspilledCS1GPRs;
SmallVector<unsigned, 4> UnspilledCS2GPRs;
+ ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
// Don't spill FP if the frame can be eliminated. This is determined
// by scanning the callee-save registers to see if any is used.
@@ -932,6 +933,7 @@
unsigned Reg = CSRegs[i];
bool Spilled = false;
if (MF.isPhysRegUsed(Reg)) {
+ AFI->setCSRegisterIsSpilled(Reg);
Spilled = true;
CanEliminateFrame = false;
} else {
@@ -992,13 +994,12 @@
}
}
- ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
bool ForceLRSpill = false;
if (!LRSpilled && AFI->isThumbFunction()) {
unsigned FnSize = ARM::GetFunctionSize(MF);
- // Force LR spill if the Thumb function size is > 2048. This enables the
+ // Force LR to be spilled if the Thumb function size is > 2048. This enables
// use of BL to implement far jump. If it turns out that it's not needed
- // the branch fix up path will undo it.
+ // then the branch fix up path will undo it.
if (FnSize >= (1 << 11)) {
CanEliminateFrame = false;
ForceLRSpill = true;
@@ -1012,6 +1013,7 @@
// Spill LR as well so we can fold BX_RET to the registers restore (LDM).
if (!LRSpilled && CS1Spilled) {
MF.changePhyRegUsed(ARM::LR, true);
+ AFI->setCSRegisterIsSpilled(ARM::LR);
NumGPRSpills++;
UnspilledCS1GPRs.erase(std::find(UnspilledCS1GPRs.begin(),
UnspilledCS1GPRs.end(), (unsigned)ARM::LR));
@@ -1030,16 +1032,22 @@
// the integer and double callee save areas.
unsigned TargetAlign = MF.getTarget().getFrameInfo()->getStackAlignment();
if (TargetAlign == 8 && (NumGPRSpills & 1)) {
- if (CS1Spilled && !UnspilledCS1GPRs.empty())
- MF.changePhyRegUsed(UnspilledCS1GPRs.front(), true);
- else if (!UnspilledCS2GPRs.empty())
- MF.changePhyRegUsed(UnspilledCS2GPRs.front(), true);
+ if (CS1Spilled && !UnspilledCS1GPRs.empty()) {
+ unsigned Reg = UnspilledCS1GPRs.front();
+ MF.changePhyRegUsed(Reg, true);
+ AFI->setCSRegisterIsSpilled(Reg);
+ } else if (!UnspilledCS2GPRs.empty()) {
+ unsigned Reg = UnspilledCS2GPRs.front();
+ MF.changePhyRegUsed(Reg, true);
+ AFI->setCSRegisterIsSpilled(Reg);
+ }
}
}
if (ForceLRSpill) {
MF.changePhyRegUsed(ARM::LR, true);
- AFI->setLRIsForceSpilled(true);
+ AFI->setCSRegisterIsSpilled(ARM::LR);
+ AFI->setLRIsSpilledForFarJump(true);
}
}
More information about the llvm-commits
mailing list