<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">It's past 3 AM here, so maybe I really shouldn't be answering in this state of awakeness. However, what I understand from your example is that loops with counters must be entered from another block in order to use the phi instruction correctly, not that it should be invalid to branch to the entry block.<div><br></div><div>It seems to me that it makes sense to go back to the entry point if looping is not directed by a counter. Consider the following snippet of invalid IR:<div><br></div><div><div><font class="Apple-style-span" face="Menlo">define i32 @foo() nounwind {</font></div><div><font class="Apple-style-span" face="Menlo">entry:</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="Menlo">       </font></span><font class="Apple-style-span" face="Menlo">%time = call i32 @time(i32* null) nounwind</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="Menlo">     </font></span><font class="Apple-style-span" face="Menlo">%cmp = icmp eq i32 %time, 1234567890</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="Menlo">   </font></span><font class="Apple-style-span" face="Menlo">br i1 %cmp, label %exit, label %entry</font></div><div><font class="Apple-style-span" face="Menlo">exit:</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="Menlo">   </font></span><font class="Apple-style-span" face="Menlo">ret i32 0</font></div><div><font class="Apple-style-span" face="Menlo">}</font></div><div><font class="Apple-style-span" face="Menlo"><br></font></div><div><font class="Apple-style-span" face="Menlo">declare i32 @time(i32*) nounwind</font></div><div><br></div><div>Is the problem really inherent to the entry block, or is it rather inherent to the use of the phi instruction from the entry block?</div><div><br></div><div>Thanks for your time.</div><div><br></div><div>Félix</div><div><br></div><div><div><div>Le 2010-07-08 à 02:27:03, Alistair Lynn a écrit :</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Hello Félix-<br><br>Consider the following snippet of IR:<br><br>define i32 @foo(i32 %n) nounwind {<br>entry:<br><span class="Apple-tab-span" style="white-space:pre">    </span>br label %loop<br>loop:<br><span class="Apple-tab-span" style="white-space:pre">     </span>%loop.n = phi i32 [0, %entry], [%tmp, %loop]<br><span class="Apple-tab-span" style="white-space:pre">      </span>call void @bar() nounwind<br><span class="Apple-tab-span" style="white-space:pre"> </span>%tmp = sub nsw i32 %loop.n, 1<br><span class="Apple-tab-span" style="white-space:pre">     </span>%cmp = icmp eq i32 %tmp, 0<br><span class="Apple-tab-span" style="white-space:pre">        </span>br i1 %cmp, label %exit, label %loop<br>exit:<br><span class="Apple-tab-span" style="white-space:pre">       </span>ret i32 0<br>}<br><br>declare void @bar() nounwind<br><br>Try to merge the blocks "entry" and "loop" and all becomes clear when you hit the phi node.<br><br>Alistair<br><br>On 8 Jul 2010, at 07:16, Félix Cloutier wrote:<br><br><blockquote type="cite">The title says it all. verifyFunction checks it (Verifier.cpp, line 728).<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Why can't BasicBlocks that serve as a function's entry point also have predecessors? What keeps a function from looping back to its beginning?<br></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">Félix<br></blockquote><blockquote type="cite">_______________________________________________<br></blockquote><blockquote type="cite">LLVM Developers mailing list<br></blockquote><blockquote type="cite"><a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a><br></blockquote><blockquote type="cite"><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br></blockquote><br></div></blockquote></div><br></div></div></div></body></html>