PenYiWang via llvm-dev
2020-Mar-13 05:19 UTC
[llvm-dev] How to simply split MachineBasicBlock ?
Hi I am developing some machine function pass. I want to split MachineBasicBlcok when I find some specific machine instruction. But I don't insert or delete any machine instruction. I just "simply" , "purely" split the MachineBasicBlcok. (So, I stole the idea from ARM64BranchRelaxation::splitBlockBeforeInstr.) This is my code : // I would pass call instruction to this function void split_mbb(MachineInstr* mi){ MachineBasicBlock* mbb=mi->getParent(); MachineFunction* mf=mbb->getParent(); MachineBasicBlock* new_mbb=mf->CreateMachineBasicBlock(mbb->getBasicBlock()); MachineFunction::iterator mbb_it(mbb); mf->insert(mbb_it,new_mbb); new_mbb->splice(new_mbb->end(),mbb,mbb->begin(),mi); } Originally, mi is in BB. (mi would be a call instruction) (do not consider mi is a branch instruction) BB --> BB1 , BB2 Then, I split BB, mi is the first instruction of BB2. And the instructions before mi are in BB1. But now, I use my machine function pass to compile some test programs. And these test programs can't execute , always segment fault. Is there any problem in my split_mbb ? How to "simply" split MachineBasicBlock ? Thank you !! -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200313/846b7b0e/attachment-0001.html>
Craig Topper via llvm-dev
2020-Mar-13 06:35 UTC
[llvm-dev] How to simply split MachineBasicBlock ?
Did you transfer the successors of BB1 to BB2 and add BB2 as a successor of BB1? This note in code you referenced refers to that "NOTE: Successor list of the original BB is out of date after this function, and must be updated by the caller!" See this code in ARMConstantIslands::splitBlockBeforeInstr // Update the CFG. All succs of OrigBB are now succs of NewBB. NewBB->transferSuccessors(OrigBB); // OrigBB branches to NewBB. OrigBB->addSuccessor(NewBB); ~Craig On Thu, Mar 12, 2020 at 10:20 PM PenYiWang via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Hi > > I am developing some machine function pass. > > I want to split MachineBasicBlcok when I find some specific machine > instruction. > > But I don't insert or delete any machine instruction. > > I just "simply" , "purely" split the MachineBasicBlcok. > > (So, I stole the idea from ARM64BranchRelaxation::splitBlockBeforeInstr.) > > This is my code : > > // I would pass call instruction to this function > > void split_mbb(MachineInstr* mi){ > MachineBasicBlock* mbb=mi->getParent(); > MachineFunction* mf=mbb->getParent(); > MachineBasicBlock* > new_mbb=mf->CreateMachineBasicBlock(mbb->getBasicBlock()); > > MachineFunction::iterator mbb_it(mbb); > mf->insert(mbb_it,new_mbb); > new_mbb->splice(new_mbb->end(),mbb,mbb->begin(),mi); > } > > Originally, mi is in BB. > (mi would be a call instruction) > (do not consider mi is a branch instruction) > BB --> BB1 , BB2 > Then, I split BB, mi is the first instruction of BB2. > And the instructions before mi are in BB1. > > But now, I use my machine function pass to compile some test programs. > > And these test programs can't execute , always segment fault. > > Is there any problem in my split_mbb ? > > How to "simply" split MachineBasicBlock ? > > Thank you !! > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200312/4317f3ee/attachment.html>
PenYiWang via llvm-dev
2020-Mar-13 11:16 UTC
[llvm-dev] How to simply split MachineBasicBlock ?
Thank You !! Help me a lot !! Craig Topper <craig.topper at gmail.com> 於 2020年3月13日 週五 下午2:36寫道:> Did you transfer the successors of BB1 to BB2 and add BB2 as a successor > of BB1? This note in code you referenced refers to that "NOTE: Successor > list of the original BB is out of date after this function, and must be > updated by the caller!" > > See this code in ARMConstantIslands::splitBlockBeforeInstr > > // Update the CFG. All succs of OrigBB are now succs of NewBB. > NewBB->transferSuccessors(OrigBB); > > // OrigBB branches to NewBB. > OrigBB->addSuccessor(NewBB); > > > > ~Craig > > > On Thu, Mar 12, 2020 at 10:20 PM PenYiWang via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> Hi >> >> I am developing some machine function pass. >> >> I want to split MachineBasicBlcok when I find some specific machine >> instruction. >> >> But I don't insert or delete any machine instruction. >> >> I just "simply" , "purely" split the MachineBasicBlcok. >> >> (So, I stole the idea from ARM64BranchRelaxation::splitBlockBeforeInstr.) >> >> This is my code : >> >> // I would pass call instruction to this function >> >> void split_mbb(MachineInstr* mi){ >> MachineBasicBlock* mbb=mi->getParent(); >> MachineFunction* mf=mbb->getParent(); >> MachineBasicBlock* >> new_mbb=mf->CreateMachineBasicBlock(mbb->getBasicBlock()); >> >> MachineFunction::iterator mbb_it(mbb); >> mf->insert(mbb_it,new_mbb); >> new_mbb->splice(new_mbb->end(),mbb,mbb->begin(),mi); >> } >> >> Originally, mi is in BB. >> (mi would be a call instruction) >> (do not consider mi is a branch instruction) >> BB --> BB1 , BB2 >> Then, I split BB, mi is the first instruction of BB2. >> And the instructions before mi are in BB1. >> >> But now, I use my machine function pass to compile some test programs. >> >> And these test programs can't execute , always segment fault. >> >> Is there any problem in my split_mbb ? >> >> How to "simply" split MachineBasicBlock ? >> >> Thank you !! >> >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200313/44f583f8/attachment.html>