<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
  <title>LLVM Tutorial 2: A More Complicated Function</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="author" content="Owen Anderson">
  <meta name="description" 
  content="LLVM Tutorial 2: A More Complicated Function.">
  <link rel="stylesheet" href="../llvm.css" type="text/css">
</head>

<body>

<div class="doc_title"> LLVM Tutorial 2: A More Complicated Function </div>

<div class="doc_author">
  <p>Written by <a href="mailto:owen@apple.com">Owen Anderson</a></p>
</div>

<!-- *********************************************************************** -->
<div class="doc_section"><a name="intro">A First Function</a></div>
<!-- *********************************************************************** -->

<div class="doc_text">

<p>Now that we understand the basics of creating functions in LLVM, let's move on to a more complicated example: something with control flow.  As an example, let's consider Euclid's Greatest Common Denominator (GCD) algorithm:</p>

<div class="doc_code">
<pre>
unsigned gcd(unsigned x, unsigned y) {
  if(x == y) {
    return x;
  } else if(x &lt; y) {
    return gcd(x, y - x);
  } else {
    return gcd(x - y, y);
  }
}
</pre>
</div>

<p>With this example, we'll learn how to create functions with multiple blocks and control flow, and how to make function calls within your LLVM code.  For starters, consider the diagram below.</p>

<div style="text-align: center;"><img src="JITTutorial2-1.png" alt="GCD CFG" width="60%"></div>

<p>This is a graphical representation of a program in LLVM IR.  It places each basic block on a node of a graph and uses directed edges to indicate flow control.  These blocks will be serialized when written to a text or bitcode file, but it is often useful conceptually to think of them as a graph.  Again, if you are unsure about the code in the diagram, you should skim through the <a href="../LangRef.html">LLVM Language Reference Manual</a> and convince yourself that it is, in fact, the GCD algorithm.</p>

<p>The first part of our code is practically the same as from the first tutorial.  The same basic setup is required: creating a module, verifying it, and running the <code>PrintModulePass</code> on it.  Even the first segment of  <code>makeLLVMModule()</code> looks essentially the same, except that <code>gcd</code> takes one fewer parameter than <code>mul_add</code>.</p>

<div class="doc_code">
<pre>
#include &lt;llvm/Module.h&gt;
#include &lt;llvm/Function.h&gt;
#include &lt;llvm/PassManager.h&gt;
#include &lt;llvm/Analysis/Verifier.h&gt;
#include &lt;llvm/Assembly/PrintModulePass.h&gt;
#include &lt;llvm/Support/IRBuilder.h&gt;

using namespace llvm;

Module* makeLLVMModule();

int main(int argc, char**argv) {
  Module* Mod = makeLLVMModule();
  
  verifyModule(*Mod, PrintMessageAction);
  
  PassManager PM;
  PM.add(new PrintModulePass(&amp;llvm::cout));
  PM.run(*Mod);
  
  return 0;
}

Module* makeLLVMModule() {
  Module* mod = new Module(&quot;tut2&quot;);
  
  Constant* c = mod-&gt;getOrInsertFunction(&quot;gcd&quot;,
                                         IntegerType::get(32),
                                         IntegerType::get(32),
                                         IntegerType::get(32),
                                         NULL);
  Function* gcd = cast&lt;Function&gt;(c);
  
  Function::arg_iterator args = gcd-&gt;arg_begin();
  Value* x = args++;
  x-&gt;setName(&quot;x&quot;);
  Value* y = args++;
  y-&gt;setName(&quot;y&quot;);
</pre>
</div>

<p>Here, however, is where our code begins to diverge from the first tutorial.  Because <code>gcd</code> has control flow, it is composed of multiple blocks interconnected by branching (<code>br</code>) instructions.  For those familiar with assembly language, a block is similar to a labeled set of instructions.  For those not familiar with assembly language, a block is basically a set of instructions that can be branched to and is executed linearly until the block is terminated by one of a small number of control flow instructions, such as <code>br</code> or <code>ret</code>.</p>

<p>Blocks correspond to the nodes in the diagram we looked at in the beginning of this tutorial.  From the diagram, we can see that this function contains five blocks, so we'll go ahead and create them.  Note that we're making use of LLVM's automatic name uniquing in this code sample, since we're giving two blocks the same name.</p>

<div class="doc_code">
<pre>
  BasicBlock* entry = BasicBlock::Create(&quot;entry&quot;, gcd);
  BasicBlock* ret = BasicBlock::Create(&quot;return&quot;, gcd);
  BasicBlock* cond_false = BasicBlock::Create(&quot;cond_false&quot;, gcd);
  BasicBlock* cond_true = BasicBlock::Create(&quot;cond_true&quot;, gcd);
  BasicBlock* cond_false_2 = BasicBlock::Create(&quot;cond_false&quot;, gcd);
</pre>
</div>

<p>Now we're ready to begin generating code!  We'll start with the <code>entry</code> block.  This block corresponds to the top-level if-statement in the original C code, so we need to compare <code>x</code> and <code>y</code>.  To achieve this, we perform an explicit comparison using <code>ICmpEQ</code>.  <code>ICmpEQ</code> stands for an <em>integer comparison for equality</em> and returns a 1-bit integer result.  This 1-bit result is then used as the input to a conditional branch, with <code>ret</code> as the <code>true</code> and <code>cond_false</code> as the <code>false</code> case.</p>

<div class="doc_code">
<pre>
  IRBuilder builder(entry);
  Value* xEqualsY = builder.CreateICmpEQ(x, y, &quot;tmp&quot;);
  builder.CreateCondBr(xEqualsY, ret, cond_false);
</pre>
</div>

<p>Our next block, <code>ret</code>, is pretty simple: it just returns the value of <code>x</code>.  Recall that this block is only reached if <code>x == y</code>, so this is the correct behavior.  Notice that instead of creating a new <code>IRBuilder</code> for each block, we can use <code>SetInsertPoint</code> to retarget our existing one.  This saves on construction and memory allocation costs.</p>

<div class="doc_code">
<pre>
  builder.SetInsertPoint(ret);
  builder.CreateRet(x);
</pre>
</div>

<p><code>cond_false</code> is a more interesting block: we now know that <code>x != y</code>, so we must branch again to determine which of <code>x</code> and <code>y</code> is larger.  This is achieved using the <code>ICmpULT</code> instruction, which stands for <em>integer comparison for unsigned less-than</em>.  In LLVM, integer types do not carry sign; a 32-bit integer pseudo-register can interpreted as signed or unsigned without casting.  Whether a signed or unsigned interpretation is desired is specified in the instruction.  This is why several instructions in the LLVM IR, such as integer less-than, include a specifier for signed or unsigned.</p>

<p>Also note that we're again making use of LLVM's automatic name uniquing, this time at a register level.  We've deliberately chosen to name every instruction "tmp" to illustrate that LLVM will give them all unique names without getting confused.</p>

<div class="doc_code">
<pre>
  builder.SetInsertPoint(cond_false);
  Value* xLessThanY = builder.CreateICmpULT(x, y, &quot;tmp&quot;);
  builder.CreateCondBr(xLessThanY, cond_true, cond_false_2);
</pre>
</div>

<p>Our last two blocks are quite similar; they're both recursive calls to <code>gcd</code> with different parameters.  To create a call instruction, we have to create a <code>vector</code> (or any other container with <code>InputInterator</code>s) to hold the arguments.  We then pass in the beginning and ending iterators for this vector.</p>

<div class="doc_code">
<pre>
  builder.SetInsertPoint(cond_true);
  Value* yMinusX = builder.CreateSub(y, x, &quot;tmp&quot;);
  std::vector&lt;Value*&gt; args1;
  args1.push_back(x);
  args1.push_back(yMinusX);
  Value* recur_1 = builder.CreateCall(gcd, args1.begin(), args1.end(), &quot;tmp&quot;);
  builder.CreateRet(recur_1);
  
  builder.SetInsertPoint(cond_false_2);
  Value* xMinusY = builder.CreateSub(x, y, &quot;tmp&quot;);
  std::vector&lt;Value*&gt; args2;
  args2.push_back(xMinusY);
  args2.push_back(y);
  Value* recur_2 = builder.CreateCall(gcd, args2.begin(), args2.end(), &quot;tmp&quot;);
  builder.CreateRet(recur_2);
  
  return mod;
}
</pre>
</div>

<p>And that's it!  You can compile and execute your code in the same way as before, by doing:</p>

<div class="doc_code">
<pre>
# c++ -g tut2.cpp `llvm-config --cxxflags --ldflags --libs core` -o tut2
# ./tut2
</pre>
</div>

</div>

<!-- *********************************************************************** -->
<hr>
<address>
  <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
  src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
  <a href="http://validator.w3.org/check/referer"><img
  src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>

  <a href="mailto:owen@apple.com">Owen Anderson</a><br>
  <a href="http://llvm.org">The LLVM Compiler Infrastructure</a><br>
  Last modified: $Date: 2007-10-17 11:05:13 -0700 (Wed, 17 Oct 2007) $
</address>

</body>
</html>
