[LLVMdev] How to insert a basic block in an edge

Nick Lewycky nicholas at mxc.ca
Sun Jul 18 11:19:23 PDT 2010


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

> Regards,
> Chayan
>
> On Sat, Jul 17, 2010 at 10:16 PM, Nick Lewycky<nicholas at mxc.ca>  wrote:
>> 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
>>
>




More information about the llvm-dev mailing list