How to insert a basic block in an edge

Hi all,

Suppose in a CFG bb1 has two succesor bb3 and bb4, and bb3 has two
predecessor bb1 and bb2. Now how can I insert a basic block between
bb1 and bb3 that at the edge bb1-->bb3 .

In general how can I insert a basic block on an edge?

Regards,
Chayan

Chayan Sarkar wrote:

Hi all,

Suppose in a CFG bb1 has two succesor bb3 and bb4, and bb3 has two
predecessor bb1 and bb2. Now how can I insert a basic block between
bb1 and bb3 that at the edge bb1-->bb3 .

In general how can I insert a basic block on an edge?

Use llvm::SplitEdge in Transforms/Utils/BasicBlockUtils.h.

The technique is to create a new bb with a single branch to bb3, then modify bb1's use of bb3 to point to 'new bb' instead, then fix up any phi nodes in bb3 by replacing uses of bb1 with 'new bb'.

Nick

Hi,

I have tried to use SplitEdge function, but failed. Actually the third
parameter is a variable of type Pass and it need to be non-null. But I
could not figure out how to use it. Please help me out.

Regards,
Chayan

Chayan Sarkar wrote:

Hi,

I have tried to use SplitEdge function, but failed. Actually the third
parameter is a variable of type Pass and it need to be non-null. But I
could not figure out how to use it. Please help me out.

The only reason it needs a non-NULL Pass* is to call llvm::SplitBlock which uses P->getAnalysisIfAvailable unconditionally. Feel free to wrap those calls in 'if (P) { ... }' and send us a patch.

Of course, the obvious question is why aren't you doing your transforms inside of a Pass?

Nick

Hi All,

Still I could not figure out how to use Pass* while calling
SplitEdge() function. Can anyone provide me some example?

Regards,
Chayan

Hi,

I could not figure out, how to declare a Pass*. Can anyone give me an
example, how to use SplitEdge() function ?

Please help me out.

Regards,
Chayan

See http://llvm.org/docs/WritingAnLLVMPass.html
If you are inside MyPass::runOn{Module,Function,Loop,BasicBlock}(),
just use the "this" pointer.

Olivier