[LLVMdev] Basic Block Chaining

Chris Lattner sabre at nondot.org
Thu Nov 20 10:34:02 PST 2003


On Thu, 20 Nov 2003, Reid Spencer wrote:

> Newbie Question .. (sorry if its redundant/silly) ..

No worries, this is good stuff to have archived on the list!

> As I've started to develop Stacker, I  had assumed that simply adding
> BasicBlocks to a function in sequence would imply that there is an
> implicit unconditional branch from the end of one basic block to the
> start of the next block. Based on the assertion checks that I get when I
> tried this, I assume that it is required to place a terminating
> instruction at the end of every basic block even if that should simply
> be a branch to the start of the next block. Is this indeed the case?

Yup, every basic block must end with a terminator.  The terminators are
what build the implicit CFG in LLVM (ie, the presence of terminators
makes pred_iterator & succ_iterator work on basic blocks).

> If it is, it would be "user friendly" to simply supply the branch
> instruction.  That is, provide a method on Function that appends a
> BasicBlock to the end of the block list. If the existing final basic
> block doesn't have a terminating instruction, simply add one that points
> to the block being appended.  Is this the RightThing(tm) or are there
> good reasons this can't or shouldn't be done?

I agree with Vikram that this would be hard to implement in a generally
useful way.  Besides that, you can always do something like this to add a
new basic block, assuming the last basic block in the function is
unterminated:

---

// Get the last basic block in the function, presumably you already have
// this cached somewhere.
BasicBlock *CurrentEnd = &F->back();

// Create the new basic block, adding the Function parameter causes it to
// be automatically inserted at the end of the function.
BasicBlock *New = new BasicBlock("label", F);

// Create a new branch instruction, jumping to the 'New' block.  Specify
// where in the LLVM program to insert it, in this case, at the end of the
// CurrentEnd block.
new BranchInst(New, CurrentEnd.end());

---

This is basically the strategy used to generate code by the C front-end as
well: there is always an unterminated block at the end of the function
which we are emitting statements into.  When a control flow instruction is
encountered, like an 'if', we emit the conditional branch, create a new
basic block to emit into, recursively generate the body, then emit the
else/fallthrough blocks.

-Chris

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





More information about the llvm-dev mailing list