[LLVMdev] Question adding dummy basic blocks

Chris Lattner sabre at nondot.org
Tue Dec 7 18:37:28 PST 2004


On Tue, 7 Dec 2004, Zhang Qiuyu wrote:
> Finally, We got some problems due to PHINODE. I knew the reason, but I failed to  fix it.

Ok.

> The code is like the following
>
> if( TI->getNumSuccessors() ==1){
>   BasicBlock *TIBB=TI->getParent();
>   BasicBlock *DestBB=TI->getSuccessor(0);
>
>   BasicBlock *NewBB = new BasicBlock(TIBB->getName()+DestBB->getName()+"dummy_bb",&F);
>
>   new BranchInst(DestBB, NewBB);
>   BranchInst *NewBr = new BranchInst(DestBB, NewBB, V_dummy);
>   ReplaceInstWithInst(TI, NewBr);

If you're doing CFG manipulations, a good source of inspiration for your 
work might be the llvm/lib/Transforms/Utils/SimplifyCFG.cpp file.  It 
contains code to do many transformations like this.

I imagine that the problem with the code above is that you are adding new 
edges into 'NewBB', and if it has PHI nodes, the verifier will 
(rightfully) complain.  In particular, you're breaking the invariant that 
the # of incoming PHI node values equals the number of predecessors for 
that block.

In this case, you have to decide which values should be coming into the 
block.  Usually in cases like this, they are the same values that come in 
from some other path.  Given that you want control flow from your new 
block to emulate the control flow from some other predecessor of NewBB 
(I'll call it OtherBB), you'll want something like this:

PHINode *PN;
for (BasicBlock::iterator I = NewBB->begin();
      PN = dyn_cast<PHINode>(I); ++I)
   PN->addIncomingValue(PN->getIncomingValueForBlock(OtherBB), NewBB);

-Chris

-- 
http://nondot.org/sabre/
http://llvm.cs.uiuc.edu/




More information about the llvm-dev mailing list