All, Consider the case where the entry block to a function acts like a loop (e.g. it ends with a conditional break to itself and somewhere else). How would one create a PHINode (representing an index perhaps) which has a constant index (say 0) when entering the function, and (oldval+1) when looping. I understand how to do this if the loop were not in the entry block (by simply using node->addIncoming(ConstantInt(...), entry), node->addIncoming(builder.CreateAdd(node,...),loopBlock) ). My question is how would one do this using the C++ API when there is no predecessor since it is the entry block. Thanks, Billy Moses -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140715/11507998/attachment.html>
Hi, On 15 July 2014 15:55, William Moses <moses.williamsteven at gmail.com> wrote:> Consider the case where the entry block to a function acts like a loop (e.g. > it ends with a conditional break to itself and somewhere else). How would > one create a PHINode (representing an index perhaps) which has a constant > index (say 0) when entering the function, and (oldval+1) when looping.I don't believe you can. The entry block isn't allowed to be part of a loop, neatly sidestepping the question. Usually people just put an unconditional branch to the real loop start when it matters. Cheers. Tim.
On 7/15/14, 9:55 AM, William Moses wrote:> All, > > Consider the case where the entry block to a function acts like a loop > (e.g. it ends with a conditional break to itself and somewhere else). > How would one create a PHINode (representing an index perhaps) which > has a constant index (say 0) when entering the function, and > (oldval+1) when looping. > > I understand how to do this if the loop were not in the entry block > (by simply using node->addIncoming(ConstantInt(...), entry), > node->addIncoming(builder.CreateAdd(node,...),loopBlock) ). > > My question is how would one do this using the C++ API when there is > no predecessor since it is the entry block.An entry block cannot have any phi-nodes. If you have a function that starts with a loop, then your entry block will be a single unconditional branch to a basic block which is the first basic block of the loop. Regards, John Criswell> > Thanks, > Billy Moses > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140715/a32c0532/attachment.html>
Hi William, On 15/07/14 16:55, William Moses wrote:> All, > > Consider the case where the entry block to a function acts like a loop (e.g. it > ends with a conditional break to itself and somewhere else). How would one > create a PHINode (representing an index perhaps) which has a constant index (say > 0) when entering the function, and (oldval+1) when looping. > > I understand how to do this if the loop were not in the entry block (by simply > using node->addIncoming(ConstantInt(...), entry), > node->addIncoming(builder.CreateAdd(node,...),loopBlock) ). > > My question is how would one do this using the C++ API when there is no > predecessor since it is the entry block.phi nodes are not allowed in the entry block. You need to create a block to put the phi node in, and have the entry block just be a branch to this block. Ciao, Duncan.
> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] > On Behalf Of William Moses > Subject: [LLVMdev] PHINode in entry block> Consider the case where the entry block to a function acts like a loop (e.g. it > ends with a conditional break to itself and somewhere else). How would one create > a PHINode (representing an index perhaps) which has a constant index (say 0) when > entering the function, and (oldval+1) when looping.> My question is how would one do this using the C++ API when there is no predecessor > since it is the entry block.In this case you need to create an essentially empty entry block as a predecessor containing nothing but a branch to the starting block of the loop; its sole purpose is to provide a block for the PHI node to reference. - Chuck