1d80f118eSChris Lattner==================================================
2d80f118eSChris LattnerKaleidoscope: Extending the Language: Control Flow
3d80f118eSChris Lattner==================================================
4d80f118eSChris Lattner
5d80f118eSChris Lattner.. contents::
6d80f118eSChris Lattner   :local:
7d80f118eSChris Lattner
8d80f118eSChris LattnerChapter 5 Introduction
9d80f118eSChris Lattner======================
10d80f118eSChris Lattner
11d80f118eSChris LattnerWelcome to Chapter 5 of the "`Implementing a language with
12d80f118eSChris LattnerLLVM <index.html>`_" tutorial. Parts 1-4 described the implementation of
13d80f118eSChris Lattnerthe simple Kaleidoscope language and included support for generating
14d80f118eSChris LattnerLLVM IR, followed by optimizations and a JIT compiler. Unfortunately, as
15d80f118eSChris Lattnerpresented, Kaleidoscope is mostly useless: it has no control flow other
16d80f118eSChris Lattnerthan call and return. This means that you can't have conditional
17d80f118eSChris Lattnerbranches in the code, significantly limiting its power. In this episode
18d80f118eSChris Lattnerof "build that compiler", we'll extend Kaleidoscope to have an
19d80f118eSChris Lattnerif/then/else expression plus a simple 'for' loop.
20d80f118eSChris Lattner
21d80f118eSChris LattnerIf/Then/Else
22d80f118eSChris Lattner============
23d80f118eSChris Lattner
24d80f118eSChris LattnerExtending Kaleidoscope to support if/then/else is quite straightforward.
25d80f118eSChris LattnerIt basically requires adding support for this "new" concept to the
26d80f118eSChris Lattnerlexer, parser, AST, and LLVM code emitter. This example is nice, because
27d80f118eSChris Lattnerit shows how easy it is to "grow" a language over time, incrementally
28d80f118eSChris Lattnerextending it as new ideas are discovered.
29d80f118eSChris Lattner
30d80f118eSChris LattnerBefore we get going on "how" we add this extension, let's talk about
31d80f118eSChris Lattner"what" we want. The basic idea is that we want to be able to write this
32d80f118eSChris Lattnersort of thing:
33d80f118eSChris Lattner
34d80f118eSChris Lattner::
35d80f118eSChris Lattner
36d80f118eSChris Lattner    def fib(x)
37d80f118eSChris Lattner      if x < 3 then
38d80f118eSChris Lattner        1
39d80f118eSChris Lattner      else
40d80f118eSChris Lattner        fib(x-1)+fib(x-2);
41d80f118eSChris Lattner
42d80f118eSChris LattnerIn Kaleidoscope, every construct is an expression: there are no
43d80f118eSChris Lattnerstatements. As such, the if/then/else expression needs to return a value
44d80f118eSChris Lattnerlike any other. Since we're using a mostly functional form, we'll have
45d80f118eSChris Lattnerit evaluate its conditional, then return the 'then' or 'else' value
46d80f118eSChris Lattnerbased on how the condition was resolved. This is very similar to the C
47d80f118eSChris Lattner"?:" expression.
48d80f118eSChris Lattner
49d80f118eSChris LattnerThe semantics of the if/then/else expression is that it evaluates the
50d80f118eSChris Lattnercondition to a boolean equality value: 0.0 is considered to be false and
51d80f118eSChris Lattnereverything else is considered to be true. If the condition is true, the
52d80f118eSChris Lattnerfirst subexpression is evaluated and returned, if the condition is
53d80f118eSChris Lattnerfalse, the second subexpression is evaluated and returned. Since
54d80f118eSChris LattnerKaleidoscope allows side-effects, this behavior is important to nail
55d80f118eSChris Lattnerdown.
56d80f118eSChris Lattner
57d80f118eSChris LattnerNow that we know what we "want", let's break this down into its
58d80f118eSChris Lattnerconstituent pieces.
59d80f118eSChris Lattner
60d80f118eSChris LattnerLexer Extensions for If/Then/Else
61d80f118eSChris Lattner---------------------------------
62d80f118eSChris Lattner
63d80f118eSChris LattnerThe lexer extensions are straightforward. First we add new enum values
64d80f118eSChris Lattnerfor the relevant tokens:
65d80f118eSChris Lattner
66d80f118eSChris Lattner.. code-block:: c++
67d80f118eSChris Lattner
68d80f118eSChris Lattner      // control
69d80f118eSChris Lattner      tok_if = -6,
70d80f118eSChris Lattner      tok_then = -7,
71d80f118eSChris Lattner      tok_else = -8,
72d80f118eSChris Lattner
73d80f118eSChris LattnerOnce we have that, we recognize the new keywords in the lexer. This is
74d80f118eSChris Lattnerpretty simple stuff:
75d80f118eSChris Lattner
76d80f118eSChris Lattner.. code-block:: c++
77d80f118eSChris Lattner
78d80f118eSChris Lattner        ...
79d80f118eSChris Lattner        if (IdentifierStr == "def")
80d80f118eSChris Lattner          return tok_def;
81d80f118eSChris Lattner        if (IdentifierStr == "extern")
82d80f118eSChris Lattner          return tok_extern;
83d80f118eSChris Lattner        if (IdentifierStr == "if")
84d80f118eSChris Lattner          return tok_if;
85d80f118eSChris Lattner        if (IdentifierStr == "then")
86d80f118eSChris Lattner          return tok_then;
87d80f118eSChris Lattner        if (IdentifierStr == "else")
88d80f118eSChris Lattner          return tok_else;
89d80f118eSChris Lattner        return tok_identifier;
90d80f118eSChris Lattner
91d80f118eSChris LattnerAST Extensions for If/Then/Else
92d80f118eSChris Lattner-------------------------------
93d80f118eSChris Lattner
94d80f118eSChris LattnerTo represent the new expression we add a new AST node for it:
95d80f118eSChris Lattner
96d80f118eSChris Lattner.. code-block:: c++
97d80f118eSChris Lattner
98d80f118eSChris Lattner    /// IfExprAST - Expression class for if/then/else.
99d80f118eSChris Lattner    class IfExprAST : public ExprAST {
100d80f118eSChris Lattner      std::unique_ptr<ExprAST> Cond, Then, Else;
101d80f118eSChris Lattner
102d80f118eSChris Lattner    public:
103d80f118eSChris Lattner      IfExprAST(std::unique_ptr<ExprAST> Cond, std::unique_ptr<ExprAST> Then,
104d80f118eSChris Lattner                std::unique_ptr<ExprAST> Else)
105d80f118eSChris Lattner        : Cond(std::move(Cond)), Then(std::move(Then)), Else(std::move(Else)) {}
106d80f118eSChris Lattner
107d80f118eSChris Lattner      Value *codegen() override;
108d80f118eSChris Lattner    };
109d80f118eSChris Lattner
110d80f118eSChris LattnerThe AST node just has pointers to the various subexpressions.
111d80f118eSChris Lattner
112d80f118eSChris LattnerParser Extensions for If/Then/Else
113d80f118eSChris Lattner----------------------------------
114d80f118eSChris Lattner
115d80f118eSChris LattnerNow that we have the relevant tokens coming from the lexer and we have
116d80f118eSChris Lattnerthe AST node to build, our parsing logic is relatively straightforward.
117d80f118eSChris LattnerFirst we define a new parsing function:
118d80f118eSChris Lattner
119d80f118eSChris Lattner.. code-block:: c++
120d80f118eSChris Lattner
121d80f118eSChris Lattner    /// ifexpr ::= 'if' expression 'then' expression 'else' expression
122d80f118eSChris Lattner    static std::unique_ptr<ExprAST> ParseIfExpr() {
123d80f118eSChris Lattner      getNextToken();  // eat the if.
124d80f118eSChris Lattner
125d80f118eSChris Lattner      // condition.
126d80f118eSChris Lattner      auto Cond = ParseExpression();
127d80f118eSChris Lattner      if (!Cond)
128d80f118eSChris Lattner        return nullptr;
129d80f118eSChris Lattner
130d80f118eSChris Lattner      if (CurTok != tok_then)
131d80f118eSChris Lattner        return LogError("expected then");
132d80f118eSChris Lattner      getNextToken();  // eat the then
133d80f118eSChris Lattner
134d80f118eSChris Lattner      auto Then = ParseExpression();
135d80f118eSChris Lattner      if (!Then)
136d80f118eSChris Lattner        return nullptr;
137d80f118eSChris Lattner
138d80f118eSChris Lattner      if (CurTok != tok_else)
139d80f118eSChris Lattner        return LogError("expected else");
140d80f118eSChris Lattner
141d80f118eSChris Lattner      getNextToken();
142d80f118eSChris Lattner
143d80f118eSChris Lattner      auto Else = ParseExpression();
144d80f118eSChris Lattner      if (!Else)
145d80f118eSChris Lattner        return nullptr;
146d80f118eSChris Lattner
1470eaee545SJonas Devlieghere      return std::make_unique<IfExprAST>(std::move(Cond), std::move(Then),
148d80f118eSChris Lattner                                          std::move(Else));
149d80f118eSChris Lattner    }
150d80f118eSChris Lattner
151d80f118eSChris LattnerNext we hook it up as a primary expression:
152d80f118eSChris Lattner
153d80f118eSChris Lattner.. code-block:: c++
154d80f118eSChris Lattner
155d80f118eSChris Lattner    static std::unique_ptr<ExprAST> ParsePrimary() {
156d80f118eSChris Lattner      switch (CurTok) {
157d80f118eSChris Lattner      default:
158d80f118eSChris Lattner        return LogError("unknown token when expecting an expression");
159d80f118eSChris Lattner      case tok_identifier:
160d80f118eSChris Lattner        return ParseIdentifierExpr();
161d80f118eSChris Lattner      case tok_number:
162d80f118eSChris Lattner        return ParseNumberExpr();
163d80f118eSChris Lattner      case '(':
164d80f118eSChris Lattner        return ParseParenExpr();
165d80f118eSChris Lattner      case tok_if:
166d80f118eSChris Lattner        return ParseIfExpr();
167d80f118eSChris Lattner      }
168d80f118eSChris Lattner    }
169d80f118eSChris Lattner
170d80f118eSChris LattnerLLVM IR for If/Then/Else
171d80f118eSChris Lattner------------------------
172d80f118eSChris Lattner
173d80f118eSChris LattnerNow that we have it parsing and building the AST, the final piece is
174d80f118eSChris Lattneradding LLVM code generation support. This is the most interesting part
175d80f118eSChris Lattnerof the if/then/else example, because this is where it starts to
176d80f118eSChris Lattnerintroduce new concepts. All of the code above has been thoroughly
177d80f118eSChris Lattnerdescribed in previous chapters.
178d80f118eSChris Lattner
179d80f118eSChris LattnerTo motivate the code we want to produce, let's take a look at a simple
180d80f118eSChris Lattnerexample. Consider:
181d80f118eSChris Lattner
182d80f118eSChris Lattner::
183d80f118eSChris Lattner
184d80f118eSChris Lattner    extern foo();
185d80f118eSChris Lattner    extern bar();
186d80f118eSChris Lattner    def baz(x) if x then foo() else bar();
187d80f118eSChris Lattner
188d80f118eSChris LattnerIf you disable optimizations, the code you'll (soon) get from
189d80f118eSChris LattnerKaleidoscope looks like this:
190d80f118eSChris Lattner
191d80f118eSChris Lattner.. code-block:: llvm
192d80f118eSChris Lattner
193d80f118eSChris Lattner    declare double @foo()
194d80f118eSChris Lattner
195d80f118eSChris Lattner    declare double @bar()
196d80f118eSChris Lattner
197d80f118eSChris Lattner    define double @baz(double %x) {
198d80f118eSChris Lattner    entry:
199d80f118eSChris Lattner      %ifcond = fcmp one double %x, 0.000000e+00
200d80f118eSChris Lattner      br i1 %ifcond, label %then, label %else
201d80f118eSChris Lattner
202d80f118eSChris Lattner    then:       ; preds = %entry
203d80f118eSChris Lattner      %calltmp = call double @foo()
204d80f118eSChris Lattner      br label %ifcont
205d80f118eSChris Lattner
206d80f118eSChris Lattner    else:       ; preds = %entry
207d80f118eSChris Lattner      %calltmp1 = call double @bar()
208d80f118eSChris Lattner      br label %ifcont
209d80f118eSChris Lattner
210d80f118eSChris Lattner    ifcont:     ; preds = %else, %then
211d80f118eSChris Lattner      %iftmp = phi double [ %calltmp, %then ], [ %calltmp1, %else ]
212d80f118eSChris Lattner      ret double %iftmp
213d80f118eSChris Lattner    }
214d80f118eSChris Lattner
215d80f118eSChris LattnerTo visualize the control flow graph, you can use a nifty feature of the
21672fd1033SSylvestre LedruLLVM '`opt <https://llvm.org/cmds/opt.html>`_' tool. If you put this LLVM
217*2fa87ab5SArthur EubanksIR into "t.ll" and run "``llvm-as < t.ll | opt -passes=view-cfg``", `a
2182916489cSkristinawindow will pop up <../../ProgrammersManual.html#viewing-graphs-while-debugging-code>`_ and you'll
219d80f118eSChris Lattnersee this graph:
220d80f118eSChris Lattner
221d80f118eSChris Lattner.. figure:: LangImpl05-cfg.png
222d80f118eSChris Lattner   :align: center
223d80f118eSChris Lattner   :alt: Example CFG
224d80f118eSChris Lattner
225d80f118eSChris Lattner   Example CFG
226d80f118eSChris Lattner
227d80f118eSChris LattnerAnother way to get this is to call "``F->viewCFG()``" or
228d80f118eSChris Lattner"``F->viewCFGOnly()``" (where F is a "``Function*``") either by
229d80f118eSChris Lattnerinserting actual calls into the code and recompiling or by calling these
230d80f118eSChris Lattnerin the debugger. LLVM has many nice features for visualizing various
231d80f118eSChris Lattnergraphs.
232d80f118eSChris Lattner
233d80f118eSChris LattnerGetting back to the generated code, it is fairly simple: the entry block
234d80f118eSChris Lattnerevaluates the conditional expression ("x" in our case here) and compares
235d80f118eSChris Lattnerthe result to 0.0 with the "``fcmp one``" instruction ('one' is "Ordered
236d80f118eSChris Lattnerand Not Equal"). Based on the result of this expression, the code jumps
237d80f118eSChris Lattnerto either the "then" or "else" blocks, which contain the expressions for
238d80f118eSChris Lattnerthe true/false cases.
239d80f118eSChris Lattner
240d80f118eSChris LattnerOnce the then/else blocks are finished executing, they both branch back
241d80f118eSChris Lattnerto the 'ifcont' block to execute the code that happens after the
242d80f118eSChris Lattnerif/then/else. In this case the only thing left to do is to return to the
243d80f118eSChris Lattnercaller of the function. The question then becomes: how does the code
244d80f118eSChris Lattnerknow which expression to return?
245d80f118eSChris Lattner
246d80f118eSChris LattnerThe answer to this question involves an important SSA operation: the
247d80f118eSChris Lattner`Phi
248d80f118eSChris Lattneroperation <http://en.wikipedia.org/wiki/Static_single_assignment_form>`_.
249d80f118eSChris LattnerIf you're not familiar with SSA, `the wikipedia
250d80f118eSChris Lattnerarticle <http://en.wikipedia.org/wiki/Static_single_assignment_form>`_
251d80f118eSChris Lattneris a good introduction and there are various other introductions to it
252d80f118eSChris Lattneravailable on your favorite search engine. The short version is that
253d80f118eSChris Lattner"execution" of the Phi operation requires "remembering" which block
254d80f118eSChris Lattnercontrol came from. The Phi operation takes on the value corresponding to
255d80f118eSChris Lattnerthe input control block. In this case, if control comes in from the
256d80f118eSChris Lattner"then" block, it gets the value of "calltmp". If control comes from the
257d80f118eSChris Lattner"else" block, it gets the value of "calltmp1".
258d80f118eSChris Lattner
259d80f118eSChris LattnerAt this point, you are probably starting to think "Oh no! This means my
260d80f118eSChris Lattnersimple and elegant front-end will have to start generating SSA form in
261d80f118eSChris Lattnerorder to use LLVM!". Fortunately, this is not the case, and we strongly
262d80f118eSChris Lattneradvise *not* implementing an SSA construction algorithm in your
263d80f118eSChris Lattnerfront-end unless there is an amazingly good reason to do so. In
264d80f118eSChris Lattnerpractice, there are two sorts of values that float around in code
265d80f118eSChris Lattnerwritten for your average imperative programming language that might need
266d80f118eSChris LattnerPhi nodes:
267d80f118eSChris Lattner
268d80f118eSChris Lattner#. Code that involves user variables: ``x = 1; x = x + 1;``
269d80f118eSChris Lattner#. Values that are implicit in the structure of your AST, such as the
270d80f118eSChris Lattner   Phi node in this case.
271d80f118eSChris Lattner
272d80f118eSChris LattnerIn `Chapter 7 <LangImpl07.html>`_ of this tutorial ("mutable variables"),
273d80f118eSChris Lattnerwe'll talk about #1 in depth. For now, just believe me that you don't
274d80f118eSChris Lattnerneed SSA construction to handle this case. For #2, you have the choice
275d80f118eSChris Lattnerof using the techniques that we will describe for #1, or you can insert
276d80f118eSChris LattnerPhi nodes directly, if convenient. In this case, it is really
277d80f118eSChris Lattnereasy to generate the Phi node, so we choose to do it directly.
278d80f118eSChris Lattner
279d80f118eSChris LattnerOkay, enough of the motivation and overview, let's generate code!
280d80f118eSChris Lattner
281d80f118eSChris LattnerCode Generation for If/Then/Else
282d80f118eSChris Lattner--------------------------------
283d80f118eSChris Lattner
284d80f118eSChris LattnerIn order to generate code for this, we implement the ``codegen`` method
285d80f118eSChris Lattnerfor ``IfExprAST``:
286d80f118eSChris Lattner
287d80f118eSChris Lattner.. code-block:: c++
288d80f118eSChris Lattner
289d80f118eSChris Lattner    Value *IfExprAST::codegen() {
290d80f118eSChris Lattner      Value *CondV = Cond->codegen();
291d80f118eSChris Lattner      if (!CondV)
292d80f118eSChris Lattner        return nullptr;
293d80f118eSChris Lattner
294d80f118eSChris Lattner      // Convert condition to a bool by comparing non-equal to 0.0.
295d80f118eSChris Lattner      CondV = Builder.CreateFCmpONE(
296d80f118eSChris Lattner          CondV, ConstantFP::get(TheContext, APFloat(0.0)), "ifcond");
297d80f118eSChris Lattner
298d80f118eSChris LattnerThis code is straightforward and similar to what we saw before. We emit
299d80f118eSChris Lattnerthe expression for the condition, then compare that value to zero to get
300d80f118eSChris Lattnera truth value as a 1-bit (bool) value.
301d80f118eSChris Lattner
302d80f118eSChris Lattner.. code-block:: c++
303d80f118eSChris Lattner
304d80f118eSChris Lattner      Function *TheFunction = Builder.GetInsertBlock()->getParent();
305d80f118eSChris Lattner
306d80f118eSChris Lattner      // Create blocks for the then and else cases.  Insert the 'then' block at the
307d80f118eSChris Lattner      // end of the function.
308d80f118eSChris Lattner      BasicBlock *ThenBB =
309d80f118eSChris Lattner          BasicBlock::Create(TheContext, "then", TheFunction);
310d80f118eSChris Lattner      BasicBlock *ElseBB = BasicBlock::Create(TheContext, "else");
311d80f118eSChris Lattner      BasicBlock *MergeBB = BasicBlock::Create(TheContext, "ifcont");
312d80f118eSChris Lattner
313d80f118eSChris Lattner      Builder.CreateCondBr(CondV, ThenBB, ElseBB);
314d80f118eSChris Lattner
315d80f118eSChris LattnerThis code creates the basic blocks that are related to the if/then/else
316d80f118eSChris Lattnerstatement, and correspond directly to the blocks in the example above.
317d80f118eSChris LattnerThe first line gets the current Function object that is being built. It
318d80f118eSChris Lattnergets this by asking the builder for the current BasicBlock, and asking
319d80f118eSChris Lattnerthat block for its "parent" (the function it is currently embedded
320d80f118eSChris Lattnerinto).
321d80f118eSChris Lattner
322d80f118eSChris LattnerOnce it has that, it creates three blocks. Note that it passes
323d80f118eSChris Lattner"TheFunction" into the constructor for the "then" block. This causes the
324d80f118eSChris Lattnerconstructor to automatically insert the new block into the end of the
325d80f118eSChris Lattnerspecified function. The other two blocks are created, but aren't yet
326d80f118eSChris Lattnerinserted into the function.
327d80f118eSChris Lattner
328d80f118eSChris LattnerOnce the blocks are created, we can emit the conditional branch that
329d80f118eSChris Lattnerchooses between them. Note that creating new blocks does not implicitly
330d80f118eSChris Lattneraffect the IRBuilder, so it is still inserting into the block that the
331d80f118eSChris Lattnercondition went into. Also note that it is creating a branch to the
332d80f118eSChris Lattner"then" block and the "else" block, even though the "else" block isn't
333d80f118eSChris Lattnerinserted into the function yet. This is all ok: it is the standard way
334d80f118eSChris Lattnerthat LLVM supports forward references.
335d80f118eSChris Lattner
336d80f118eSChris Lattner.. code-block:: c++
337d80f118eSChris Lattner
338d80f118eSChris Lattner      // Emit then value.
339d80f118eSChris Lattner      Builder.SetInsertPoint(ThenBB);
340d80f118eSChris Lattner
341d80f118eSChris Lattner      Value *ThenV = Then->codegen();
342d80f118eSChris Lattner      if (!ThenV)
343d80f118eSChris Lattner        return nullptr;
344d80f118eSChris Lattner
345d80f118eSChris Lattner      Builder.CreateBr(MergeBB);
346d80f118eSChris Lattner      // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
347d80f118eSChris Lattner      ThenBB = Builder.GetInsertBlock();
348d80f118eSChris Lattner
349d80f118eSChris LattnerAfter the conditional branch is inserted, we move the builder to start
350d80f118eSChris Lattnerinserting into the "then" block. Strictly speaking, this call moves the
351d80f118eSChris Lattnerinsertion point to be at the end of the specified block. However, since
352d80f118eSChris Lattnerthe "then" block is empty, it also starts out by inserting at the
353d80f118eSChris Lattnerbeginning of the block. :)
354d80f118eSChris Lattner
355d80f118eSChris LattnerOnce the insertion point is set, we recursively codegen the "then"
356d80f118eSChris Lattnerexpression from the AST. To finish off the "then" block, we create an
357d80f118eSChris Lattnerunconditional branch to the merge block. One interesting (and very
3583546b372Sxguptaimportant) aspect of the LLVM IR is that it :ref:`requires all basic
3593546b372Sxguptablocks to be "terminated" <functionstructure>` with a :ref:`control
3603546b372Sxguptaflow instruction <terminators>`  such as return or branch. This means
3613546b372Sxguptathat all control flow, *including fall throughs* must be made explicit
3623546b372Sxguptain the LLVM IR. If you violate this rule, the verifier will emit an
3633546b372Sxguptaerror.
364d80f118eSChris Lattner
365d80f118eSChris LattnerThe final line here is quite subtle, but is very important. The basic
366d80f118eSChris Lattnerissue is that when we create the Phi node in the merge block, we need to
367d80f118eSChris Lattnerset up the block/value pairs that indicate how the Phi will work.
368d80f118eSChris LattnerImportantly, the Phi node expects to have an entry for each predecessor
369d80f118eSChris Lattnerof the block in the CFG. Why then, are we getting the current block when
370d80f118eSChris Lattnerwe just set it to ThenBB 5 lines above? The problem is that the "Then"
371d80f118eSChris Lattnerexpression may actually itself change the block that the Builder is
372d80f118eSChris Lattneremitting into if, for example, it contains a nested "if/then/else"
373d80f118eSChris Lattnerexpression. Because calling ``codegen()`` recursively could arbitrarily change
374d80f118eSChris Lattnerthe notion of the current block, we are required to get an up-to-date
375d80f118eSChris Lattnervalue for code that will set up the Phi node.
376d80f118eSChris Lattner
377d80f118eSChris Lattner.. code-block:: c++
378d80f118eSChris Lattner
379d80f118eSChris Lattner      // Emit else block.
380d80f118eSChris Lattner      TheFunction->getBasicBlockList().push_back(ElseBB);
381d80f118eSChris Lattner      Builder.SetInsertPoint(ElseBB);
382d80f118eSChris Lattner
383d80f118eSChris Lattner      Value *ElseV = Else->codegen();
384d80f118eSChris Lattner      if (!ElseV)
385d80f118eSChris Lattner        return nullptr;
386d80f118eSChris Lattner
387d80f118eSChris Lattner      Builder.CreateBr(MergeBB);
388d80f118eSChris Lattner      // codegen of 'Else' can change the current block, update ElseBB for the PHI.
389d80f118eSChris Lattner      ElseBB = Builder.GetInsertBlock();
390d80f118eSChris Lattner
391d80f118eSChris LattnerCode generation for the 'else' block is basically identical to codegen
392d80f118eSChris Lattnerfor the 'then' block. The only significant difference is the first line,
393d80f118eSChris Lattnerwhich adds the 'else' block to the function. Recall previously that the
394d80f118eSChris Lattner'else' block was created, but not added to the function. Now that the
395d80f118eSChris Lattner'then' and 'else' blocks are emitted, we can finish up with the merge
396d80f118eSChris Lattnercode:
397d80f118eSChris Lattner
398d80f118eSChris Lattner.. code-block:: c++
399d80f118eSChris Lattner
400d80f118eSChris Lattner      // Emit merge block.
401d80f118eSChris Lattner      TheFunction->getBasicBlockList().push_back(MergeBB);
402d80f118eSChris Lattner      Builder.SetInsertPoint(MergeBB);
403d80f118eSChris Lattner      PHINode *PN =
404d80f118eSChris Lattner        Builder.CreatePHI(Type::getDoubleTy(TheContext), 2, "iftmp");
405d80f118eSChris Lattner
406d80f118eSChris Lattner      PN->addIncoming(ThenV, ThenBB);
407d80f118eSChris Lattner      PN->addIncoming(ElseV, ElseBB);
408d80f118eSChris Lattner      return PN;
409d80f118eSChris Lattner    }
410d80f118eSChris Lattner
411d80f118eSChris LattnerThe first two lines here are now familiar: the first adds the "merge"
412d80f118eSChris Lattnerblock to the Function object (it was previously floating, like the else
413d80f118eSChris Lattnerblock above). The second changes the insertion point so that newly
414d80f118eSChris Lattnercreated code will go into the "merge" block. Once that is done, we need
415d80f118eSChris Lattnerto create the PHI node and set up the block/value pairs for the PHI.
416d80f118eSChris Lattner
417d80f118eSChris LattnerFinally, the CodeGen function returns the phi node as the value computed
418d80f118eSChris Lattnerby the if/then/else expression. In our example above, this returned
419d80f118eSChris Lattnervalue will feed into the code for the top-level function, which will
420d80f118eSChris Lattnercreate the return instruction.
421d80f118eSChris Lattner
422d80f118eSChris LattnerOverall, we now have the ability to execute conditional code in
423d80f118eSChris LattnerKaleidoscope. With this extension, Kaleidoscope is a fairly complete
424d80f118eSChris Lattnerlanguage that can calculate a wide variety of numeric functions. Next up
425d80f118eSChris Lattnerwe'll add another useful expression that is familiar from non-functional
426d80f118eSChris Lattnerlanguages...
427d80f118eSChris Lattner
428d80f118eSChris Lattner'for' Loop Expression
429d80f118eSChris Lattner=====================
430d80f118eSChris Lattner
431d80f118eSChris LattnerNow that we know how to add basic control flow constructs to the
432d80f118eSChris Lattnerlanguage, we have the tools to add more powerful things. Let's add
433d80f118eSChris Lattnersomething more aggressive, a 'for' expression:
434d80f118eSChris Lattner
435d80f118eSChris Lattner::
436d80f118eSChris Lattner
437d80f118eSChris Lattner     extern putchard(char);
438d80f118eSChris Lattner     def printstar(n)
439d80f118eSChris Lattner       for i = 1, i < n, 1.0 in
440d80f118eSChris Lattner         putchard(42);  # ascii 42 = '*'
441d80f118eSChris Lattner
442d80f118eSChris Lattner     # print 100 '*' characters
443d80f118eSChris Lattner     printstar(100);
444d80f118eSChris Lattner
445d80f118eSChris LattnerThis expression defines a new variable ("i" in this case) which iterates
446d80f118eSChris Lattnerfrom a starting value, while the condition ("i < n" in this case) is
447d80f118eSChris Lattnertrue, incrementing by an optional step value ("1.0" in this case). If
448d80f118eSChris Lattnerthe step value is omitted, it defaults to 1.0. While the loop is true,
449d80f118eSChris Lattnerit executes its body expression. Because we don't have anything better
450d80f118eSChris Lattnerto return, we'll just define the loop as always returning 0.0. In the
451d80f118eSChris Lattnerfuture when we have mutable variables, it will get more useful.
452d80f118eSChris Lattner
453d80f118eSChris LattnerAs before, let's talk about the changes that we need to Kaleidoscope to
454d80f118eSChris Lattnersupport this.
455d80f118eSChris Lattner
456d80f118eSChris LattnerLexer Extensions for the 'for' Loop
457d80f118eSChris Lattner-----------------------------------
458d80f118eSChris Lattner
459d80f118eSChris LattnerThe lexer extensions are the same sort of thing as for if/then/else:
460d80f118eSChris Lattner
461d80f118eSChris Lattner.. code-block:: c++
462d80f118eSChris Lattner
463d80f118eSChris Lattner      ... in enum Token ...
464d80f118eSChris Lattner      // control
465d80f118eSChris Lattner      tok_if = -6, tok_then = -7, tok_else = -8,
466d80f118eSChris Lattner      tok_for = -9, tok_in = -10
467d80f118eSChris Lattner
468d80f118eSChris Lattner      ... in gettok ...
469d80f118eSChris Lattner      if (IdentifierStr == "def")
470d80f118eSChris Lattner        return tok_def;
471d80f118eSChris Lattner      if (IdentifierStr == "extern")
472d80f118eSChris Lattner        return tok_extern;
473d80f118eSChris Lattner      if (IdentifierStr == "if")
474d80f118eSChris Lattner        return tok_if;
475d80f118eSChris Lattner      if (IdentifierStr == "then")
476d80f118eSChris Lattner        return tok_then;
477d80f118eSChris Lattner      if (IdentifierStr == "else")
478d80f118eSChris Lattner        return tok_else;
479d80f118eSChris Lattner      if (IdentifierStr == "for")
480d80f118eSChris Lattner        return tok_for;
481d80f118eSChris Lattner      if (IdentifierStr == "in")
482d80f118eSChris Lattner        return tok_in;
483d80f118eSChris Lattner      return tok_identifier;
484d80f118eSChris Lattner
485d80f118eSChris LattnerAST Extensions for the 'for' Loop
486d80f118eSChris Lattner---------------------------------
487d80f118eSChris Lattner
488d80f118eSChris LattnerThe AST node is just as simple. It basically boils down to capturing the
489d80f118eSChris Lattnervariable name and the constituent expressions in the node.
490d80f118eSChris Lattner
491d80f118eSChris Lattner.. code-block:: c++
492d80f118eSChris Lattner
493d80f118eSChris Lattner    /// ForExprAST - Expression class for for/in.
494d80f118eSChris Lattner    class ForExprAST : public ExprAST {
495d80f118eSChris Lattner      std::string VarName;
496d80f118eSChris Lattner      std::unique_ptr<ExprAST> Start, End, Step, Body;
497d80f118eSChris Lattner
498d80f118eSChris Lattner    public:
499d80f118eSChris Lattner      ForExprAST(const std::string &VarName, std::unique_ptr<ExprAST> Start,
500d80f118eSChris Lattner                 std::unique_ptr<ExprAST> End, std::unique_ptr<ExprAST> Step,
501d80f118eSChris Lattner                 std::unique_ptr<ExprAST> Body)
502d80f118eSChris Lattner        : VarName(VarName), Start(std::move(Start)), End(std::move(End)),
503d80f118eSChris Lattner          Step(std::move(Step)), Body(std::move(Body)) {}
504d80f118eSChris Lattner
505d80f118eSChris Lattner      Value *codegen() override;
506d80f118eSChris Lattner    };
507d80f118eSChris Lattner
508d80f118eSChris LattnerParser Extensions for the 'for' Loop
509d80f118eSChris Lattner------------------------------------
510d80f118eSChris Lattner
511d80f118eSChris LattnerThe parser code is also fairly standard. The only interesting thing here
512d80f118eSChris Lattneris handling of the optional step value. The parser code handles it by
513d80f118eSChris Lattnerchecking to see if the second comma is present. If not, it sets the step
514d80f118eSChris Lattnervalue to null in the AST node:
515d80f118eSChris Lattner
516d80f118eSChris Lattner.. code-block:: c++
517d80f118eSChris Lattner
518d80f118eSChris Lattner    /// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
519d80f118eSChris Lattner    static std::unique_ptr<ExprAST> ParseForExpr() {
520d80f118eSChris Lattner      getNextToken();  // eat the for.
521d80f118eSChris Lattner
522d80f118eSChris Lattner      if (CurTok != tok_identifier)
523d80f118eSChris Lattner        return LogError("expected identifier after for");
524d80f118eSChris Lattner
525d80f118eSChris Lattner      std::string IdName = IdentifierStr;
526d80f118eSChris Lattner      getNextToken();  // eat identifier.
527d80f118eSChris Lattner
528d80f118eSChris Lattner      if (CurTok != '=')
529d80f118eSChris Lattner        return LogError("expected '=' after for");
530d80f118eSChris Lattner      getNextToken();  // eat '='.
531d80f118eSChris Lattner
532d80f118eSChris Lattner
533d80f118eSChris Lattner      auto Start = ParseExpression();
534d80f118eSChris Lattner      if (!Start)
535d80f118eSChris Lattner        return nullptr;
536d80f118eSChris Lattner      if (CurTok != ',')
537d80f118eSChris Lattner        return LogError("expected ',' after for start value");
538d80f118eSChris Lattner      getNextToken();
539d80f118eSChris Lattner
540d80f118eSChris Lattner      auto End = ParseExpression();
541d80f118eSChris Lattner      if (!End)
542d80f118eSChris Lattner        return nullptr;
543d80f118eSChris Lattner
544d80f118eSChris Lattner      // The step value is optional.
545d80f118eSChris Lattner      std::unique_ptr<ExprAST> Step;
546d80f118eSChris Lattner      if (CurTok == ',') {
547d80f118eSChris Lattner        getNextToken();
548d80f118eSChris Lattner        Step = ParseExpression();
549d80f118eSChris Lattner        if (!Step)
550d80f118eSChris Lattner          return nullptr;
551d80f118eSChris Lattner      }
552d80f118eSChris Lattner
553d80f118eSChris Lattner      if (CurTok != tok_in)
554d80f118eSChris Lattner        return LogError("expected 'in' after for");
555d80f118eSChris Lattner      getNextToken();  // eat 'in'.
556d80f118eSChris Lattner
557d80f118eSChris Lattner      auto Body = ParseExpression();
558d80f118eSChris Lattner      if (!Body)
559d80f118eSChris Lattner        return nullptr;
560d80f118eSChris Lattner
5610eaee545SJonas Devlieghere      return std::make_unique<ForExprAST>(IdName, std::move(Start),
562d80f118eSChris Lattner                                           std::move(End), std::move(Step),
563d80f118eSChris Lattner                                           std::move(Body));
564d80f118eSChris Lattner    }
565d80f118eSChris Lattner
566d80f118eSChris LattnerAnd again we hook it up as a primary expression:
567d80f118eSChris Lattner
568d80f118eSChris Lattner.. code-block:: c++
569d80f118eSChris Lattner
570d80f118eSChris Lattner    static std::unique_ptr<ExprAST> ParsePrimary() {
571d80f118eSChris Lattner      switch (CurTok) {
572d80f118eSChris Lattner      default:
573d80f118eSChris Lattner        return LogError("unknown token when expecting an expression");
574d80f118eSChris Lattner      case tok_identifier:
575d80f118eSChris Lattner        return ParseIdentifierExpr();
576d80f118eSChris Lattner      case tok_number:
577d80f118eSChris Lattner        return ParseNumberExpr();
578d80f118eSChris Lattner      case '(':
579d80f118eSChris Lattner        return ParseParenExpr();
580d80f118eSChris Lattner      case tok_if:
581d80f118eSChris Lattner        return ParseIfExpr();
582d80f118eSChris Lattner      case tok_for:
583d80f118eSChris Lattner        return ParseForExpr();
584d80f118eSChris Lattner      }
585d80f118eSChris Lattner    }
586d80f118eSChris Lattner
587d80f118eSChris LattnerLLVM IR for the 'for' Loop
588d80f118eSChris Lattner--------------------------
589d80f118eSChris Lattner
590d80f118eSChris LattnerNow we get to the good part: the LLVM IR we want to generate for this
591d80f118eSChris Lattnerthing. With the simple example above, we get this LLVM IR (note that
592d80f118eSChris Lattnerthis dump is generated with optimizations disabled for clarity):
593d80f118eSChris Lattner
594d80f118eSChris Lattner.. code-block:: llvm
595d80f118eSChris Lattner
596d80f118eSChris Lattner    declare double @putchard(double)
597d80f118eSChris Lattner
598d80f118eSChris Lattner    define double @printstar(double %n) {
599d80f118eSChris Lattner    entry:
600d80f118eSChris Lattner      ; initial value = 1.0 (inlined into phi)
601d80f118eSChris Lattner      br label %loop
602d80f118eSChris Lattner
603d80f118eSChris Lattner    loop:       ; preds = %loop, %entry
604d80f118eSChris Lattner      %i = phi double [ 1.000000e+00, %entry ], [ %nextvar, %loop ]
605d80f118eSChris Lattner      ; body
606d80f118eSChris Lattner      %calltmp = call double @putchard(double 4.200000e+01)
607d80f118eSChris Lattner      ; increment
608d80f118eSChris Lattner      %nextvar = fadd double %i, 1.000000e+00
609d80f118eSChris Lattner
610d80f118eSChris Lattner      ; termination test
611d80f118eSChris Lattner      %cmptmp = fcmp ult double %i, %n
612d80f118eSChris Lattner      %booltmp = uitofp i1 %cmptmp to double
613d80f118eSChris Lattner      %loopcond = fcmp one double %booltmp, 0.000000e+00
614d80f118eSChris Lattner      br i1 %loopcond, label %loop, label %afterloop
615d80f118eSChris Lattner
616d80f118eSChris Lattner    afterloop:      ; preds = %loop
617d80f118eSChris Lattner      ; loop always returns 0.0
618d80f118eSChris Lattner      ret double 0.000000e+00
619d80f118eSChris Lattner    }
620d80f118eSChris Lattner
621d80f118eSChris LattnerThis loop contains all the same constructs we saw before: a phi node,
622d80f118eSChris Lattnerseveral expressions, and some basic blocks. Let's see how this fits
623d80f118eSChris Lattnertogether.
624d80f118eSChris Lattner
625d80f118eSChris LattnerCode Generation for the 'for' Loop
626d80f118eSChris Lattner----------------------------------
627d80f118eSChris Lattner
628d80f118eSChris LattnerThe first part of codegen is very simple: we just output the start
629d80f118eSChris Lattnerexpression for the loop value:
630d80f118eSChris Lattner
631d80f118eSChris Lattner.. code-block:: c++
632d80f118eSChris Lattner
633d80f118eSChris Lattner    Value *ForExprAST::codegen() {
634d80f118eSChris Lattner      // Emit the start code first, without 'variable' in scope.
635d80f118eSChris Lattner      Value *StartVal = Start->codegen();
636d80f118eSChris Lattner      if (!StartVal)
637d80f118eSChris Lattner        return nullptr;
638d80f118eSChris Lattner
639d80f118eSChris LattnerWith this out of the way, the next step is to set up the LLVM basic
640d80f118eSChris Lattnerblock for the start of the loop body. In the case above, the whole loop
641d80f118eSChris Lattnerbody is one block, but remember that the body code itself could consist
642d80f118eSChris Lattnerof multiple blocks (e.g. if it contains an if/then/else or a for/in
643d80f118eSChris Lattnerexpression).
644d80f118eSChris Lattner
645d80f118eSChris Lattner.. code-block:: c++
646d80f118eSChris Lattner
647d80f118eSChris Lattner      // Make the new basic block for the loop header, inserting after current
648d80f118eSChris Lattner      // block.
649d80f118eSChris Lattner      Function *TheFunction = Builder.GetInsertBlock()->getParent();
650d80f118eSChris Lattner      BasicBlock *PreheaderBB = Builder.GetInsertBlock();
651d80f118eSChris Lattner      BasicBlock *LoopBB =
652d80f118eSChris Lattner          BasicBlock::Create(TheContext, "loop", TheFunction);
653d80f118eSChris Lattner
654d80f118eSChris Lattner      // Insert an explicit fall through from the current block to the LoopBB.
655d80f118eSChris Lattner      Builder.CreateBr(LoopBB);
656d80f118eSChris Lattner
657d80f118eSChris LattnerThis code is similar to what we saw for if/then/else. Because we will
658d80f118eSChris Lattnerneed it to create the Phi node, we remember the block that falls through
659d80f118eSChris Lattnerinto the loop. Once we have that, we create the actual block that starts
660d80f118eSChris Lattnerthe loop and create an unconditional branch for the fall-through between
661d80f118eSChris Lattnerthe two blocks.
662d80f118eSChris Lattner
663d80f118eSChris Lattner.. code-block:: c++
664d80f118eSChris Lattner
665d80f118eSChris Lattner      // Start insertion in LoopBB.
666d80f118eSChris Lattner      Builder.SetInsertPoint(LoopBB);
667d80f118eSChris Lattner
668d80f118eSChris Lattner      // Start the PHI node with an entry for Start.
669d80f118eSChris Lattner      PHINode *Variable = Builder.CreatePHI(Type::getDoubleTy(TheContext),
670d80f118eSChris Lattner                                            2, VarName.c_str());
671d80f118eSChris Lattner      Variable->addIncoming(StartVal, PreheaderBB);
672d80f118eSChris Lattner
673d80f118eSChris LattnerNow that the "preheader" for the loop is set up, we switch to emitting
674d80f118eSChris Lattnercode for the loop body. To begin with, we move the insertion point and
675d80f118eSChris Lattnercreate the PHI node for the loop induction variable. Since we already
676d80f118eSChris Lattnerknow the incoming value for the starting value, we add it to the Phi
677d80f118eSChris Lattnernode. Note that the Phi will eventually get a second value for the
678d80f118eSChris Lattnerbackedge, but we can't set it up yet (because it doesn't exist!).
679d80f118eSChris Lattner
680d80f118eSChris Lattner.. code-block:: c++
681d80f118eSChris Lattner
682d80f118eSChris Lattner      // Within the loop, the variable is defined equal to the PHI node.  If it
683d80f118eSChris Lattner      // shadows an existing variable, we have to restore it, so save it now.
684d80f118eSChris Lattner      Value *OldVal = NamedValues[VarName];
685d80f118eSChris Lattner      NamedValues[VarName] = Variable;
686d80f118eSChris Lattner
687d80f118eSChris Lattner      // Emit the body of the loop.  This, like any other expr, can change the
688d80f118eSChris Lattner      // current BB.  Note that we ignore the value computed by the body, but don't
689d80f118eSChris Lattner      // allow an error.
690d80f118eSChris Lattner      if (!Body->codegen())
691d80f118eSChris Lattner        return nullptr;
692d80f118eSChris Lattner
693d80f118eSChris LattnerNow the code starts to get more interesting. Our 'for' loop introduces a
694d80f118eSChris Lattnernew variable to the symbol table. This means that our symbol table can
695d80f118eSChris Lattnernow contain either function arguments or loop variables. To handle this,
696d80f118eSChris Lattnerbefore we codegen the body of the loop, we add the loop variable as the
697d80f118eSChris Lattnercurrent value for its name. Note that it is possible that there is a
698d80f118eSChris Lattnervariable of the same name in the outer scope. It would be easy to make
699d80f118eSChris Lattnerthis an error (emit an error and return null if there is already an
700d80f118eSChris Lattnerentry for VarName) but we choose to allow shadowing of variables. In
701d80f118eSChris Lattnerorder to handle this correctly, we remember the Value that we are
702d80f118eSChris Lattnerpotentially shadowing in ``OldVal`` (which will be null if there is no
703d80f118eSChris Lattnershadowed variable).
704d80f118eSChris Lattner
705d80f118eSChris LattnerOnce the loop variable is set into the symbol table, the code
706d80f118eSChris Lattnerrecursively codegen's the body. This allows the body to use the loop
707d80f118eSChris Lattnervariable: any references to it will naturally find it in the symbol
708d80f118eSChris Lattnertable.
709d80f118eSChris Lattner
710d80f118eSChris Lattner.. code-block:: c++
711d80f118eSChris Lattner
712d80f118eSChris Lattner      // Emit the step value.
713d80f118eSChris Lattner      Value *StepVal = nullptr;
714d80f118eSChris Lattner      if (Step) {
715d80f118eSChris Lattner        StepVal = Step->codegen();
716d80f118eSChris Lattner        if (!StepVal)
717d80f118eSChris Lattner          return nullptr;
718d80f118eSChris Lattner      } else {
719d80f118eSChris Lattner        // If not specified, use 1.0.
720d80f118eSChris Lattner        StepVal = ConstantFP::get(TheContext, APFloat(1.0));
721d80f118eSChris Lattner      }
722d80f118eSChris Lattner
723d80f118eSChris Lattner      Value *NextVar = Builder.CreateFAdd(Variable, StepVal, "nextvar");
724d80f118eSChris Lattner
725d80f118eSChris LattnerNow that the body is emitted, we compute the next value of the iteration
726d80f118eSChris Lattnervariable by adding the step value, or 1.0 if it isn't present.
727d80f118eSChris Lattner'``NextVar``' will be the value of the loop variable on the next
728d80f118eSChris Lattneriteration of the loop.
729d80f118eSChris Lattner
730d80f118eSChris Lattner.. code-block:: c++
731d80f118eSChris Lattner
732d80f118eSChris Lattner      // Compute the end condition.
733d80f118eSChris Lattner      Value *EndCond = End->codegen();
734d80f118eSChris Lattner      if (!EndCond)
735d80f118eSChris Lattner        return nullptr;
736d80f118eSChris Lattner
737d80f118eSChris Lattner      // Convert condition to a bool by comparing non-equal to 0.0.
738d80f118eSChris Lattner      EndCond = Builder.CreateFCmpONE(
739d80f118eSChris Lattner          EndCond, ConstantFP::get(TheContext, APFloat(0.0)), "loopcond");
740d80f118eSChris Lattner
741d80f118eSChris LattnerFinally, we evaluate the exit value of the loop, to determine whether
742d80f118eSChris Lattnerthe loop should exit. This mirrors the condition evaluation for the
743d80f118eSChris Lattnerif/then/else statement.
744d80f118eSChris Lattner
745d80f118eSChris Lattner.. code-block:: c++
746d80f118eSChris Lattner
747d80f118eSChris Lattner      // Create the "after loop" block and insert it.
748d80f118eSChris Lattner      BasicBlock *LoopEndBB = Builder.GetInsertBlock();
749d80f118eSChris Lattner      BasicBlock *AfterBB =
750d80f118eSChris Lattner          BasicBlock::Create(TheContext, "afterloop", TheFunction);
751d80f118eSChris Lattner
752d80f118eSChris Lattner      // Insert the conditional branch into the end of LoopEndBB.
753d80f118eSChris Lattner      Builder.CreateCondBr(EndCond, LoopBB, AfterBB);
754d80f118eSChris Lattner
755d80f118eSChris Lattner      // Any new code will be inserted in AfterBB.
756d80f118eSChris Lattner      Builder.SetInsertPoint(AfterBB);
757d80f118eSChris Lattner
758d80f118eSChris LattnerWith the code for the body of the loop complete, we just need to finish
759d80f118eSChris Lattnerup the control flow for it. This code remembers the end block (for the
760d80f118eSChris Lattnerphi node), then creates the block for the loop exit ("afterloop"). Based
761d80f118eSChris Lattneron the value of the exit condition, it creates a conditional branch that
762d80f118eSChris Lattnerchooses between executing the loop again and exiting the loop. Any
763d80f118eSChris Lattnerfuture code is emitted in the "afterloop" block, so it sets the
764d80f118eSChris Lattnerinsertion position to it.
765d80f118eSChris Lattner
766d80f118eSChris Lattner.. code-block:: c++
767d80f118eSChris Lattner
768d80f118eSChris Lattner      // Add a new entry to the PHI node for the backedge.
769d80f118eSChris Lattner      Variable->addIncoming(NextVar, LoopEndBB);
770d80f118eSChris Lattner
771d80f118eSChris Lattner      // Restore the unshadowed variable.
772d80f118eSChris Lattner      if (OldVal)
773d80f118eSChris Lattner        NamedValues[VarName] = OldVal;
774d80f118eSChris Lattner      else
775d80f118eSChris Lattner        NamedValues.erase(VarName);
776d80f118eSChris Lattner
777d80f118eSChris Lattner      // for expr always returns 0.0.
778d80f118eSChris Lattner      return Constant::getNullValue(Type::getDoubleTy(TheContext));
779d80f118eSChris Lattner    }
780d80f118eSChris Lattner
781d80f118eSChris LattnerThe final code handles various cleanups: now that we have the "NextVar"
782d80f118eSChris Lattnervalue, we can add the incoming value to the loop PHI node. After that,
783d80f118eSChris Lattnerwe remove the loop variable from the symbol table, so that it isn't in
784d80f118eSChris Lattnerscope after the for loop. Finally, code generation of the for loop
785d80f118eSChris Lattneralways returns 0.0, so that is what we return from
786d80f118eSChris Lattner``ForExprAST::codegen()``.
787d80f118eSChris Lattner
788d80f118eSChris LattnerWith this, we conclude the "adding control flow to Kaleidoscope" chapter
789d80f118eSChris Lattnerof the tutorial. In this chapter we added two control flow constructs,
790d80f118eSChris Lattnerand used them to motivate a couple of aspects of the LLVM IR that are
791d80f118eSChris Lattnerimportant for front-end implementors to know. In the next chapter of our
792d80f118eSChris Lattnersaga, we will get a bit crazier and add `user-defined
793d80f118eSChris Lattneroperators <LangImpl06.html>`_ to our poor innocent language.
794d80f118eSChris Lattner
795d80f118eSChris LattnerFull Code Listing
796d80f118eSChris Lattner=================
797d80f118eSChris Lattner
798d80f118eSChris LattnerHere is the complete code listing for our running example, enhanced with
799d80f118eSChris Lattnerthe if/then/else and for expressions. To build this example, use:
800d80f118eSChris Lattner
801d80f118eSChris Lattner.. code-block:: bash
802d80f118eSChris Lattner
803d80f118eSChris Lattner    # Compile
8043546b372Sxgupta    clang++ -g toy.cpp `llvm-config --cxxflags --ldflags --system-libs --libs core orcjit native` -O3 -o toy
805d80f118eSChris Lattner    # Run
806d80f118eSChris Lattner    ./toy
807d80f118eSChris Lattner
808d80f118eSChris LattnerHere is the code:
809d80f118eSChris Lattner
810147e0ddaSHans Wennborg.. literalinclude:: ../../../examples/Kaleidoscope/Chapter5/toy.cpp
811d80f118eSChris Lattner   :language: c++
812d80f118eSChris Lattner
813d80f118eSChris Lattner`Next: Extending the language: user-defined operators <LangImpl06.html>`_
814d80f118eSChris Lattner
815