<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    On 4/15/12 11:51 PM, 胡渐飞 wrote:
    <blockquote
cite="mid:CAMbaM_3zMeH4K2i=k8VZ=B9vT+epfh7WVm3KuYRh5pKH4B+R_A@mail.gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <font>I used <a moz-do-not-send="true"
          href="http://llvm.org/demo">llvm.org/demo</a> to generate IR
        code from c code. <br>
        And I found that: when "return " statement appears several times
        in different conditional block, IR code does not genrate one
        "ret " instruction for each return statement,<br>
        it just put a phi node instruction at the end of the function.
        Just like this:<br>
      </font></blockquote>
    <br>
    The code is most likely being transformed by an LLVM pass which
    modifies each function to have a single return instruction.<br>
    <br>
    Several compiler algorithms assume that a function has a single
    exit; the transform changes a function to meet this assumption.<br>
    <br>
    As Eli has already stated, you can put as many returns in your
    functions as you like (as long as they're at the end of basic
    blocks).<br>
    <br>
    -- John T.<br>
    <br>
    <br>
    <blockquote
cite="mid:CAMbaM_3zMeH4K2i=k8VZ=B9vT+epfh7WVm3KuYRh5pKH4B+R_A@mail.gmail.com"
      type="cite"><font>int factorial(int X) {<br>
         if (X <100)<br>
          X*=3;<br>
        else <br>
          X += 1;<br>
        return X + 3;<br>
        }<br>
        the IR code genrated would be as follow:</font><br>
      <pre><span><span class="llvm_keyword">define</span> <span class="llvm_type">i32</span> @factorial(<span class="llvm_type">i32</span> %X) <span class="llvm_keyword">nounwind</span> uwtable <span class="llvm_keyword">readnone</span> {
  %1 = <span class="llvm_keyword">icmp</span> <span class="llvm_keyword">slt</span> <span class="llvm_type">i32</span> %X, 100
  <span class="llvm_keyword">br</span> <span class="llvm_type">i1</span> %1, <span class="llvm_type">label</span> %2, <span class="llvm_type">label</span> %4

; <<span class="llvm_type">label</span>>:2                                       ; preds = %0
  %3 = <span class="llvm_keyword">mul</span> nsw <span class="llvm_type">i32</span> %X, 3
  <span class="llvm_keyword">br</span> <span class="llvm_type">label</span> %6

; <<span class="llvm_type">label</span>>:4                                       ; preds = %0
  %5 = <span class="llvm_keyword">add</span> nsw <span class="llvm_type">i32</span> %X, 1
  <span class="llvm_keyword">br</span> <span class="llvm_type">label</span> %6

; <<span class="llvm_type">label</span>>:6                                       ; preds = %4, %2
  %.0 = <span class="llvm_keyword">phi</span> <span class="llvm_type">i32</span> [ %3, %2 ], [ %5, %4 ]
  %7 = <span class="llvm_keyword">add</span> nsw <span class="llvm_type">i32</span> %.0, 3
  <span class="llvm_keyword">ret</span> <span class="llvm_type">i32</span> %7
}
Is there any reason or rull to do like this, to use one phi instruction and only one ret instruction?
As I am trying to generate llvm IR code for my language, can I put each each ret at each conditional block like follows?


</span><span>; <<span class="llvm_type">label</span>>:2                                       ; preds = %0
  %3 = <span class="llvm_keyword">mul</span> nsw <span class="llvm_type">i32</span> %X, 3
  ret %3
 ; <<span class="llvm_type">label</span>>:4                                       ; preds = %0
  %5 = <span class="llvm_keyword">add</span> nsw <span class="llvm_type">i32</span> %X, 1
  ret %5</span>

</pre>
      <br>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a class="moz-txt-link-freetext" href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a>
<a class="moz-txt-link-freetext" href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>