Index: src/IceTargetLoweringARM32.cpp |
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp |
index 4b70dadde7fccbb823684e6e2efab2c277dde208..7a308a29351d643ba3ab63443b9f725b38e9af88 100644 |
--- a/src/IceTargetLoweringARM32.cpp |
+++ b/src/IceTargetLoweringARM32.cpp |
@@ -233,7 +233,7 @@ constexpr SizeT NumGPRArgs = |
REGARM32_GPR_TABLE |
#undef X |
; |
-std::array<uint32_t, NumGPRArgs> GPRArgInitializer; |
+std::array<RegNumT, NumGPRArgs> GPRArgInitializer; |
constexpr SizeT NumI64Args = |
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
@@ -242,7 +242,7 @@ constexpr SizeT NumI64Args = |
REGARM32_I64PAIR_TABLE |
#undef X |
; |
-std::array<uint32_t, NumI64Args> I64ArgInitializer; |
+std::array<RegNumT, NumI64Args> I64ArgInitializer; |
constexpr SizeT NumFP32Args = |
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
@@ -251,7 +251,7 @@ constexpr SizeT NumFP32Args = |
REGARM32_FP32_TABLE |
#undef X |
; |
-std::array<uint32_t, NumFP32Args> FP32ArgInitializer; |
+std::array<RegNumT, NumFP32Args> FP32ArgInitializer; |
constexpr SizeT NumFP64Args = |
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
@@ -260,7 +260,7 @@ constexpr SizeT NumFP64Args = |
REGARM32_FP64_TABLE |
#undef X |
; |
-std::array<uint32_t, NumFP64Args> FP64ArgInitializer; |
+std::array<RegNumT, NumFP64Args> FP64ArgInitializer; |
constexpr SizeT NumVec128Args = |
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
@@ -269,7 +269,7 @@ constexpr SizeT NumVec128Args = |
REGARM32_VEC128_TABLE |
#undef X |
; |
-std::array<uint32_t, NumVec128Args> Vec128ArgInitializer; |
+std::array<RegNumT, NumVec128Args> Vec128ArgInitializer; |
IceString getRegClassName(RegClass C) { |
auto ClassNum = static_cast<RegARM32::RegClassARM32>(C); |
@@ -289,7 +289,7 @@ TargetARM32::TargetARM32(Cfg *Func) |
CPUFeatures(Func->getContext()->getFlags()) {} |
void TargetARM32::staticInit(GlobalContext *Ctx) { |
- |
+ RegNumT::setLimit(RegARM32::Reg_NUM); |
// Limit this size (or do all bitsets need to be the same width)??? |
llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); |
llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); |
@@ -313,16 +313,17 @@ void TargetARM32::staticInit(GlobalContext *Ctx) { |
if (Entry.CCArg <= 0) { |
continue; |
} |
+ auto RegNum = RegNumT::fromInt(i); |
if (Entry.IsGPR) { |
- GPRArgInitializer[Entry.CCArg - 1] = i; |
+ GPRArgInitializer[Entry.CCArg - 1] = RegNum; |
} else if (Entry.IsI64Pair) { |
- I64ArgInitializer[Entry.CCArg - 1] = i; |
+ I64ArgInitializer[Entry.CCArg - 1] = RegNum; |
} else if (Entry.IsFP32) { |
- FP32ArgInitializer[Entry.CCArg - 1] = i; |
+ FP32ArgInitializer[Entry.CCArg - 1] = RegNum; |
} else if (Entry.IsFP64) { |
- FP64ArgInitializer[Entry.CCArg - 1] = i; |
+ FP64ArgInitializer[Entry.CCArg - 1] = RegNum; |
} else if (Entry.IsVec128) { |
- Vec128ArgInitializer[Entry.CCArg - 1] = i; |
+ Vec128ArgInitializer[Entry.CCArg - 1] = RegNum; |
} |
} |
TypeToRegisterSet[IceType_void] = InvalidRegisters; |
@@ -346,7 +347,7 @@ void TargetARM32::staticInit(GlobalContext *Ctx) { |
filterTypeToRegisterSet( |
Ctx, RegARM32::Reg_NUM, TypeToRegisterSet, |
- llvm::array_lengthof(TypeToRegisterSet), [](int32_t RegNum) -> IceString { |
+ llvm::array_lengthof(TypeToRegisterSet), [](RegNumT RegNum) -> IceString { |
// This function simply removes ", " from the register name. |
IceString Name = RegARM32::getRegName(RegNum); |
constexpr const char RegSeparator[] = ", "; |
@@ -372,7 +373,8 @@ void copyRegAllocFromInfWeightVariable64On32(const VarList &Vars) { |
if (!Var64->hasReg()) { |
continue; |
} |
- SizeT FirstReg = RegARM32::getI64PairFirstGPRNum(Var->getRegNum()); |
+ auto FirstReg = |
+ RegNumT::fixme(RegARM32::getI64PairFirstGPRNum(Var->getRegNum())); |
// This assumes little endian. |
Variable *Lo = Var64->getLo(); |
Variable *Hi = Var64->getHi(); |
@@ -382,7 +384,7 @@ void copyRegAllocFromInfWeightVariable64On32(const VarList &Vars) { |
} |
Lo->setRegNum(FirstReg); |
Lo->setMustHaveReg(); |
- Hi->setRegNum(FirstReg + 1); |
+ Hi->setRegNum(RegNumT::fixme(FirstReg + 1)); |
Hi->setMustHaveReg(); |
} |
} |
@@ -390,7 +392,7 @@ void copyRegAllocFromInfWeightVariable64On32(const VarList &Vars) { |
uint32_t TargetARM32::getCallStackArgumentsSizeBytes(const InstCall *Call) { |
TargetARM32::CallingConv CC; |
- int32_t DummyReg; |
+ RegNumT DummyReg; |
size_t OutArgsSizeBytes = 0; |
for (SizeT i = 0, NumArgs = Call->getNumArgs(); i < NumArgs; ++i) { |
Operand *Arg = legalizeUndef(Call->getArg(i)); |
@@ -902,13 +904,12 @@ bool TargetARM32::doBranchOpt(Inst *I, const CfgNode *NextNode) { |
return false; |
} |
-IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const { |
- assert(RegNum < RegARM32::Reg_NUM); |
+IceString TargetARM32::getRegName(RegNumT RegNum, Type Ty) const { |
(void)Ty; |
return RegARM32::getRegName(RegNum); |
} |
-Variable *TargetARM32::getPhysicalRegister(SizeT RegNum, Type Ty) { |
+Variable *TargetARM32::getPhysicalRegister(RegNumT RegNum, Type Ty) { |
static const Type DefaultType[] = { |
#define X(val, encode, name, cc_arg, scratch, preserved, stackptr, frameptr, \ |
isGPR, isInt, isI64Pair, isFP32, isFP64, isVec128, alias_init) \ |
@@ -919,14 +920,13 @@ Variable *TargetARM32::getPhysicalRegister(SizeT RegNum, Type Ty) { |
#undef X |
}; |
- assert(RegNum < RegARM32::Reg_NUM); |
if (Ty == IceType_void) { |
- assert(RegNum < llvm::array_lengthof(DefaultType)); |
+ assert(unsigned(RegNum) < llvm::array_lengthof(DefaultType)); |
Ty = DefaultType[RegNum]; |
} |
if (PhysicalRegisters[Ty].empty()) |
PhysicalRegisters[Ty].resize(RegARM32::Reg_NUM); |
- assert(RegNum < PhysicalRegisters[Ty].size()); |
+ assert(unsigned(RegNum) < PhysicalRegisters[Ty].size()); |
Variable *Reg = PhysicalRegisters[Ty][RegNum]; |
if (Reg == nullptr) { |
Reg = Func->makeVariable(Ty); |
@@ -963,8 +963,8 @@ void TargetARM32::emitVariable(const Variable *Var) const { |
} |
assert(!Var->isRematerializable()); |
int32_t Offset = Var->getStackOffset(); |
- int32_t BaseRegNum = Var->getBaseRegNum(); |
- if (BaseRegNum == Variable::NoRegister) { |
+ auto BaseRegNum = Var->getBaseRegNum(); |
+ if (BaseRegNum == RegNumT::NoRegister) { |
BaseRegNum = getFrameOrStackReg(); |
} |
const Type VarTy = Var->getType(); |
@@ -984,8 +984,8 @@ TargetARM32::CallingConv::CallingConv() |
FP64Args(FP64ArgInitializer.rbegin(), FP64ArgInitializer.rend()), |
Vec128Args(Vec128ArgInitializer.rbegin(), Vec128ArgInitializer.rend()) {} |
-bool TargetARM32::CallingConv::argInGPR(Type Ty, int32_t *Reg) { |
- CfgVector<SizeT> *Source; |
+bool TargetARM32::CallingConv::argInGPR(Type Ty, RegNumT *Reg) { |
+ CfgVector<RegNumT> *Source; |
switch (Ty) { |
default: { |
@@ -1019,15 +1019,15 @@ bool TargetARM32::CallingConv::argInGPR(Type Ty, int32_t *Reg) { |
// we remove all of its aliases from the pool of available GPRs. This has the |
// effect of computing the "closure" on the GPR registers. |
void TargetARM32::CallingConv::discardUnavailableGPRsAndTheirAliases( |
- CfgVector<SizeT> *Regs) { |
+ CfgVector<RegNumT> *Regs) { |
while (!Regs->empty() && GPRegsUsed[Regs->back()]) { |
GPRegsUsed |= RegisterAliases[Regs->back()]; |
Regs->pop_back(); |
} |
} |
-bool TargetARM32::CallingConv::argInVFP(Type Ty, int32_t *Reg) { |
- CfgVector<SizeT> *Source; |
+bool TargetARM32::CallingConv::argInVFP(Type Ty, RegNumT *Reg) { |
+ CfgVector<RegNumT> *Source; |
switch (Ty) { |
default: { |
@@ -1057,7 +1057,7 @@ bool TargetARM32::CallingConv::argInVFP(Type Ty, int32_t *Reg) { |
// Arguments in VFP registers are not packed, so we don't mark the popped |
// registers' aliases as unavailable. |
void TargetARM32::CallingConv::discardUnavailableVFPRegs( |
- CfgVector<SizeT> *Regs) { |
+ CfgVector<RegNumT> *Regs) { |
while (!Regs->empty() && VFPRegsUsed[Regs->back()]) { |
Regs->pop_back(); |
} |
@@ -1076,7 +1076,7 @@ void TargetARM32::lowerArguments() { |
for (SizeT I = 0, E = Args.size(); I < E; ++I) { |
Variable *Arg = Args[I]; |
Type Ty = Arg->getType(); |
- int RegNum; |
+ RegNumT RegNum; |
if (isScalarIntegerType(Ty)) { |
if (!CC.argInGPR(Ty, &RegNum)) { |
continue; |
@@ -1100,9 +1100,9 @@ void TargetARM32::lowerArguments() { |
auto *RegisterArg64 = llvm::cast<Variable64On32>(RegisterArg); |
RegisterArg64->initHiLo(Func); |
RegisterArg64->getLo()->setRegNum( |
- RegARM32::getI64PairFirstGPRNum(RegNum)); |
+ RegNumT::fixme(RegARM32::getI64PairFirstGPRNum(RegNum))); |
RegisterArg64->getHi()->setRegNum( |
- RegARM32::getI64PairSecondGPRNum(RegNum)); |
+ RegNumT::fixme(RegARM32::getI64PairSecondGPRNum(RegNum))); |
} break; |
} |
Context.insert<InstAssign>(Arg, RegisterArg); |
@@ -1287,7 +1287,7 @@ void TargetARM32::addProlog(CfgNode *Node) { |
continue; |
} |
++NumCallee; |
- Variable *PhysicalRegister = getPhysicalRegister(Reg); |
+ Variable *PhysicalRegister = getPhysicalRegister(RegNumT::fromInt(Reg)); |
PreservedRegsSizeBytes += |
typeWidthInBytesOnStack(PhysicalRegister->getType()); |
PreservedRegsInClass->push_back(PhysicalRegister); |
@@ -1362,7 +1362,7 @@ void TargetARM32::addProlog(CfgNode *Node) { |
size_t InArgsSizeBytes = 0; |
TargetARM32::CallingConv CC; |
for (Variable *Arg : Args) { |
- int32_t DummyReg; |
+ RegNumT DummyReg; |
const Type Ty = Arg->getType(); |
// Skip arguments passed in registers. |
@@ -1481,7 +1481,7 @@ bool TargetARM32::isLegalMemOffset(Type Ty, int32_t Offset) const { |
} |
Variable *TargetARM32::PostLoweringLegalizer::newBaseRegister( |
- Variable *Base, int32_t Offset, int32_t ScratchRegNum) { |
+ Variable *Base, int32_t Offset, RegNumT ScratchRegNum) { |
// Legalize will likely need a movw/movt combination, but if the top bits are |
// all 0 from negating the offset and subtracting, we could use that instead. |
const bool ShouldSub = Offset != 0 && (-Offset & 0xFFFF0000) == 0; |
@@ -1500,7 +1500,7 @@ Variable *TargetARM32::PostLoweringLegalizer::newBaseRegister( |
if (ScratchRegNum == Target->getReservedTmpReg()) { |
const bool BaseIsStackOrFramePtr = |
- Base->getRegNum() == static_cast<int32_t>(Target->getFrameOrStackReg()); |
+ Base->getRegNum() == Target->getFrameOrStackReg(); |
// There is currently no code path that would trigger this assertion, so we |
// leave this assertion here in case it is ever violated. This is not a |
// fatal error (thus the use of assert() and not llvm::report_fatal_error) |
@@ -1607,10 +1607,9 @@ void TargetARM32::PostLoweringLegalizer::legalizeMov(InstARM32Mov *MovInstr) { |
// ExtraOffset is only needed for frame-pointer based frames as we have |
// to account for spill storage. |
- const int32_t ExtraOffset = |
- (static_cast<SizeT>(Var->getRegNum()) == Target->getFrameReg()) |
- ? Target->getFrameFixedAllocaOffset() |
- : 0; |
+ const int32_t ExtraOffset = (Var->getRegNum() == Target->getFrameReg()) |
+ ? Target->getFrameFixedAllocaOffset() |
+ : 0; |
const int32_t Offset = Var->getStackOffset() + ExtraOffset; |
Variable *Base = Target->getPhysicalRegister(Var->getRegNum()); |
@@ -1678,10 +1677,9 @@ TargetARM32::PostLoweringLegalizer::legalizeMemOperand(OperandARM32Mem *Mem, |
Variable *Base = Mem->getBase(); |
int32_t Offset = Mem->isRegReg() ? 0 : Mem->getOffset()->getValue(); |
if (Base->isRematerializable()) { |
- const int32_t ExtraOffset = |
- (static_cast<SizeT>(Base->getRegNum()) == Target->getFrameReg()) |
- ? Target->getFrameFixedAllocaOffset() |
- : 0; |
+ const int32_t ExtraOffset = (Base->getRegNum() == Target->getFrameReg()) |
+ ? Target->getFrameFixedAllocaOffset() |
+ : 0; |
Offset += Base->getStackOffset() + ExtraOffset; |
Base = Target->getPhysicalRegister(Base->getRegNum()); |
assert(!Base->isRematerializable()); |
@@ -1901,7 +1899,7 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
RegSetMask Exclude) const { |
llvm::SmallBitVector Registers(RegARM32::Reg_NUM); |
- for (int32_t i = 0; i < RegARM32::Reg_NUM; ++i) { |
+ for (uint32_t i = 0; i < RegARM32::Reg_NUM; ++i) { |
const auto &Entry = RegARM32::RegTable[i]; |
if (Entry.Scratch && (Include & RegSet_CallerSave)) |
Registers[i] = true; |
@@ -3361,8 +3359,8 @@ void TargetARM32::lowerCall(const InstCall *Instr) { |
// Assign arguments to registers and stack. Also reserve stack. |
TargetARM32::CallingConv CC; |
// Pair of Arg Operand -> GPR number assignments. |
- llvm::SmallVector<std::pair<Operand *, int32_t>, NumGPRArgs> GPRArgs; |
- llvm::SmallVector<std::pair<Operand *, int32_t>, NumFP32Args> FPArgs; |
+ llvm::SmallVector<std::pair<Operand *, RegNumT>, NumGPRArgs> GPRArgs; |
+ llvm::SmallVector<std::pair<Operand *, RegNumT>, NumFP32Args> FPArgs; |
// Pair of Arg Operand -> stack offset. |
llvm::SmallVector<std::pair<Operand *, int32_t>, 8> StackArgs; |
size_t ParameterAreaSizeBytes = 0; |
@@ -3373,7 +3371,7 @@ void TargetARM32::lowerCall(const InstCall *Instr) { |
Operand *Arg = legalizeUndef(Instr->getArg(i)); |
const Type Ty = Arg->getType(); |
bool InReg = false; |
- int32_t Reg; |
+ RegNumT Reg; |
if (isScalarIntegerType(Ty)) { |
InReg = CC.argInGPR(Ty, &Reg); |
} else { |
@@ -3391,10 +3389,10 @@ void TargetARM32::lowerCall(const InstCall *Instr) { |
if (Ty == IceType_i64) { |
Operand *Lo = loOperand(Arg); |
Operand *Hi = hiOperand(Arg); |
- GPRArgs.push_back( |
- std::make_pair(Lo, RegARM32::getI64PairFirstGPRNum(Reg))); |
- GPRArgs.push_back( |
- std::make_pair(Hi, RegARM32::getI64PairSecondGPRNum(Reg))); |
+ GPRArgs.push_back(std::make_pair( |
+ Lo, RegNumT::fixme(RegARM32::getI64PairFirstGPRNum(Reg)))); |
+ GPRArgs.push_back(std::make_pair( |
+ Hi, RegNumT::fixme(RegARM32::getI64PairSecondGPRNum(Reg)))); |
} else if (isScalarIntegerType(Ty)) { |
GPRArgs.push_back(std::make_pair(Arg, Reg)); |
} else { |
@@ -5457,7 +5455,7 @@ void TargetARM32::prelowerPhis() { |
PhiLowering::prelowerPhis32Bit<TargetARM32>(this, Context.getNode(), Func); |
} |
-Variable *TargetARM32::makeVectorOfZeros(Type Ty, int32_t RegNum) { |
+Variable *TargetARM32::makeVectorOfZeros(Type Ty, RegNumT RegNum) { |
Variable *Reg = makeReg(Ty, RegNum); |
Context.insert<InstFakeDef>(Reg); |
UnimplementedError(Func->getContext()->getFlags()); |
@@ -5466,7 +5464,7 @@ Variable *TargetARM32::makeVectorOfZeros(Type Ty, int32_t RegNum) { |
// Helper for legalize() to emit the right code to lower an operand to a |
// register of the appropriate type. |
-Variable *TargetARM32::copyToReg(Operand *Src, int32_t RegNum) { |
+Variable *TargetARM32::copyToReg(Operand *Src, RegNumT RegNum) { |
Type Ty = Src->getType(); |
Variable *Reg = makeReg(Ty, RegNum); |
if (auto *Mem = llvm::dyn_cast<OperandARM32Mem>(Src)) { |
@@ -5479,7 +5477,7 @@ Variable *TargetARM32::copyToReg(Operand *Src, int32_t RegNum) { |
// TODO(jpp): remove unneeded else clauses in legalize. |
Operand *TargetARM32::legalize(Operand *From, LegalMask Allowed, |
- int32_t RegNum) { |
+ RegNumT RegNum) { |
Type Ty = From->getType(); |
// Assert that a physical register is allowed. To date, all calls to |
// legalize() allow a physical register. Legal_Flex converts registers to the |
@@ -5487,7 +5485,7 @@ Operand *TargetARM32::legalize(Operand *From, LegalMask Allowed, |
assert(Allowed & Legal_Reg); |
// Copied ipsis literis from TargetX86Base<Machine>. |
- if (RegNum == Variable::NoRegister) { |
+ if (RegNum == RegNumT::NoRegister) { |
if (Variable *Subst = getContext().availabilityGet(From)) { |
// At this point we know there is a potential substitution available. |
if (!Subst->isRematerializable() && Subst->mustHaveReg() && |
@@ -5671,7 +5669,7 @@ Operand *TargetARM32::legalize(Operand *From, LegalMask Allowed, |
// register, or |
// RegNum is required and Var->getRegNum() doesn't match. |
if ((!(Allowed & Legal_Mem) && !MustHaveRegister) || |
- (RegNum != Variable::NoRegister && RegNum != Var->getRegNum())) { |
+ (RegNum != RegNumT::NoRegister && RegNum != Var->getRegNum())) { |
From = copyToReg(From, RegNum); |
} |
return From; |
@@ -5682,12 +5680,12 @@ Operand *TargetARM32::legalize(Operand *From, LegalMask Allowed, |
} |
/// Provide a trivial wrapper to legalize() for this common usage. |
-Variable *TargetARM32::legalizeToReg(Operand *From, int32_t RegNum) { |
+Variable *TargetARM32::legalizeToReg(Operand *From, RegNumT RegNum) { |
return llvm::cast<Variable>(legalize(From, Legal_Reg, RegNum)); |
} |
/// Legalize undef values to concrete values. |
-Operand *TargetARM32::legalizeUndef(Operand *From, int32_t RegNum) { |
+Operand *TargetARM32::legalizeUndef(Operand *From, RegNumT RegNum) { |
Type Ty = From->getType(); |
if (llvm::isa<ConstantUndef>(From)) { |
// Lower undefs to zero. Another option is to lower undefs to an |
@@ -5735,12 +5733,12 @@ Variable64On32 *TargetARM32::makeI64RegPair() { |
return Reg; |
} |
-Variable *TargetARM32::makeReg(Type Type, int32_t RegNum) { |
+Variable *TargetARM32::makeReg(Type Type, RegNumT RegNum) { |
// There aren't any 64-bit integer registers for ARM32. |
assert(Type != IceType_i64); |
- assert(AllowTemporaryWithNoReg || RegNum != Variable::NoRegister); |
+ assert(AllowTemporaryWithNoReg || RegNum != RegNumT::NoRegister); |
Variable *Reg = Func->makeVariable(Type); |
- if (RegNum == Variable::NoRegister) |
+ if (RegNum == RegNumT::NoRegister) |
Reg->setMustHaveReg(); |
else |
Reg->setRegNum(RegNum); |
@@ -5748,7 +5746,7 @@ Variable *TargetARM32::makeReg(Type Type, int32_t RegNum) { |
} |
void TargetARM32::alignRegisterPow2(Variable *Reg, uint32_t Align, |
- int32_t TmpRegNum) { |
+ RegNumT TmpRegNum) { |
assert(llvm::isPowerOf2_32(Align)); |
uint32_t RotateAmt; |
uint32_t Immed_8; |
@@ -5775,7 +5773,7 @@ void TargetARM32::postLower() { |
} |
void TargetARM32::makeRandomRegisterPermutation( |
- llvm::SmallVectorImpl<int32_t> &Permutation, |
+ llvm::SmallVectorImpl<RegNumT> &Permutation, |
const llvm::SmallBitVector &ExcludeRegisters, uint64_t Salt) const { |
(void)Permutation; |
(void)ExcludeRegisters; |