summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Hexagon/HexagonBitTracker.cpp
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-09-25 19:12:55 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-09-25 19:12:55 +0000
commit7e604deca9470dfc09e222a56a303c9e837ef0eb (patch)
treef92db6ccce09e9e8c604ab5cea1279e4e368d9f4 /llvm/lib/Target/Hexagon/HexagonBitTracker.cpp
parent9941ee9529da345f6d2ea2d8b586c6390ac4a0be (diff)
downloadbcm5719-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.cpp46
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 {
OpenPOWER on IntegriCloud