aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/ARM/ARMRegisterInfo.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-02-19 21:49:54 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-02-19 21:49:54 +0000
commitb371f457b0ea4a652a9f526ba4375c80ae542252 (patch)
treeec68e7096a3f2101af8713fb7cba5ac5cf354664 /lib/Target/ARM/ARMRegisterInfo.cpp
parentd1b2c5b34df35e0f582be44e0d7d2240a0b80812 (diff)
downloadexternal_llvm-b371f457b0ea4a652a9f526ba4375c80ae542252.zip
external_llvm-b371f457b0ea4a652a9f526ba4375c80ae542252.tar.gz
external_llvm-b371f457b0ea4a652a9f526ba4375c80ae542252.tar.bz2
Re-apply my liveintervalanalysis changes. Now with PR1207 fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34428 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMRegisterInfo.cpp')
-rw-r--r--lib/Target/ARM/ARMRegisterInfo.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMRegisterInfo.cpp b/lib/Target/ARM/ARMRegisterInfo.cpp
index a96be56..41f5e46 100644
--- a/lib/Target/ARM/ARMRegisterInfo.cpp
+++ b/lib/Target/ARM/ARMRegisterInfo.cpp
@@ -28,6 +28,7 @@
#include "llvm/Target/TargetFrameInfo.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
+#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/STLExtras.h"
#include <algorithm>
@@ -297,6 +298,20 @@ ARMRegisterInfo::getCalleeSavedRegClasses() const {
return CalleeSavedRegClasses;
}
+BitVector ARMRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
+ BitVector Reserved(getNumRegs());
+ Reserved.set(ARM::SP);
+ if (STI.isTargetDarwin() || hasFP(MF))
+ Reserved.set(FramePtr);
+ // Some targets reserve R9.
+ if (STI.isR9Reserved())
+ Reserved.set(ARM::R9);
+ // At PEI time, if LR is used, it will be spilled upon entry.
+ if (MF.getUsedPhysregs() && !MF.isPhysRegUsed((unsigned)ARM::LR))
+ Reserved.set(ARM::LR);
+ return Reserved;
+}
+
/// hasFP - Return true if the specified function should have a dedicated frame
/// pointer register. This is true if the function has variable sized allocas
/// or if frame pointer elimination is disabled.