Chromium Code Reviews| Index: src/IceTargetLoweringARM32.cpp |
| diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp |
| index 878f95ec059fbcf5c1e186cd4ff77b8d003cc0ad..d12a339fec0f0f1e24debaa52e8d31b47a87a6ae 100644 |
| --- a/src/IceTargetLoweringARM32.cpp |
| +++ b/src/IceTargetLoweringARM32.cpp |
| @@ -1828,11 +1828,70 @@ Operand *TargetARM32::hiOperand(Operand *Operand) { |
| return nullptr; |
| } |
| +namespace { |
| + |
| +void applyUseRestrictedRegisters( |
| + llvm::SmallBitVector &Registers, |
| + const std::unordered_set<std::string> &RestrictedUses) { |
| + assert(Registers.size() == RegARM32::Reg_NUM); |
| + |
| + llvm::SmallBitVector GPKeepRegisters(RegARM32::Reg_NUM); |
|
Jim Stichnoth
2016/01/10 16:51:25
I think it might not be too hard to generalize thi
Karl
2016/01/12 23:44:04
Ok. Refactored the code to put this function in Ic
|
| + llvm::SmallBitVector NotGPRegisters(RegARM32::Reg_NUM); |
| + llvm::SmallBitVector SKeepRegisters(RegARM32::Reg_NUM); |
| + llvm::SmallBitVector NotSRegisters(RegARM32::Reg_NUM); |
| + llvm::SmallBitVector DKeepRegisters(RegARM32::Reg_NUM); |
| + llvm::SmallBitVector NotDRegisters(RegARM32::Reg_NUM); |
| + llvm::SmallBitVector VectorKeepRegisters(RegARM32::Reg_NUM); |
| + llvm::SmallBitVector NotVectorRegisters(RegARM32::Reg_NUM); |
|
Jim Stichnoth
2016/01/10 16:51:25
Do we need IsI64Pair as well? If so, there are so
John
2016/01/11 15:43:26
I64 pairs should probably be turned off by disabli
Karl
2016/01/12 23:44:05
Kept the register pairs, so that all registers can
|
| + for (size_t i = 0; i < RegARM32::Reg_NUM; ++i) { |
| + const auto &Entry = RegARM32::Table[i]; |
| + NotGPRegisters[i] = !Entry.IsGPR; |
|
John
2016/01/11 15:43:26
Register pairs are not being handled here at all.
Karl
2016/01/12 23:44:04
Fixed this by adding enum "RegClass" and static me
|
| + NotSRegisters[i] = !Entry.IsFP32; |
| + NotDRegisters[i] = !Entry.IsFP64; |
| + NotVectorRegisters[i] = !Entry.IsVec128; |
| + if (RestrictedUses.find(Entry.Name) != RestrictedUses.end()) { |
| + GPKeepRegisters[i] = Entry.IsGPR; |
| + SKeepRegisters[i] = Entry.IsFP32; |
| + DKeepRegisters[i] = Entry.IsFP64; |
| + VectorKeepRegisters[i] = Entry.IsVec128; |
| + } |
| + } |
| + if (GPKeepRegisters.any()) { |
| + Registers &= NotGPRegisters; |
| + Registers |= GPKeepRegisters; |
| + } |
| + if (SKeepRegisters.any()) { |
| + Registers &= NotSRegisters; |
| + Registers |= SKeepRegisters; |
| + } |
| + if (DKeepRegisters.any()) { |
| + Registers &= NotDRegisters; |
| + Registers |= DKeepRegisters; |
| + } |
| + if (VectorKeepRegisters.any()) { |
| + Registers &= NotVectorRegisters; |
| + Registers |= VectorKeepRegisters; |
| + } |
| +} |
| + |
| +void applyExcludedRegisters(llvm::SmallBitVector &Registers, |
|
John
2016/01/11 15:43:26
pass registers by pointer (i.e., SmallBitVector *)
Karl
2016/01/12 23:44:05
Removed. Now refactored into Ice::TargetLowering::
|
| + const std::unordered_set<std::string> Excluded) { |
|
Jim Stichnoth
2016/01/10 16:51:26
&Excluded
Karl
2016/01/12 23:44:05
No longer applicable.
|
| + for (size_t i = 0; i < RegARM32::Reg_NUM; ++i) { |
| + const auto &Entry = RegARM32::Table[i]; |
| + if (Excluded.find(Entry.Name) != Excluded.end()) { |
|
John
2016/01/11 15:43:26
nit: this is less efficient than
Excluded.count(E
Karl
2016/01/12 23:44:04
Changed code to use method count rather than find.
|
| + if (Registers[i]) |
| + Registers[i] = 0; |
|
Jim Stichnoth
2016/01/10 16:51:25
Registers[i] = false;
Might as well remove the "i
Karl
2016/01/12 23:44:05
Acknowledged.
|
| + } |
| + } |
| +} |
| + |
| +} // end of anonymous namespace |
| + |
| llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
| RegSetMask Exclude) const { |
| llvm::SmallBitVector Registers(RegARM32::Reg_NUM); |
| - for (int i = 0; i < RegARM32::Reg_NUM; ++i) { |
| + for (size_t i = 0; i < RegARM32::Reg_NUM; ++i) { |
|
John
2016/01/11 15:43:26
why? just curious...
Karl
2016/01/12 23:44:05
Actually, I probably should have used SizeT. I did
|
| const auto &Entry = RegARM32::Table[i]; |
| if (Entry.Scratch && (Include & RegSet_CallerSave)) |
| Registers[i] = true; |
| @@ -1852,6 +1911,16 @@ llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, |
| Registers[i] = false; |
| } |
| + const std::unordered_set<std::string> &RestrictedUses = |
|
Jim Stichnoth
2016/01/10 16:51:25
A problem with calculating the restrictions here i
John
2016/01/11 15:43:26
s/RestrictedUses/RestrictedRegisters
s/ExcludedUse
Karl
2016/01/12 23:44:05
Factored out into staticInit() that sets static fi
|
| + Ctx->getFlags().getUseRestrictedRegisters(); |
| + if (!RestrictedUses.empty()) |
| + applyUseRestrictedRegisters(Registers, RestrictedUses); |
| + |
| + const std::unordered_set<std::string> &ExcludedUses = |
|
John
2016/01/11 15:43:26
I **really** wish we used `auto' here and above.
Karl
2016/01/12 23:44:05
Acknowledged.
|
| + Ctx->getFlags().getExcludedRegisters(); |
| + if (!ExcludedUses.empty()) |
| + applyExcludedRegisters(Registers, ExcludedUses); |
| + |
| return Registers; |
| } |