Haishan
2014-Jan-03 12:58 UTC
[LLVMdev] How to update LiveInterval information of newly inserted machine basic block
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: Hi, I insert a new machine basic block(MBB) before Greedy Register Allocation, after Simple Register Coalescing. But I encounter a fatal error "regalloc = ... not currently supported with -O0". I use command line with opt level O2, not O0. The probable reason of this error is that no LiveInterval information for newly MBB which is used by Register Allocation. And, LiveIntervals depend on LiveVariables which require the machine function to be in SSA form. However, in this case, the modified machine function(including newly inserted MBB) is not SSA form any more. So, how to update LiveInterval information of newly MBB? Could someone help me with that? Thank you very much in advance. -Haishan Yes, I think error that means LiveIntervals have been invalidated. It is supposed to be user-friendly but should probably be changed to be more specific. If you schedule a new pass between coalescing and regalloc, it needs to preserve LiveIntervals analysis. There are utilities to recompute live intervals for individual virtual registers. See LiveIntervals::computeVirtRegs. LiveVariables is not actually needed to update live intervals. It is only added as a requirement to make sure it runs before the 2-address pass. -Andy Thank you for your reply. I do it as you tell me, and you are right. 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. -Haishan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140103/8f91a78c/attachment.html>
Andrew Trick
2014-Jan-03 19:01 UTC
[LLVMdev] How to update LiveInterval information of newly inserted machine basic block
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: > >> Hi, >> I insert a new machine basic block(MBB) before Greedy Register Allocation, after Simple Register Coalescing. But I encounter a fatal >> error "regalloc = ... not currently supported with -O0". I use command line with opt level O2, not O0. >> The probable reason of this error is that no LiveInterval information for newly MBB which is used by Register Allocation. >> And, LiveIntervals depend on LiveVariables which require the machine function to be in SSA form. >> However, in this case, the modified machine function(including newly inserted MBB) is not SSA form any more. >> So, how to update LiveInterval information of newly MBB? >> Could someone help me with that? >> Thank you very much in advance. >> -Haishan > > Yes, I think error that means LiveIntervals have been invalidated. It is supposed to be user-friendly but should probably be changed to be more specific. > > If you schedule a new pass between coalescing and regalloc, it needs to preserve LiveIntervals analysis. There are utilities to recompute live intervals for individual virtual registers. See LiveIntervals::computeVirtRegs. LiveVariables is not actually needed to update live intervals. It is only added as a requirement to make sure it runs before the 2-address pass. > > -Andy > > Thank you for your reply. > I do it as you tell me, and you are right. > 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. Hope it works. -Andy -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140103/2652b285/attachment.html>
Jakob Stoklund Olesen
2014-Jan-03 20:10 UTC
[LLVMdev] How to update LiveInterval information of newly inserted machine basic block
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. Thanks, /jakob -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140103/216b094c/attachment.html>