[llvm] [Hexagon] Drop NodeAddr::operator<, fix bad asserts directives (PR #210192)

via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 17 08:28:35 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-hexagon

Author: Fateme Hosseini (fhossein-quic)

<details>
<summary>Changes</summary>

Removed NodeAddr::operator< that was added by mistake in #<!-- -->207082. Nothing needed it once HexagonPostRAHandleQFP.cpp's containers went back to keying on NodeId.
Also removed the contradictory UNSUPPORTED+REQUIRES asserts in two tests; subreg2 still crashes so it's XFAIL'd for now.

---
Full diff: https://github.com/llvm/llvm-project/pull/210192.diff


4 Files Affected:

- (modified) llvm/include/llvm/CodeGen/RDFGraph.h (-2) 
- (modified) llvm/lib/Target/Hexagon/HexagonPostRAHandleQFP.cpp (+12-12) 
- (modified) llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg2.ll (+2-2) 
- (modified) llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg3.ll (-2) 


``````````diff
diff --git a/llvm/include/llvm/CodeGen/RDFGraph.h b/llvm/include/llvm/CodeGen/RDFGraph.h
index bd1bcc87b0db6..27b5795b8ed2d 100644
--- a/llvm/include/llvm/CodeGen/RDFGraph.h
+++ b/llvm/include/llvm/CodeGen/RDFGraph.h
@@ -358,8 +358,6 @@ template <typename T> struct NodeAddr {
     return !operator==(NA);
   }
 
-  bool operator<(const NodeAddr<T> &NA) const { return Id < NA.Id; }
-
   T Addr = nullptr;
   NodeId Id = 0;
 };
diff --git a/llvm/lib/Target/Hexagon/HexagonPostRAHandleQFP.cpp b/llvm/lib/Target/Hexagon/HexagonPostRAHandleQFP.cpp
index 4fce23d4fca81..242883ef32f47 100644
--- a/llvm/lib/Target/Hexagon/HexagonPostRAHandleQFP.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonPostRAHandleQFP.cpp
@@ -191,7 +191,7 @@ class HexagonPostRAHandleQFP : public MachineFunctionPass {
   MapVector<MachineInstr *, unsigned> QFNonSatMIs;
 
   // Stores the qf-generating vmul/vadd/etc. nodes with mutiple reaching defs
-  std::set<NodeAddr<StmtNode *>> PossibleMultiReachDefs;
+  std::set<NodeId> PossibleMultiReachDefs;
   // Qf generating instructions to ignore. Do not insert conversion instruction
   // to sf/hf from qf, if the instr is present in this list; since that means
   // a conversion has already been inserted after the instruction.
@@ -201,8 +201,7 @@ class HexagonPostRAHandleQFP : public MachineFunctionPass {
   enum class RegType { qf32, qf16, qf32_double, qf16_double, ieee, undefined };
   // Stores the copy instructions which their reaching def, along with the op
   // type
-  std::map<std::pair<NodeAddr<DefNode *>, NodeAddr<DefNode *>>, RegType>
-      QFCopys;
+  std::map<std::pair<NodeId, NodeId>, RegType> QFCopys;
 
   // Stores the reaching defs of copies whose result has to be converted to IEEE
   DenseMap<MachineInstr *, RegType> ReachDefOfCopies;
@@ -1030,7 +1029,7 @@ void HexagonPostRAHandleQFP::collectCopies(NodeAddr<StmtNode *> *StNode) {
 
       // If the reaching def is a COPY,collect it with reg type ieee
       if (ReachDefInstr->getOpcode() == TargetOpcode::COPY) {
-        auto pairKey = std::make_pair(CopyDef, RegDef);
+        auto pairKey = std::make_pair(CopyDef.Id, RegDef.Id);
         QFCopys[pairKey] = RegType::ieee;
         continue;
       }
@@ -1066,7 +1065,7 @@ void HexagonPostRAHandleQFP::collectCopies(NodeAddr<StmtNode *> *StNode) {
         else
           continue;
       }
-      auto pairKey = std::make_pair(CopyDef, RegDef);
+      auto pairKey = std::make_pair(CopyDef.Id, RegDef.Id);
       QFCopys[pairKey] = RegT;
     }
   }
@@ -1150,8 +1149,8 @@ void HexagonPostRAHandleQFP::collectQFUses(NodeAddr<DefNode *> RegDef,
 
     Register UsedReg = UA.Addr->getRegRef(*DFG).Id;
     if (QFPSatInstsMap.find(UseMI->getOpcode()) != QFPSatInstsMap.end()) {
-      if (PossibleMultiReachDefs.count(UseStmt) == 0) {
-        PossibleMultiReachDefs.insert(UseStmt);
+      if (PossibleMultiReachDefs.count(UseStmt.Id) == 0) {
+        PossibleMultiReachDefs.insert(UseStmt.Id);
         LLVM_DEBUG(dbgs() << "\n[Collect instr with possible multidef]:";
                    UseMI->dump());
       }
@@ -1172,14 +1171,15 @@ bool HexagonPostRAHandleQFP::HandleMultiReachingDefs() {
   // But it is not expected to since if any instruction has multiple
   // definitions it should already be present in it.
   for (auto It : PossibleMultiReachDefs) {
-    MachineInstr *Instr = It.Addr->getCode();
+    NodeAddr<StmtNode *> Stmt = DFG->addr<StmtNode *>(It);
+    MachineInstr *Instr = Stmt.Addr->getCode();
     // get the op type for the original instruction.
     // True is sf/hf, false is qf
     auto Pair = QFUsesMap[Instr];
 
     unsigned short UseNo = 1;
     // Iterate over the operands
-    for (NodeAddr<UseNode *> UA : It.Addr->members_if(DFG->IsUse, *DFG)) {
+    for (NodeAddr<UseNode *> UA : Stmt.Addr->members_if(DFG->IsUse, *DFG)) {
 
       // If the type is qf for the operand,
       // we skip since there is no scope for mismatch
@@ -1483,7 +1483,7 @@ bool HexagonPostRAHandleQFP::HandleCopies() {
   for (auto It : QFCopys) {
 
     // Get details of the copy node
-    NodeAddr<DefNode *> CopyNode = It.first.first;
+    NodeAddr<DefNode *> CopyNode = DFG->addr<DefNode *>(It.first.first);
     NodeAddr<StmtNode *> StNode = CopyNode.Addr->getOwner(*DFG);
     [[maybe_unused]] auto *CopyMI = StNode.Addr->getCode();
     LLVM_DEBUG(dbgs() << "\nHandling Reaching Defs of COPY: "; CopyMI->dump();
@@ -1510,7 +1510,7 @@ bool HexagonPostRAHandleQFP::HandleCopies() {
     if (RTy != RegType::ieee) {
 
       // get details of the reaching def node
-      NodeAddr<DefNode *> ReachDefNode = It.first.second;
+      NodeAddr<DefNode *> ReachDefNode = DFG->addr<DefNode *>(It.first.second);
       NodeAddr<StmtNode *> StNode = ReachDefNode.Addr->getOwner(*DFG);
       auto *ReachingDef = StNode.Addr->getCode();
 
@@ -1536,7 +1536,7 @@ bool HexagonPostRAHandleQFP::HandleCopies() {
   for (auto It : QFCopys) {
 
     // Get details of the copy node
-    NodeAddr<DefNode *> CopyNode = It.first.first;
+    NodeAddr<DefNode *> CopyNode = DFG->addr<DefNode *>(It.first.first);
     NodeAddr<StmtNode *> StNode = CopyNode.Addr->getOwner(*DFG);
     auto *CopyMI = StNode.Addr->getCode();
     LLVM_DEBUG(dbgs() << "\nHandling COPY: "; CopyMI->dump());
diff --git a/llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg2.ll b/llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg2.ll
index d5704fb6e6956..7c1ec0249f43f 100644
--- a/llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg2.ll
+++ b/llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg2.ll
@@ -1,8 +1,8 @@
 ; Test passes if we don't generate conversion for both
 ; of the subregisters since only one is live at the use.
-;
-; UNSUPPORTED: asserts
 
+; XFAIL: *
+; Will re-enable once the fix for incorrect subregister liveness is upstreamed.
 ; REQUIRES: asserts
 ; RUN: llc -O2 -mtriple=hexagon -mattr=+hvxv81,+hvx-length128B \
 ; RUN: -enable-xqf-gen=true -hexagon-qfloat-mode=lossy \
diff --git a/llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg3.ll b/llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg3.ll
index ca17d6c01d0a1..aed2fce378d3d 100644
--- a/llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg3.ll
+++ b/llvm/test/CodeGen/Hexagon/autohvx/xqf-postra-subreg3.ll
@@ -1,6 +1,4 @@
 ; Test passes if there is no mismatch on a convert instruction
-;
-; UNSUPPORTED: asserts
 
 ; REQUIRES: asserts
 ; RUN: llc -O2 -mtriple=hexagon -mattr=+hvxv81,+hvx-length128B \

``````````

</details>


https://github.com/llvm/llvm-project/pull/210192


More information about the llvm-commits mailing list