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 08121f411640c..b32ab5278ebf4 100644 --- a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp +++ b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp @@ -147,16 +147,7 @@ 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}}}; - } + MBBFrameObjsReachingDefs[{MBBNumber, FrameIndex}].push_back(CurInstr); } if (!isValidRegDef(MO)) continue; @@ -347,9 +338,13 @@ int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, Register Reg) const { int LatestDef = ReachingDefDefaultVal; if (Reg.isStack()) { + // Check that there was a reaching def. int FrameIndex = Reg.stackSlotIndex(); - for (int Def : MBBFrameObjsReachingDefs.lookup(MBBNumber).lookup( - FrameIndex - ObjectIndexBegin)) { + auto Lookup = MBBFrameObjsReachingDefs.find({MBBNumber, FrameIndex}); + if (Lookup == MBBFrameObjsReachingDefs.end()) + return LatestDef; + auto &Defs = Lookup->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 5f4974181c1cd..b3111e662e2e9 100644 --- a/llvm/test/CodeGen/RISCV/rda-stack.mir +++ b/llvm/test/CodeGen/RISCV/rda-stack.mir @@ -149,3 +149,43 @@ body: | $x10 = LD %stack.0, 0 :: (load (s64)) PseudoRET implicit $x10 ... +--- +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, + 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:{ 2 } + ; 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 +...