Jakob Stoklund Olesen
2014-Jan-03 21:49 UTC
[LLVMdev] How to update LiveInterval information of newly inserted machine basic block
On Jan 3, 2014, at 1:06 PM, Andrew Trick <atrick at apple.com> wrote:> > On Jan 3, 2014, at 12:10 PM, Jakob Stoklund Olesen <stoklund at 2pi.dk> wrote: > >> >> On Jan 3, 2014, at 11:01 AM, Andrew Trick <atrick at apple.com> wrote: >> >>> >>> On Jan 3, 2014, at 4:58 AM, Haishan <hndxvon at 163.com> wrote: >>> >>>> >>>> At 2014-01-01 04:36:21,"Andrew Trick" <atrick at apple.com> wrote: >>>> >>>> On Dec 31, 2013, at 3:52 AM, Haishan <hndxvon at 163.com> wrote: >>>> My update steps are shown following: >>>> LiveIntervals *LIS = &getAnalysis<LiveIntervals>(); >>>> 1. LIS->insertMBBInMaps(NewMBB) >>>> 2. LIS->InsertMachineInstrRangeInMaps(NewMBB->begin(), NewMBB->end()) >>>> 3. Due to some machine instructions of NewMBB copy from OldMBB, I have to removeInterval firstly. Then I use LIS->createAndComputeVirtRegInterval() to update LiveInterval info of NewMBB. >>>> 4. Then I want to delete OldMBB in the current MachineFuncion. At the same time, delete LiveIntervals info of OldMBB. So, firstly, Use RemoveMachineInstrFromMaps() to erase SlotIndexes info of OldMBB. And, delete OldMBB from current CFG. Lastly, remove all registers' interval, create and recompute virtual register interval info. >>>> However, I get an unreachable error "Use not jointly dominated by defs" in LiveRangeCalc.cpp:188. >>>> So, comparing with Step3, Step4 generates an unreachable error, Why? >>>> Valid information of OldMBB is deleted when updating CFG? Is there something wrong with my updating steps? >>>> Thank you very much again. >>> >>> I’m haven’t done anything like this so I can only guess. >>> >>> The error means that some path from function entry does not provide a reaching def for a vreg. You’ll have to analyze the CFG and debug to understand why. >>> >>> My suggestion would be to completely update the CFG first, with no connections to the old block. Remove the old block, it’s instructions and vregs from maps. Then add the new block to maps and recompute. >>> >>> You might need to keep track of any vregs referenced in the old block but not in the new block to ensure they are updated. >> >> Those LIS->insert…() functions are only proxies for the corresponding functions on SlotIndexes. They only add the necessary slot indexes, they don’t update any liveness information. >> >> We don’t have any support for updating liveness after inserting a new basic block. There is no reason you couldn’t do it, but the code doesn’t exist. > > Haishan is using createAndComputeVirtRegInterval for each vreg. I guess this should work if removeInterval is called first.The problem is with all the other virtual registers in the function. You need to decide if they are live through the new block or not. That isn’t computed automatically. Thanks, /jakob -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140103/2de38cba/attachment.html>
Andrew Trick
2014-Jan-03 21:52 UTC
[LLVMdev] How to update LiveInterval information of newly inserted machine basic block
On Jan 3, 2014, at 1:49 PM, Jakob Stoklund Olesen <stoklund at 2pi.dk> wrote:> > On Jan 3, 2014, at 1:06 PM, Andrew Trick <atrick at apple.com> wrote: > >> >> On Jan 3, 2014, at 12:10 PM, Jakob Stoklund Olesen <stoklund at 2pi.dk> wrote: >> >>> >>> On Jan 3, 2014, at 11:01 AM, Andrew Trick <atrick at apple.com> wrote: >>> >>>> >>>> On Jan 3, 2014, at 4:58 AM, Haishan <hndxvon at 163.com> wrote: >>>> >>>>> >>>>> At 2014-01-01 04:36:21,"Andrew Trick" <atrick at apple.com> wrote: >>>>> >>>>> On Dec 31, 2013, at 3:52 AM, Haishan <hndxvon at 163.com> wrote: >>>>> My update steps are shown following: >>>>> LiveIntervals *LIS = &getAnalysis<LiveIntervals>(); >>>>> 1. LIS->insertMBBInMaps(NewMBB) >>>>> 2. LIS->InsertMachineInstrRangeInMaps(NewMBB->begin(), NewMBB->end()) >>>>> 3. Due to some machine instructions of NewMBB copy from OldMBB, I have to removeInterval firstly. Then I use LIS->createAndComputeVirtRegInterval() to update LiveInterval info of NewMBB. >>>>> 4. Then I want to delete OldMBB in the current MachineFuncion. At the same time, delete LiveIntervals info of OldMBB. So, firstly, Use RemoveMachineInstrFromMaps() to erase SlotIndexes info of OldMBB. And, delete OldMBB from current CFG. Lastly, remove all registers' interval, create and recompute virtual register interval info. >>>>> However, I get an unreachable error "Use not jointly dominated by defs" in LiveRangeCalc.cpp:188. >>>>> So, comparing with Step3, Step4 generates an unreachable error, Why? >>>>> Valid information of OldMBB is deleted when updating CFG? Is there something wrong with my updating steps? >>>>> Thank you very much again. >>>> >>>> I’m haven’t done anything like this so I can only guess. >>>> >>>> The error means that some path from function entry does not provide a reaching def for a vreg. You’ll have to analyze the CFG and debug to understand why. >>>> >>>> My suggestion would be to completely update the CFG first, with no connections to the old block. Remove the old block, it’s instructions and vregs from maps. Then add the new block to maps and recompute. >>>> >>>> You might need to keep track of any vregs referenced in the old block but not in the new block to ensure they are updated. >>> >>> Those LIS->insert…() functions are only proxies for the corresponding functions on SlotIndexes. They only add the necessary slot indexes, they don’t update any liveness information. >>> >>> We don’t have any support for updating liveness after inserting a new basic block. There is no reason you couldn’t do it, but the code doesn’t exist. >> >> Haishan is using createAndComputeVirtRegInterval for each vreg. I guess this should work if removeInterval is called first. > > The problem is with all the other virtual registers in the function. You need to decide if they are live through the new block or not. That isn’t computed automatically.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? -Andy -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140103/d8f5a65d/attachment.html>
Jakob Stoklund Olesen
2014-Jan-03 22:11 UTC
[LLVMdev] How to update LiveInterval information of newly inserted machine basic block
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 -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140103/fb415a03/attachment.html>
Possibly Parallel Threads
- [LLVMdev] How to update LiveInterval information of newly inserted machine basic block
- [LLVMdev] How to update LiveInterval information of newly inserted machine basic block
- [LLVMdev] How to update LiveInterval information of newly inserted machine basic block
- [LLVMdev] How to update LiveInterval information of newly inserted machine basic block
- [LLVMdev] How to update LiveInterval information of newly inserted machine basic block