summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-05-02 17:51:14 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-05-02 17:51:14 +0000
commit107f82d128743d7d446552c9ca646e98973e427c (patch)
tree3c6ac2e17f67f5e485a2101ebc5f0ca9a18b4a5e /llvm/lib
parent7c2c4097a0f1b1db8f7167ea4880bada85082931 (diff)
downloadbcm5719-llvm-107f82d128743d7d446552c9ca646e98973e427c.tar.gz
bcm5719-llvm-107f82d128743d7d446552c9ca646e98973e427c.zip
[Hexagon] Check for .cur def without use without using a map data structure
Patch by Colin LeMahieu. llvm-svn: 301943
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp57
-rw-r--r--llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h9
2 files changed, 42 insertions, 24 deletions
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp
index 33d73f1819c..f138a7c3e2f 100644
--- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp
+++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp
@@ -159,12 +159,6 @@ void HexagonMCChecker::init(MCInst const &MCI) {
isPredicateRegister(*SRI))
// Some insns produce predicates too late to be used in the same packet.
LatePreds.insert(*SRI);
- else if (i == 0 && HexagonMCInstrInfo::isCVINew(MCII, MCI) &&
- MCID.mayLoad())
- // Current loads should be used in the same packet.
- // TODO: relies on the impossibility of a current and a temporary loads
- // in the same packet.
- CurDefs.insert(*SRI), Defs[*SRI].insert(PredSense(PredReg, isTrue));
else if (i == 0 && llvm::HexagonMCInstrInfo::getType(MCII, MCI) ==
HexagonII::TypeCVI_VM_TMP_LD)
// Temporary loads should be used in the same packet, but don't commit
@@ -252,6 +246,7 @@ bool HexagonMCChecker::check(bool FullCheck) {
bool chkNV = checkNewValues();
bool chkR = checkRegisters();
bool chkRRO = checkRegistersReadOnly();
+ checkRegisterCurDefs();
bool chkS = checkSolo();
bool chkSh = true;
if (FullCheck)
@@ -396,6 +391,43 @@ bool HexagonMCChecker::checkRegistersReadOnly() {
return true;
}
+bool HexagonMCChecker::registerUsed(MCInst const &Inst, unsigned Register) {
+ if (HexagonMCInstrInfo::isDuplex(MCII, Inst)) {
+ if (registerUsed(*Inst.getOperand(0).getInst(), Register) ||
+ registerUsed(*Inst.getOperand(1).getInst(), Register))
+ return true;
+ } else {
+ unsigned Defs = HexagonMCInstrInfo::getDesc(MCII, Inst).getNumDefs();
+ for (unsigned j = Defs, n = Inst.getNumOperands(); j < n; ++j) {
+ MCOperand const &Operand = Inst.getOperand(j);
+ if (Operand.isReg() && Operand.getReg() == Register)
+ return true;
+ }
+ }
+ return false;
+}
+
+bool HexagonMCChecker::registerUsed(unsigned Register) {
+ auto Range = HexagonMCInstrInfo::bundleInstructions(MCB);
+ return std::any_of(Range.begin(), Range.end(), [&](MCOperand const &Operand) {
+ return registerUsed(*Operand.getInst(), Register);
+ });
+}
+
+void HexagonMCChecker::checkRegisterCurDefs() {
+ for (auto const &I : HexagonMCInstrInfo::bundleInstructions(MCB)) {
+ MCInst const &Inst = *I.getInst();
+ if (HexagonMCInstrInfo::isCVINew(MCII, Inst) &&
+ HexagonMCInstrInfo::getDesc(MCII, Inst).mayLoad()) {
+ unsigned Register = Inst.getOperand(0).getReg();
+ if (!registerUsed(Register))
+ reportWarning("Register `" + llvm::Twine(RI.getName(Register)) +
+ "' used with `.cur' "
+ "but not used in the same packet");
+ }
+ }
+}
+
// Check for legal register uses and definitions.
bool HexagonMCChecker::checkRegisters() {
// Check for proper register definitions.
@@ -456,19 +488,6 @@ bool HexagonMCChecker::checkRegisters() {
}
}
- // Check for use of current definitions.
- for (const auto &I : CurDefs) {
- unsigned R = I;
-
- if (!Uses.count(R)) {
- // Warn on an unused current definition.
- reportWarning("register `" + llvm::Twine(RI.getName(R)) +
- "' used with `.cur' "
- "but not used in the same packet");
- return true;
- }
- }
-
// Check for use of temporary definitions.
for (const auto &I : TmpDefs) {
unsigned R = I;
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h
index d0238691cdc..c67a217afbe 100644
--- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h
+++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h
@@ -78,10 +78,6 @@ class HexagonMCChecker {
typedef std::set<unsigned>::iterator SoftDefsIterator;
std::set<unsigned> SoftDefs;
- /// Set of current definitions committed to the register file.
- typedef std::set<unsigned>::iterator CurDefsIterator;
- std::set<unsigned> CurDefs;
-
/// Set of temporary definitions not committed to the register file.
typedef std::set<unsigned>::iterator TmpDefsIterator;
std::set<unsigned> TmpDefs;
@@ -109,13 +105,16 @@ class HexagonMCChecker {
void init();
void init(MCInst const &);
void initReg(MCInst const &, unsigned, unsigned &PredReg, bool &isTrue);
-
+
+ bool registerUsed(unsigned Register);
+ bool registerUsed(MCInst const &Inst, unsigned Register);
// Checks performed.
bool checkBranches();
bool checkPredicates();
bool checkNewValues();
bool checkRegisters();
bool checkRegistersReadOnly();
+ void checkRegisterCurDefs();
bool checkSolo();
bool checkShuffle();
bool checkSlots();
OpenPOWER on IntegriCloud