<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>