[llvm] [ReachingDefAnalysis] Fix management of MBBFrameObjsReachingDefs (PR #124943)

Michael Maitland via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 31 10:50:47 PST 2025


https://github.com/michaelmaitland updated https://github.com/llvm/llvm-project/pull/124943

>From f14a174452c752f5027929d66a6d6d31bb8d9cae Mon Sep 17 00:00:00 2001
From: Michael Maitland <michaeltmaitland at gmail.com>
Date: Thu, 30 Jan 2025 07:20:05 -0800
Subject: [PATCH 1/3] precommit test case

---
 llvm/test/CodeGen/RISCV/rda-stack.mir | 37 +++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/llvm/test/CodeGen/RISCV/rda-stack.mir b/llvm/test/CodeGen/RISCV/rda-stack.mir
index 5f4974181c1cd5..fc5bd8acd2840a 100644
--- a/llvm/test/CodeGen/RISCV/rda-stack.mir
+++ b/llvm/test/CodeGen/RISCV/rda-stack.mir
@@ -149,3 +149,40 @@ body:             |
     $x10 = LD %stack.0, 0 :: (load (s64))
     PseudoRET implicit $x10
 ...
+---
+name:            test4
+tracksRegLiveness: true
+stack:
+  - { id: 0, name: '', type: default, offset: 0, size: 4, alignment: 4,
+      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
+      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
+  - { id: 1, name: '', type: default, offset: 0, size: 4, alignment: 4,
+      stack-id: default, callee-saved-register: '', callee-saved-restored: true,
+      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
+body:             |
+  ; CHECK: RDA results for test4
+  ; CHECK-NEXT: $x10:{ }
+  ; CHECK-NEXT: %stack.0:{ }
+  ; CHECK-NEXT: 0: SD $x10, %stack.0, 0 :: (store (s64))
+  ; CHECK-EMPTY:
+  ; CHECK-NEXT: $x11:{ }
+  ; CHECK-NEXT: %stack.0:{ 0 }
+  ; CHECK-NEXT: 1: SD $x11, %stack.0, 0 :: (store (s64))
+  ; CHECK-EMPTY:
+  ; CHECK-NEXT: $x10:{ }
+  ; CHECK-NEXT: %stack.1:{ }
+  ; CHECK-NEXT: 2: SD $x10, %stack.1, 0 :: (store (s64))
+  ; CHECK-EMPTY:
+  ; CHECK-NEXT: $x11:{ }
+  ; CHECK-NEXT: %stack.1:{ }
+  ; CHECK-NEXT: 3: SD $x11, %stack.1, 0 :: (store (s64))
+  ; CHECK-EMPTY:
+  ; CHECK-NEXT: 4: PseudoRET
+  bb.0.entry:
+    liveins: $x10, $x11
+    SD $x10, %stack.0, 0 :: (store (s64))
+    SD $x11, %stack.0, 0 :: (store (s64))
+    SD $x10, %stack.1, 0 :: (store (s64))
+    SD $x11, %stack.1, 0 :: (store (s64))
+    PseudoRET
+...

>From af0058bf5257908b181c00f25b7528ac7ea3b32c Mon Sep 17 00:00:00 2001
From: Michael Maitland <michaeltmaitland at gmail.com>
Date: Wed, 29 Jan 2025 08:39:09 -0800
Subject: [PATCH 2/3] [ReachingDefAnalysis][NFC] Fix management of
 MBBFrameObjsReachingDefs

---
 llvm/lib/CodeGen/ReachingDefAnalysis.cpp | 28 ++++++++++++++----------
 llvm/test/CodeGen/RISCV/rda-stack.mir    |  2 +-
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp
index 08121f411640c8..a2adc5ede28890 100644
--- a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp
+++ b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp
@@ -147,16 +147,9 @@ void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
       assert(FrameIndex >= 0 && "Can't handle negative frame indicies yet!");
       if (!isFIDef(*MI, FrameIndex, TII))
         continue;
-      if (MBBFrameObjsReachingDefs.contains(MBBNumber)) {
-        auto Frame2InstrIdx = MBBFrameObjsReachingDefs[MBBNumber];
-        if (Frame2InstrIdx.count(FrameIndex - ObjectIndexBegin) > 0)
-          Frame2InstrIdx[FrameIndex - ObjectIndexBegin].push_back(CurInstr);
-        else
-          Frame2InstrIdx[FrameIndex - ObjectIndexBegin] = {CurInstr};
-      } else {
-        MBBFrameObjsReachingDefs[MBBNumber] = {
-            {FrameIndex - ObjectIndexBegin, {CurInstr}}};
-      }
+
+      int Key = FrameIndex - ObjectIndexBegin;
+      MBBFrameObjsReachingDefs[MBBNumber][Key].push_back(CurInstr);
     }
     if (!isValidRegDef(MO))
       continue;
@@ -348,8 +341,19 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, Register Reg) const {
 
   if (Reg.isStack()) {
     int FrameIndex = Reg.stackSlotIndex();
-    for (int Def : MBBFrameObjsReachingDefs.lookup(MBBNumber).lookup(
-             FrameIndex - ObjectIndexBegin)) {
+    int Key = FrameIndex - ObjectIndexBegin;
+
+    // Check that there was a reaching def.
+    auto Lookup1 = MBBFrameObjsReachingDefs.find(MBBNumber);
+    if (Lookup1 == MBBFrameObjsReachingDefs.end())
+      return LatestDef;
+    auto &InnerMap = Lookup1->second;
+    auto Lookup2 = InnerMap.find(Key);
+    if (Lookup2 == InnerMap.end())
+      return LatestDef;
+    auto &Defs = Lookup2->second;
+
+    for (int Def : Defs) {
       if (Def >= InstId)
         break;
       DefRes = Def;
diff --git a/llvm/test/CodeGen/RISCV/rda-stack.mir b/llvm/test/CodeGen/RISCV/rda-stack.mir
index fc5bd8acd2840a..3ec17615fa6776 100644
--- a/llvm/test/CodeGen/RISCV/rda-stack.mir
+++ b/llvm/test/CodeGen/RISCV/rda-stack.mir
@@ -174,7 +174,7 @@ body:             |
   ; CHECK-NEXT: 2: SD $x10, %stack.1, 0 :: (store (s64))
   ; CHECK-EMPTY:
   ; CHECK-NEXT: $x11:{ }
-  ; CHECK-NEXT: %stack.1:{ }
+  ; CHECK-NEXT: %stack.1:{ 2 }
   ; CHECK-NEXT: 3: SD $x11, %stack.1, 0 :: (store (s64))
   ; CHECK-EMPTY:
   ; CHECK-NEXT: 4: PseudoRET

>From eab7c390ac474ae14c9a325cc426f6b43d9066dd Mon Sep 17 00:00:00 2001
From: Michael Maitland <michaeltmaitland at gmail.com>
Date: Fri, 31 Jan 2025 10:46:08 -0800
Subject: [PATCH 3/3] fixup! use FrameIndex as key; simplify map

---
 llvm/include/llvm/CodeGen/ReachingDefAnalysis.h | 10 +++++-----
 llvm/lib/CodeGen/ReachingDefAnalysis.cpp        | 15 ++++-----------
 2 files changed, 9 insertions(+), 16 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h b/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h
index cff422f539f62d..978e84b09a7368 100644
--- a/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h
+++ b/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h
@@ -141,12 +141,12 @@ class ReachingDefAnalysis : public MachineFunctionPass {
   DenseMap<MachineInstr *, int> InstIds;
 
   MBBReachingDefsInfo MBBReachingDefs;
+
+  /// MBBFrameObjsReachingDefs[{i, j}] is a list of instruction indices
+  /// (relative to begining of MBB i) that define frame index j in MBB i. This
+  /// is used in answering reaching definition queries.
   using MBBFrameObjsReachingDefsInfo =
-      DenseMap<unsigned, DenseMap<int, SmallVector<int>>>;
-  // MBBFrameObjsReachingDefs[i][j] is a list of instruction indices (relative
-  // to begining of MBB) that define frame index (j +
-  // MF->getFrameInfo().getObjectIndexBegin()) in MBB i. This is used in
-  // answering reaching definition queries.
+      DenseMap<std::pair<unsigned, int>, SmallVector<int>>;
   MBBFrameObjsReachingDefsInfo MBBFrameObjsReachingDefs;
 
   /// Default values are 'nothing happened a long time ago'.
diff --git a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp
index a2adc5ede28890..1dd051814c36d6 100644
--- a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp
+++ b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp
@@ -147,9 +147,7 @@ void ReachingDefAnalysis::processDefs(MachineInstr *MI) {
       assert(FrameIndex >= 0 && "Can't handle negative frame indicies yet!");
       if (!isFIDef(*MI, FrameIndex, TII))
         continue;
-
-      int Key = FrameIndex - ObjectIndexBegin;
-      MBBFrameObjsReachingDefs[MBBNumber][Key].push_back(CurInstr);
+      MBBFrameObjsReachingDefs[{MBBNumber, FrameIndex}].push_back(CurInstr);
     }
     if (!isValidRegDef(MO))
       continue;
@@ -344,15 +342,10 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, Register Reg) const {
     int Key = FrameIndex - ObjectIndexBegin;
 
     // Check that there was a reaching def.
-    auto Lookup1 = MBBFrameObjsReachingDefs.find(MBBNumber);
-    if (Lookup1 == MBBFrameObjsReachingDefs.end())
-      return LatestDef;
-    auto &InnerMap = Lookup1->second;
-    auto Lookup2 = InnerMap.find(Key);
-    if (Lookup2 == InnerMap.end())
+    auto Lookup = MBBFrameObjsReachingDefs.find({MBBNumber, Key});
+    if (Lookup == MBBFrameObjsReachingDefs.end())
       return LatestDef;
-    auto &Defs = Lookup2->second;
-
+    auto &Defs = Lookup->second;
     for (int Def : Defs) {
       if (Def >= InstId)
         break;



More information about the llvm-commits mailing list