From f14a174452c752f5027929d66a6d6d31bb8d9cae Mon Sep 17 00:00:00 2001 From: Michael Maitland Date: Thu, 30 Jan 2025 07:20:05 -0800 Subject: [PATCH 1/5] 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 5f4974181c1cd..fc5bd8acd2840 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 Date: Wed, 29 Jan 2025 08:39:09 -0800 Subject: [PATCH 2/5] [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 08121f411640c..a2adc5ede2889 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 fc5bd8acd2840..3ec17615fa677 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 Date: Fri, 31 Jan 2025 10:46:08 -0800 Subject: [PATCH 3/5] 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 cff422f539f62..978e84b09a736 100644 --- a/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h +++ b/llvm/include/llvm/CodeGen/ReachingDefAnalysis.h @@ -141,12 +141,12 @@ class ReachingDefAnalysis : public MachineFunctionPass { DenseMap 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>>; - // 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, SmallVector>; 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 a2adc5ede2889..1dd051814c36d 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; From 7dca7737a6745e259a03f156f59873cb04186159 Mon Sep 17 00:00:00 2001 From: Michael Maitland Date: Fri, 31 Jan 2025 10:57:55 -0800 Subject: [PATCH 4/5] fixup! use correct key --- llvm/lib/CodeGen/ReachingDefAnalysis.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp index 1dd051814c36d..b32ab5278ebf4 100644 --- a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp +++ b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp @@ -338,11 +338,9 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, Register Reg) const { int LatestDef = ReachingDefDefaultVal; if (Reg.isStack()) { - int FrameIndex = Reg.stackSlotIndex(); - int Key = FrameIndex - ObjectIndexBegin; - // Check that there was a reaching def. - auto Lookup = MBBFrameObjsReachingDefs.find({MBBNumber, Key}); + int FrameIndex = Reg.stackSlotIndex(); + auto Lookup = MBBFrameObjsReachingDefs.find({MBBNumber, FrameIndex}); if (Lookup == MBBFrameObjsReachingDefs.end()) return LatestDef; auto &Defs = Lookup->second; From bf1fe4fc0d2586437df3f2c72c951e19a52e50b7 Mon Sep 17 00:00:00 2001 From: Michael Maitland Date: Mon, 3 Feb 2025 19:00:54 -0800 Subject: [PATCH 5/5] fixup! add fixedStack --- llvm/test/CodeGen/RISCV/rda-stack.mir | 3 +++ 1 file changed, 3 insertions(+) diff --git a/llvm/test/CodeGen/RISCV/rda-stack.mir b/llvm/test/CodeGen/RISCV/rda-stack.mir index 3ec17615fa677..b3111e662e2e9 100644 --- a/llvm/test/CodeGen/RISCV/rda-stack.mir +++ b/llvm/test/CodeGen/RISCV/rda-stack.mir @@ -152,6 +152,9 @@ body: | --- name: test4 tracksRegLiveness: true +fixedStack: + - { id: 0, type: default, offset: 0, size: 4, alignment: 16, + isImmutable: true, isAliased: false } stack: - { id: 0, name: '', type: default, offset: 0, size: 4, alignment: 4, stack-id: default, callee-saved-register: '', callee-saved-restored: true,