Andrew Trick
2014-Jan-04 19:28 UTC
[LLVMdev] How to update LiveInterval information of newly inserted machine basic block
On Jan 4, 2014, at 4:38 AM, Haishan <hndxvon at 163.com> wrote:> At 2014-01-04 06:11:38,"Jakob Stoklund Olesen" <stoklund at 2pi.dk> wrote: > > On Jan 3, 2014, at 1:52 PM, Andrew Trick <atrick at apple.com> wrote: > >> He really just wants to rerun LiveIntervals analysis, but LiveVariables is no longer available. Would it work just to clear all the intervals rerun LiveIntervals::computeVirtRegs after all the CFG transforms are complete? > > Yes, I should think so. > > /jakob > > > Thank you very much for your talk. > I think I could append more information about updating LiveIntervals. > 1. It works well if I just use from step1 to step3, without step4. > 2. In step4, I firstly use UnreachableBlockElim pass to delete OldMBB. > Then, remove all intervals and recompute all the virtual registers' LiveIntervals. > 3. I debug source code in LiveRangeCalc.cpp and copy partial code shown following. > /// LiveRangeCalc.cpp > ... > #ifndef NDEBUG > if (MBB->pred_empty()) { > MBB->getParent()->verify(); > llvm_unreachable("Use not jointly dominated by defs."); > } > ... > /// LiveRangeCalc.cpp > This MBB is the first block of MachineFunction. That's to say, This MBB doesn't have predecessor. It is reasonable? > From debug information, this unreachable error is generated from recompute a virtual register which isn't used or defined in this MBB. But this virtual register, in NewMBB, is defined in a machine instruction which is copied from OldMBB. > So I am puzzled. > Then, I do as Andy's suggestion, but it doesn't work, and it has same error. > Could you have any suggestion? > Thank you very much again.Incrementally updating the live intervals will be complicated. You may be able to completely recompute them by clearing all VirtRegIntervals, then calling computeVirtRegs. -Andy -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140104/b4e59f87/attachment.html>
Haishan
2014-Jan-05 13:24 UTC
[LLVMdev] How to update LiveInterval information of newly inserted machine basic block
At 2014-01-05 03:28:22,"Andrew Trick" <atrick at apple.com> wrote: On Jan 4, 2014, at 4:38 AM, Haishan <hndxvon at 163.com> wrote: At 2014-01-04 06:11:38,"Jakob Stoklund Olesen" <stoklund at 2pi.dk> wrote: On Jan 3, 2014, at 1:52 PM, Andrew Trick <atrick at apple.com> wrote: He really just wants to rerun LiveIntervals analysis, but LiveVariables is no longer available. Would it work just to clear all the intervals rerun LiveIntervals::computeVirtRegs after all the CFG transforms are complete? Yes, I should think so. /jakob Thank you very much for your talk. I think I could append more information about updating LiveIntervals. 1. It works well if I just use from step1 to step3, without step4. 2. In step4, I firstly use UnreachableBlockElim pass to delete OldMBB. Then, remove all intervals and recompute all the virtual registers' LiveIntervals. 3. I debug source code in LiveRangeCalc.cpp and copy partial code shown following. /// LiveRangeCalc.cpp ... #ifndef NDEBUG if (MBB->pred_empty()) { MBB->getParent()->verify(); llvm_unreachable("Use not jointly dominated by defs."); } ... /// LiveRangeCalc.cpp This MBB is the first block of MachineFunction. That's to say, This MBB doesn't have predecessor. It is reasonable? From debug information, this unreachable error is generated from recompute a virtual register which isn't used or defined in this MBB. But this virtual register, in NewMBB, is defined in a machine instruction which is copied from OldMBB. So I am puzzled. Then, I do as Andy's suggestion, but it doesn't work, and it has same error. Could you have any suggestion? Thank you very much again. Incrementally updating the live intervals will be complicated. You may be able to completely recompute them by clearing all VirtRegIntervals, then calling computeVirtRegs. -Andy Hi, Thank you very much for replying. I have some doubt about only using computeVirtRegs function to update LiveInterval. There are two other functions like "computeRegMasks() computeLiveInRegUnits()" in runOnMachineFunction of LiveIntervalAnalysis.cpp. So, I think that these two functions maybe effect updating LiveInterval information. What do you think of two functions? Thank you very much again. -Haishan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140105/7063fdaa/attachment.html>
Andrew Trick
2014-Jan-06 17:04 UTC
[LLVMdev] How to update LiveInterval information of newly inserted machine basic block
On Jan 5, 2014, at 5:24 AM, Haishan <hndxvon at 163.com> wrote:> > At 2014-01-05 03:28:22,"Andrew Trick" <atrick at apple.com> wrote: > > On Jan 4, 2014, at 4:38 AM, Haishan <hndxvon at 163.com> wrote: > >> At 2014-01-04 06:11:38,"Jakob Stoklund Olesen" <stoklund at 2pi.dk> wrote: >> >> On Jan 3, 2014, at 1:52 PM, Andrew Trick <atrick at apple.com> wrote: >> >>> He really just wants to rerun LiveIntervals analysis, but LiveVariables is no longer available. Would it work just to clear all the intervals rerun LiveIntervals::computeVirtRegs after all the CFG transforms are complete? >> >> Yes, I should think so. >> >> /jakob >> >> >> Thank you very much for your talk. >> I think I could append more information about updating LiveIntervals. >> 1. It works well if I just use from step1 to step3, without step4. >> 2. In step4, I firstly use UnreachableBlockElim pass to delete OldMBB. >> Then, remove all intervals and recompute all the virtual registers' LiveIntervals. >> 3. I debug source code in LiveRangeCalc.cpp and copy partial code shown following. >> /// LiveRangeCalc.cpp >> ... >> #ifndef NDEBUG >> if (MBB->pred_empty()) { >> MBB->getParent()->verify(); >> llvm_unreachable("Use not jointly dominated by defs."); >> } >> ... >> /// LiveRangeCalc.cpp >> This MBB is the first block of MachineFunction. That's to say, This MBB doesn't have predecessor. It is reasonable? >> From debug information, this unreachable error is generated from recompute a virtual register which isn't used or defined in this MBB. But this virtual register, in NewMBB, is defined in a machine instruction which is copied from OldMBB. >> So I am puzzled. >> Then, I do as Andy's suggestion, but it doesn't work, and it has same error. >> Could you have any suggestion? >> Thank you very much again. > > Incrementally updating the live intervals will be complicated. You may be able to completely recompute them by clearing all VirtRegIntervals, then calling computeVirtRegs. > > -Andy > > Hi, > Thank you very much for replying. > I have some doubt about only using computeVirtRegs function to update LiveInterval. > There are two other functions like "computeRegMasks() computeLiveInRegUnits()" in runOnMachineFunction of LiveIntervalAnalysis.cpp. > So, I think that these two functions maybe effect updating LiveInterval information. > What do you think of two functions?Yes, the safest thing would be to effectively rerun the LiveIntervals pass. After finishing your CFG changes, You could try: releaseMemory() VirtRegIntervals.resize(MRI->getNumVirtRegs()); computeVirtRegs(); computeRegMasks(); computeLiveInRegUnits(); I haven't tried this myself, so you may need to experiment/debug. -Andy> > Thank you very much again. > -Haishan > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140106/170d750e/attachment.html>