diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-09-25 19:12:55 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-09-25 19:12:55 +0000 |
| commit | 7e604deca9470dfc09e222a56a303c9e837ef0eb (patch) | |
| tree | f92db6ccce09e9e8c604ab5cea1279e4e368d9f4 /llvm/lib/Target/Hexagon/HexagonBitTracker.cpp | |
| parent | 9941ee9529da345f6d2ea2d8b586c6390ac4a0be (diff) | |
| download | bcm5719-llvm-7e604deca9470dfc09e222a56a303c9e837ef0eb.tar.gz bcm5719-llvm-7e604deca9470dfc09e222a56a303c9e837ef0eb.zip | |
[Hexagon] Better determination of register classes in bit tracker
Add two callbacks to MachineEvaluator, so that specific implementations
can specify more details about register classes:
- composeWithSubRegIndex(RC,Idx), to provide the register class for a
register from RC used in conjunction with a subregister index Idx.
- getPhysRegBitWidth(Reg), to provide the size in bits of the given
physical register.
llvm-svn: 314136
Diffstat (limited to 'llvm/lib/Target/Hexagon/HexagonBitTracker.cpp')
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonBitTracker.cpp | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonBitTracker.cpp b/llvm/lib/Target/Hexagon/HexagonBitTracker.cpp index ea438c6e462..7e8fc83e96f 100644 --- a/llvm/lib/Target/Hexagon/HexagonBitTracker.cpp +++ b/llvm/lib/Target/Hexagon/HexagonBitTracker.cpp @@ -11,6 +11,7 @@ #include "Hexagon.h" #include "HexagonInstrInfo.h" #include "HexagonRegisterInfo.h" +#include "HexagonSubtarget.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstr.h" @@ -91,8 +92,6 @@ HexagonEvaluator::HexagonEvaluator(const HexagonRegisterInfo &tri, } BT::BitMask HexagonEvaluator::mask(unsigned Reg, unsigned Sub) const { - using namespace Hexagon; - if (Sub == 0) return MachineEvaluator::mask(Reg, 0); const TargetRegisterClass &RC = *MRI.getRegClass(Reg); @@ -101,8 +100,8 @@ BT::BitMask HexagonEvaluator::mask(unsigned Reg, unsigned Sub) const { auto &HRI = static_cast<const HexagonRegisterInfo&>(TRI); bool IsSubLo = (Sub == HRI.getHexagonSubRegIndex(RC, Hexagon::ps_sub_lo)); switch (ID) { - case DoubleRegsRegClassID: - case HvxWRRegClassID: + case Hexagon::DoubleRegsRegClassID: + case Hexagon::HvxWRRegClassID: return IsSubLo ? BT::BitMask(0, RW-1) : BT::BitMask(RW, 2*RW-1); default: @@ -115,6 +114,45 @@ BT::BitMask HexagonEvaluator::mask(unsigned Reg, unsigned Sub) const { llvm_unreachable("Unexpected register/subregister"); } +uint16_t HexagonEvaluator::getPhysRegBitWidth(unsigned Reg) const { + assert(TargetRegisterInfo::isPhysicalRegister(Reg)); + + using namespace Hexagon; + for (auto &RC : {HvxVRRegClass, HvxWRRegClass, HvxQRRegClass}) + if (RC.contains(Reg)) + return TRI.getRegSizeInBits(RC); + // Default treatment for other physical registers. + if (const TargetRegisterClass *RC = TRI.getMinimalPhysRegClass(Reg)) + return TRI.getRegSizeInBits(*RC); + + StringRef E = "Unhandled physical register"; + llvm_unreachable((Twine(E) + TRI.getName(Reg)).str().c_str()); +} + +const TargetRegisterClass &HexagonEvaluator::composeWithSubRegIndex( + const TargetRegisterClass &RC, unsigned Idx) const { + if (Idx == 0) + return RC; + + const auto &HRI = static_cast<const HexagonRegisterInfo&>(TRI); + bool IsSubLo = (Idx == HRI.getHexagonSubRegIndex(RC, Hexagon::ps_sub_lo)); + bool IsSubHi = (Idx == HRI.getHexagonSubRegIndex(RC, Hexagon::ps_sub_hi)); + assert(IsSubLo != IsSubHi && "Must refer to either low or high subreg"); + + switch (RC.getID()) { + case Hexagon::DoubleRegsRegClassID: + return Hexagon::IntRegsRegClass; + case Hexagon::HvxWRRegClassID: + return Hexagon::HvxVRRegClass; + default: + break; + } +#ifndef DEBUG + dbgs() << "Reg class id: " << RC.getID() << " idx: " << Idx << '\n'; +#endif + llvm_unreachable("Unimplemented combination of reg class/subreg idx"); +} + namespace { class RegisterRefs { |

