Skip to content

Commit a7e35ea

Browse files
committed
fixup! [SPARC] Support reserving arbitrary general purpose registers
1 parent eb8204d commit a7e35ea

File tree

4 files changed

+21
-35
lines changed

4 files changed

+21
-35
lines changed

llvm/lib/Target/Sparc/Sparc.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,16 @@ include "LeonFeatures.td"
7474

7575
//==== Register allocation tweaks needed by some low-level software
7676
foreach i = 1 ... 7 in
77-
def FeatureReserveG#i : SubtargetFeature<"reserve-g"#i, "ReserveGRegister["#i#"]", "true",
77+
def FeatureReserveG#i : SubtargetFeature<"reserve-g"#i, "ReserveRegister["#i#" + SP::G0 - SP::G0]", "true",
7878
"Reserve G"#i#", making it unavailable as a GPR">;
7979
foreach i = 0 ... 5 in
80-
def FeatureReserveO#i : SubtargetFeature<"reserve-o"#i, "ReserveORegister["#i#"]", "true",
80+
def FeatureReserveO#i : SubtargetFeature<"reserve-o"#i, "ReserveRegister["#i#" + SP::O0 - SP::G0]", "true",
8181
"Reserve O"#i#", making it unavailable as a GPR">;
8282
foreach i = 0 ... 7 in
83-
def FeatureReserveL#i : SubtargetFeature<"reserve-l"#i, "ReserveLRegister["#i#"]", "true",
83+
def FeatureReserveL#i : SubtargetFeature<"reserve-l"#i, "ReserveRegister["#i#" + SP::L0 - SP::G0]", "true",
8484
"Reserve L"#i#", making it unavailable as a GPR">;
8585
foreach i = 0 ... 5 in
86-
def FeatureReserveI#i : SubtargetFeature<"reserve-i"#i, "ReserveIRegister["#i#"]", "true",
86+
def FeatureReserveI#i : SubtargetFeature<"reserve-i"#i, "ReserveRegister["#i#" + SP::I0 - SP::G0]", "true",
8787
"Reserve I"#i#", making it unavailable as a GPR">;
8888

8989
//===----------------------------------------------------------------------===//

llvm/lib/Target/Sparc/SparcRegisterInfo.cpp

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -96,26 +96,13 @@ BitVector SparcRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
9696
for (unsigned n = 0; n < 31; n++)
9797
Reserved.set(SP::ASR1 + n);
9898

99-
for (size_t i = 0; i < SP::IntRegsRegClass.getNumRegs() / 4; ++i) {
100-
// Mark both single register and register pairs.
101-
if (MF.getSubtarget<SparcSubtarget>().isGRegisterReserved(i)) {
102-
Reserved.set(SP::G0 + i);
103-
Reserved.set(SP::G0_G1 + i / 2);
104-
}
105-
if (MF.getSubtarget<SparcSubtarget>().isORegisterReserved(i)) {
106-
Reserved.set(SP::O0 + i);
107-
Reserved.set(SP::O0_O1 + i / 2);
108-
}
109-
if (MF.getSubtarget<SparcSubtarget>().isLRegisterReserved(i)) {
110-
Reserved.set(SP::L0 + i);
111-
Reserved.set(SP::L0_L1 + i / 2);
112-
}
113-
if (MF.getSubtarget<SparcSubtarget>().isIRegisterReserved(i)) {
114-
Reserved.set(SP::I0 + i);
115-
Reserved.set(SP::I0_I1 + i / 2);
116-
}
99+
for (TargetRegisterClass::iterator i = SP::IntRegsRegClass.begin();
100+
i != SP::IntRegsRegClass.end(); ++i) {
101+
if (MF.getSubtarget<SparcSubtarget>().isRegisterReserved(*i))
102+
markSuperRegs(Reserved, *i);
117103
}
118104

105+
assert(checkAllSuperRegsMarked(Reserved));
119106
return Reserved;
120107
}
121108

llvm/lib/Target/Sparc/SparcSubtarget.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,7 @@ SparcSubtarget::SparcSubtarget(const StringRef &CPU, const StringRef &TuneCPU,
5050
const StringRef &FS, const TargetMachine &TM,
5151
bool is64Bit)
5252
: SparcGenSubtargetInfo(TM.getTargetTriple(), CPU, TuneCPU, FS),
53-
ReserveGRegister(SP::IntRegsRegClass.getNumRegs() / 4),
54-
ReserveORegister(SP::IntRegsRegClass.getNumRegs() / 4),
55-
ReserveLRegister(SP::IntRegsRegClass.getNumRegs() / 4),
56-
ReserveIRegister(SP::IntRegsRegClass.getNumRegs() / 4),
53+
ReserveRegister(SP::IntRegsRegClass.getNumRegs()),
5754
TargetTriple(TM.getTargetTriple()), Is64Bit(is64Bit),
5855
InstrInfo(initializeSubtargetDependencies(CPU, TuneCPU, FS)),
5956
TLInfo(TM, *this), FrameLowering(*this) {}

llvm/lib/Target/Sparc/SparcSubtarget.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@
1313
#ifndef LLVM_LIB_TARGET_SPARC_SPARCSUBTARGET_H
1414
#define LLVM_LIB_TARGET_SPARC_SPARCSUBTARGET_H
1515

16+
#include "MCTargetDesc/SparcMCTargetDesc.h"
1617
#include "SparcFrameLowering.h"
1718
#include "SparcISelLowering.h"
1819
#include "SparcInstrInfo.h"
1920
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
2021
#include "llvm/CodeGen/TargetSubtargetInfo.h"
2122
#include "llvm/IR/DataLayout.h"
23+
#include "llvm/Support/ErrorHandling.h"
2224
#include "llvm/TargetParser/Triple.h"
2325
#include <string>
2426

@@ -29,11 +31,9 @@ namespace llvm {
2931
class StringRef;
3032

3133
class SparcSubtarget : public SparcGenSubtargetInfo {
32-
// Reserve*Register[i] - *#i is not available as a general purpose register.
33-
BitVector ReserveGRegister;
34-
BitVector ReserveORegister;
35-
BitVector ReserveLRegister;
36-
BitVector ReserveIRegister;
34+
// ReserveRegister[i] - Register #i is not available as a general purpose
35+
// register.
36+
BitVector ReserveRegister;
3737

3838
Triple TargetTriple;
3939
virtual void anchor();
@@ -88,10 +88,12 @@ class SparcSubtarget : public SparcGenSubtargetInfo {
8888
return is64Bit() ? 2047 : 0;
8989
}
9090

91-
bool isGRegisterReserved(size_t i) const { return ReserveGRegister[i]; }
92-
bool isORegisterReserved(size_t i) const { return ReserveORegister[i]; }
93-
bool isLRegisterReserved(size_t i) const { return ReserveLRegister[i]; }
94-
bool isIRegisterReserved(size_t i) const { return ReserveIRegister[i]; }
91+
bool isRegisterReserved(MCPhysReg PhysReg) const {
92+
if (PhysReg >= SP::G0 && PhysReg <= SP::O7)
93+
return ReserveRegister[PhysReg - SP::G0];
94+
95+
llvm_unreachable("Invalid physical register passed!");
96+
}
9597

9698
/// Given a actual stack size as determined by FrameInfo, this function
9799
/// returns adjusted framesize which includes space for register window

0 commit comments

Comments
 (0)