diff options
author | Andrew Ng <anng.sw@gmail.com> | 2017-04-25 15:39:57 +0000 |
---|---|---|
committer | Andrew Ng <anng.sw@gmail.com> | 2017-04-25 15:39:57 +0000 |
commit | 10ebfe0684ea6480a06638a6a2e1d23f50dacbff (patch) | |
tree | 3a82836fd73a7de6dabe93a0c6feec7b5fec738b /llvm/lib/CodeGen/AntiDepBreaker.h | |
parent | ba011431938ec4e1716c13a1aada4510f547c89f (diff) | |
download | bcm5719-llvm-10ebfe0684ea6480a06638a6a2e1d23f50dacbff.tar.gz bcm5719-llvm-10ebfe0684ea6480a06638a6a2e1d23f50dacbff.zip |
Resubmit r301309: [DebugInfo][X86] Fix handling of DBG_VALUE's in post-RA scheduler.
This patch reapplies r301309 with the fix to the MIR test to fix the assertion
triggered by r301309. Had trimmed a little bit too much from the MIR!
llvm-svn: 301317
Diffstat (limited to 'llvm/lib/CodeGen/AntiDepBreaker.h')
-rw-r--r-- | llvm/lib/CodeGen/AntiDepBreaker.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/AntiDepBreaker.h b/llvm/lib/CodeGen/AntiDepBreaker.h index 04f7f419f5e..d14d93100ad 100644 --- a/llvm/lib/CodeGen/AntiDepBreaker.h +++ b/llvm/lib/CodeGen/AntiDepBreaker.h @@ -60,6 +60,25 @@ public: if (MI.getOperand(0).isReg() && MI.getOperand(0).getReg() == OldReg) MI.getOperand(0).setReg(NewReg); } + + /// Update all DBG_VALUE instructions that may be affected by the dependency + /// breaker's update of ParentMI to use NewReg. + void UpdateDbgValues(const DbgValueVector &DbgValues, MachineInstr *ParentMI, + unsigned OldReg, unsigned NewReg) { + // The following code is dependent on the order in which the DbgValues are + // constructed in ScheduleDAGInstrs::buildSchedGraph. + MachineInstr *PrevDbgMI = nullptr; + for (const auto &DV : make_range(DbgValues.crbegin(), DbgValues.crend())) { + MachineInstr *PrevMI = DV.second; + if ((PrevMI == ParentMI) || (PrevMI == PrevDbgMI)) { + MachineInstr *DbgMI = DV.first; + UpdateDbgValue(*DbgMI, OldReg, NewReg); + PrevDbgMI = DbgMI; + } else if (PrevDbgMI) { + break; // If no match and already found a DBG_VALUE, we're done. + } + } + } }; } |