Dipanjan Das via llvm-dev
2017-Oct-21 08:59 UTC
[llvm-dev] How to use SplitBlockAndInsertIfThen() correctly?
The way I have used SplitBlockAndInsertIfThen() throws this assertion
error: "Assertion `IDomNode && "Not immediate dominator
specified for
block!"' failed". Consider the following abstraction:
======================I1
I2
======================What I am trying to achieve is:
======================I1
I_cond
I_then1
I_then2
I_new1
I_new2
I2
======================
In plain English
- Split the block between I1 and I2
- Insert an ICMP at the end of first block
- Add a couple of instructions (I_then1, I_then2) to the THEN block
- Add a couple of instruction at the beginning of the last block
preceding I2 (I_new1, I_new2)
My code roughly looks like:
====================== Instruction *I2 = I1->getNextNode(); //
Next instruction
TerminatorInst *then_inst;
if(condition) {
Value *I_cond = builder.CreateICmpNE(_, _);
// Split the basic block
then_inst = SplitBlockAndInsertIfThen(I_cond, I2, false);
// Set the insert point before terminator of THEN block
builder.SetInsertPoint(then_inst);
// Add new instructions
I_then1
I_then2
}
// Set the insert point before the next instruction
builder.SetInsertPoint(I2);
// Add new instructions
I_new1
I_new2
======================
What's wrong with my approach? How to fix it?
--
Thanks & Regards,
Dipanjan
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20171021/cc0621f7/attachment.html>
Dipanjan Das via llvm-dev
2017-Oct-21 14:19 UTC
[llvm-dev] How to use SplitBlockAndInsertIfThen() correctly?
I believe the problem comes from inserting instructions both at the THEN block and the beginning of the tail block. Any idea how's that possible? On 21 October 2017 at 01:59, Dipanjan Das <mail.dipanjan.das at gmail.com> wrote:> > The way I have used SplitBlockAndInsertIfThen() throws this assertion > error: "Assertion `IDomNode && "Not immediate dominator specified for > block!"' failed". Consider the following abstraction: > > ======================> I1 > I2 > ======================> What I am trying to achieve is: > ======================> I1 > I_cond > I_then1 > I_then2 > I_new1 > I_new2 > I2 > ======================> > In plain English > - Split the block between I1 and I2 > - Insert an ICMP at the end of first block > - Add a couple of instructions (I_then1, I_then2) to the THEN block > - Add a couple of instruction at the beginning of the last block > preceding I2 (I_new1, I_new2) > > > My code roughly looks like: > > ======================> Instruction *I2 = I1->getNextNode(); // Next instruction > TerminatorInst *then_inst; > > if(condition) { > Value *I_cond = builder.CreateICmpNE(_, _); > > // Split the basic block > then_inst = SplitBlockAndInsertIfThen(I_cond, I2, false); > > // Set the insert point before terminator of THEN block > builder.SetInsertPoint(then_inst); > > // Add new instructions > I_then1 > I_then2 > } > > // Set the insert point before the next instruction > builder.SetInsertPoint(I2); > > // Add new instructions > I_new1 > I_new2 > > ======================> > What's wrong with my approach? How to fix it? > > -- > > Thanks & Regards, > Dipanjan >-- Thanks & Regards, Dipanjan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171021/a69bf6ba/attachment.html>