[llvm] r301943 - [Hexagon] Check for .cur def without use without using a map data structure
Krzysztof Parzyszek via llvm-commits
llvm-commits at lists.llvm.org
Tue May 2 10:51:15 PDT 2017
Author: kparzysz
Date: Tue May 2 12:51:14 2017
New Revision: 301943
URL: http://llvm.org/viewvc/llvm-project?rev=301943&view=rev
Log:
[Hexagon] Check for .cur def without use without using a map data structure
Patch by Colin LeMahieu.
Modified:
llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp
llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h
Modified: llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp?rev=301943&r1=301942&r2=301943&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp (original)
+++ llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp Tue May 2 12:51:14 2017
@@ -159,12 +159,6 @@ void HexagonMCChecker::init(MCInst const
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 FullCh
bool chkNV = checkNewValues();
bool chkR = checkRegisters();
bool chkRRO = checkRegistersReadOnly();
+ checkRegisterCurDefs();
bool chkS = checkSolo();
bool chkSh = true;
if (FullCheck)
@@ -396,6 +391,43 @@ bool HexagonMCChecker::checkRegistersRea
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;
Modified: llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h?rev=301943&r1=301942&r2=301943&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h (original)
+++ llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.h Tue May 2 12:51:14 2017
@@ -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();
More information about the llvm-commits
mailing list