1d80f118eSChris Lattner=======================================================
2d80f118eSChris LattnerKaleidoscope: Extending the Language: Mutable Variables
3d80f118eSChris Lattner=======================================================
4d80f118eSChris Lattner
5d80f118eSChris Lattner.. contents::
6d80f118eSChris Lattner   :local:
7d80f118eSChris Lattner
8d80f118eSChris LattnerChapter 7 Introduction
9d80f118eSChris Lattner======================
10d80f118eSChris Lattner
11d80f118eSChris LattnerWelcome to Chapter 7 of the "`Implementing a language with
12d80f118eSChris LattnerLLVM <index.html>`_" tutorial. In chapters 1 through 6, we've built a
13d80f118eSChris Lattnervery respectable, albeit simple, `functional programming
14d80f118eSChris Lattnerlanguage <http://en.wikipedia.org/wiki/Functional_programming>`_. In our
15d80f118eSChris Lattnerjourney, we learned some parsing techniques, how to build and represent
16d80f118eSChris Lattneran AST, how to build LLVM IR, and how to optimize the resultant code as
17d80f118eSChris Lattnerwell as JIT compile it.
18d80f118eSChris Lattner
19d80f118eSChris LattnerWhile Kaleidoscope is interesting as a functional language, the fact
20d80f118eSChris Lattnerthat it is functional makes it "too easy" to generate LLVM IR for it. In
21d80f118eSChris Lattnerparticular, a functional language makes it very easy to build LLVM IR
22d80f118eSChris Lattnerdirectly in `SSA
23d80f118eSChris Lattnerform <http://en.wikipedia.org/wiki/Static_single_assignment_form>`_.
24d80f118eSChris LattnerSince LLVM requires that the input code be in SSA form, this is a very
25d80f118eSChris Lattnernice property and it is often unclear to newcomers how to generate code
26d80f118eSChris Lattnerfor an imperative language with mutable variables.
27d80f118eSChris Lattner
28d80f118eSChris LattnerThe short (and happy) summary of this chapter is that there is no need
29d80f118eSChris Lattnerfor your front-end to build SSA form: LLVM provides highly tuned and
30d80f118eSChris Lattnerwell tested support for this, though the way it works is a bit
31d80f118eSChris Lattnerunexpected for some.
32d80f118eSChris Lattner
33d80f118eSChris LattnerWhy is this a hard problem?
34d80f118eSChris Lattner===========================
35d80f118eSChris Lattner
36d80f118eSChris LattnerTo understand why mutable variables cause complexities in SSA
37d80f118eSChris Lattnerconstruction, consider this extremely simple C example:
38d80f118eSChris Lattner
39d80f118eSChris Lattner.. code-block:: c
40d80f118eSChris Lattner
41d80f118eSChris Lattner    int G, H;
42d80f118eSChris Lattner    int test(_Bool Condition) {
43d80f118eSChris Lattner      int X;
44d80f118eSChris Lattner      if (Condition)
45d80f118eSChris Lattner        X = G;
46d80f118eSChris Lattner      else
47d80f118eSChris Lattner        X = H;
48d80f118eSChris Lattner      return X;
49d80f118eSChris Lattner    }
50d80f118eSChris Lattner
51d80f118eSChris LattnerIn this case, we have the variable "X", whose value depends on the path
52d80f118eSChris Lattnerexecuted in the program. Because there are two different possible values
53d80f118eSChris Lattnerfor X before the return instruction, a PHI node is inserted to merge the
54d80f118eSChris Lattnertwo values. The LLVM IR that we want for this example looks like this:
55d80f118eSChris Lattner
56d80f118eSChris Lattner.. code-block:: llvm
57d80f118eSChris Lattner
58d80f118eSChris Lattner    @G = weak global i32 0   ; type of @G is i32*
59d80f118eSChris Lattner    @H = weak global i32 0   ; type of @H is i32*
60d80f118eSChris Lattner
61d80f118eSChris Lattner    define i32 @test(i1 %Condition) {
62d80f118eSChris Lattner    entry:
63d80f118eSChris Lattner      br i1 %Condition, label %cond_true, label %cond_false
64d80f118eSChris Lattner
65d80f118eSChris Lattner    cond_true:
66*391f9ef1SJim Lin      %X.0 = load i32, i32* @G
67d80f118eSChris Lattner      br label %cond_next
68d80f118eSChris Lattner
69d80f118eSChris Lattner    cond_false:
70*391f9ef1SJim Lin      %X.1 = load i32, i32* @H
71d80f118eSChris Lattner      br label %cond_next
72d80f118eSChris Lattner
73d80f118eSChris Lattner    cond_next:
74d80f118eSChris Lattner      %X.2 = phi i32 [ %X.1, %cond_false ], [ %X.0, %cond_true ]
75d80f118eSChris Lattner      ret i32 %X.2
76d80f118eSChris Lattner    }
77d80f118eSChris Lattner
78d80f118eSChris LattnerIn this example, the loads from the G and H global variables are
79d80f118eSChris Lattnerexplicit in the LLVM IR, and they live in the then/else branches of the
80d80f118eSChris Lattnerif statement (cond\_true/cond\_false). In order to merge the incoming
81d80f118eSChris Lattnervalues, the X.2 phi node in the cond\_next block selects the right value
82d80f118eSChris Lattnerto use based on where control flow is coming from: if control flow comes
83d80f118eSChris Lattnerfrom the cond\_false block, X.2 gets the value of X.1. Alternatively, if
84d80f118eSChris Lattnercontrol flow comes from cond\_true, it gets the value of X.0. The intent
85d80f118eSChris Lattnerof this chapter is not to explain the details of SSA form. For more
86d80f118eSChris Lattnerinformation, see one of the many `online
87d80f118eSChris Lattnerreferences <http://en.wikipedia.org/wiki/Static_single_assignment_form>`_.
88d80f118eSChris Lattner
89d80f118eSChris LattnerThe question for this article is "who places the phi nodes when lowering
90d80f118eSChris Lattnerassignments to mutable variables?". The issue here is that LLVM
91d80f118eSChris Lattner*requires* that its IR be in SSA form: there is no "non-ssa" mode for
92d80f118eSChris Lattnerit. However, SSA construction requires non-trivial algorithms and data
93d80f118eSChris Lattnerstructures, so it is inconvenient and wasteful for every front-end to
94d80f118eSChris Lattnerhave to reproduce this logic.
95d80f118eSChris Lattner
96d80f118eSChris LattnerMemory in LLVM
97d80f118eSChris Lattner==============
98d80f118eSChris Lattner
99d80f118eSChris LattnerThe 'trick' here is that while LLVM does require all register values to
100d80f118eSChris Lattnerbe in SSA form, it does not require (or permit) memory objects to be in
101d80f118eSChris LattnerSSA form. In the example above, note that the loads from G and H are
102d80f118eSChris Lattnerdirect accesses to G and H: they are not renamed or versioned. This
103d80f118eSChris Lattnerdiffers from some other compiler systems, which do try to version memory
104d80f118eSChris Lattnerobjects. In LLVM, instead of encoding dataflow analysis of memory into
105d80f118eSChris Lattnerthe LLVM IR, it is handled with `Analysis
1062916489cSkristinaPasses <../../WritingAnLLVMPass.html>`_ which are computed on demand.
107d80f118eSChris Lattner
108d80f118eSChris LattnerWith this in mind, the high-level idea is that we want to make a stack
109d80f118eSChris Lattnervariable (which lives in memory, because it is on the stack) for each
110d80f118eSChris Lattnermutable object in a function. To take advantage of this trick, we need
111d80f118eSChris Lattnerto talk about how LLVM represents stack variables.
112d80f118eSChris Lattner
113d80f118eSChris LattnerIn LLVM, all memory accesses are explicit with load/store instructions,
114d80f118eSChris Lattnerand it is carefully designed not to have (or need) an "address-of"
115d80f118eSChris Lattneroperator. Notice how the type of the @G/@H global variables is actually
116d80f118eSChris Lattner"i32\*" even though the variable is defined as "i32". What this means is
117d80f118eSChris Lattnerthat @G defines *space* for an i32 in the global data area, but its
118d80f118eSChris Lattner*name* actually refers to the address for that space. Stack variables
119d80f118eSChris Lattnerwork the same way, except that instead of being declared with global
120d80f118eSChris Lattnervariable definitions, they are declared with the `LLVM alloca
1212916489cSkristinainstruction <../../LangRef.html#alloca-instruction>`_:
122d80f118eSChris Lattner
123d80f118eSChris Lattner.. code-block:: llvm
124d80f118eSChris Lattner
125d80f118eSChris Lattner    define i32 @example() {
126d80f118eSChris Lattner    entry:
127d80f118eSChris Lattner      %X = alloca i32           ; type of %X is i32*.
128d80f118eSChris Lattner      ...
129*391f9ef1SJim Lin      %tmp = load i32, i32* %X  ; load the stack value %X from the stack.
130d80f118eSChris Lattner      %tmp2 = add i32 %tmp, 1   ; increment it
131d80f118eSChris Lattner      store i32 %tmp2, i32* %X  ; store it back
132d80f118eSChris Lattner      ...
133d80f118eSChris Lattner
134d80f118eSChris LattnerThis code shows an example of how you can declare and manipulate a stack
135d80f118eSChris Lattnervariable in the LLVM IR. Stack memory allocated with the alloca
136d80f118eSChris Lattnerinstruction is fully general: you can pass the address of the stack slot
137d80f118eSChris Lattnerto functions, you can store it in other variables, etc. In our example
138d80f118eSChris Lattnerabove, we could rewrite the example to use the alloca technique to avoid
139d80f118eSChris Lattnerusing a PHI node:
140d80f118eSChris Lattner
141d80f118eSChris Lattner.. code-block:: llvm
142d80f118eSChris Lattner
143d80f118eSChris Lattner    @G = weak global i32 0   ; type of @G is i32*
144d80f118eSChris Lattner    @H = weak global i32 0   ; type of @H is i32*
145d80f118eSChris Lattner
146d80f118eSChris Lattner    define i32 @test(i1 %Condition) {
147d80f118eSChris Lattner    entry:
148d80f118eSChris Lattner      %X = alloca i32           ; type of %X is i32*.
149d80f118eSChris Lattner      br i1 %Condition, label %cond_true, label %cond_false
150d80f118eSChris Lattner
151d80f118eSChris Lattner    cond_true:
152*391f9ef1SJim Lin      %X.0 = load i32, i32* @G
153d80f118eSChris Lattner      store i32 %X.0, i32* %X   ; Update X
154d80f118eSChris Lattner      br label %cond_next
155d80f118eSChris Lattner
156d80f118eSChris Lattner    cond_false:
157*391f9ef1SJim Lin      %X.1 = load i32, i32* @H
158d80f118eSChris Lattner      store i32 %X.1, i32* %X   ; Update X
159d80f118eSChris Lattner      br label %cond_next
160d80f118eSChris Lattner
161d80f118eSChris Lattner    cond_next:
162*391f9ef1SJim Lin      %X.2 = load i32, i32* %X  ; Read X
163d80f118eSChris Lattner      ret i32 %X.2
164d80f118eSChris Lattner    }
165d80f118eSChris Lattner
166d80f118eSChris LattnerWith this, we have discovered a way to handle arbitrary mutable
167d80f118eSChris Lattnervariables without the need to create Phi nodes at all:
168d80f118eSChris Lattner
169d80f118eSChris Lattner#. Each mutable variable becomes a stack allocation.
170d80f118eSChris Lattner#. Each read of the variable becomes a load from the stack.
171d80f118eSChris Lattner#. Each update of the variable becomes a store to the stack.
172d80f118eSChris Lattner#. Taking the address of a variable just uses the stack address
173d80f118eSChris Lattner   directly.
174d80f118eSChris Lattner
175d80f118eSChris LattnerWhile this solution has solved our immediate problem, it introduced
176d80f118eSChris Lattneranother one: we have now apparently introduced a lot of stack traffic
177d80f118eSChris Lattnerfor very simple and common operations, a major performance problem.
178d80f118eSChris LattnerFortunately for us, the LLVM optimizer has a highly-tuned optimization
179d80f118eSChris Lattnerpass named "mem2reg" that handles this case, promoting allocas like this
180d80f118eSChris Lattnerinto SSA registers, inserting Phi nodes as appropriate. If you run this
181d80f118eSChris Lattnerexample through the pass, for example, you'll get:
182d80f118eSChris Lattner
183d80f118eSChris Lattner.. code-block:: bash
184d80f118eSChris Lattner
185d80f118eSChris Lattner    $ llvm-as < example.ll | opt -mem2reg | llvm-dis
186d80f118eSChris Lattner    @G = weak global i32 0
187d80f118eSChris Lattner    @H = weak global i32 0
188d80f118eSChris Lattner
189d80f118eSChris Lattner    define i32 @test(i1 %Condition) {
190d80f118eSChris Lattner    entry:
191d80f118eSChris Lattner      br i1 %Condition, label %cond_true, label %cond_false
192d80f118eSChris Lattner
193d80f118eSChris Lattner    cond_true:
194*391f9ef1SJim Lin      %X.0 = load i32, i32* @G
195d80f118eSChris Lattner      br label %cond_next
196d80f118eSChris Lattner
197d80f118eSChris Lattner    cond_false:
198*391f9ef1SJim Lin      %X.1 = load i32, i32* @H
199d80f118eSChris Lattner      br label %cond_next
200d80f118eSChris Lattner
201d80f118eSChris Lattner    cond_next:
202d80f118eSChris Lattner      %X.01 = phi i32 [ %X.1, %cond_false ], [ %X.0, %cond_true ]
203d80f118eSChris Lattner      ret i32 %X.01
204d80f118eSChris Lattner    }
205d80f118eSChris Lattner
206d80f118eSChris LattnerThe mem2reg pass implements the standard "iterated dominance frontier"
207d80f118eSChris Lattneralgorithm for constructing SSA form and has a number of optimizations
208d80f118eSChris Lattnerthat speed up (very common) degenerate cases. The mem2reg optimization
209d80f118eSChris Lattnerpass is the answer to dealing with mutable variables, and we highly
210d80f118eSChris Lattnerrecommend that you depend on it. Note that mem2reg only works on
211d80f118eSChris Lattnervariables in certain circumstances:
212d80f118eSChris Lattner
213d80f118eSChris Lattner#. mem2reg is alloca-driven: it looks for allocas and if it can handle
214d80f118eSChris Lattner   them, it promotes them. It does not apply to global variables or heap
215d80f118eSChris Lattner   allocations.
216d80f118eSChris Lattner#. mem2reg only looks for alloca instructions in the entry block of the
217d80f118eSChris Lattner   function. Being in the entry block guarantees that the alloca is only
218d80f118eSChris Lattner   executed once, which makes analysis simpler.
219d80f118eSChris Lattner#. mem2reg only promotes allocas whose uses are direct loads and stores.
220d80f118eSChris Lattner   If the address of the stack object is passed to a function, or if any
221d80f118eSChris Lattner   funny pointer arithmetic is involved, the alloca will not be
222d80f118eSChris Lattner   promoted.
223d80f118eSChris Lattner#. mem2reg only works on allocas of `first
2242916489cSkristina   class <../../LangRef.html#first-class-types>`_ values (such as pointers,
225d80f118eSChris Lattner   scalars and vectors), and only if the array size of the allocation is
226d80f118eSChris Lattner   1 (or missing in the .ll file). mem2reg is not capable of promoting
227d80f118eSChris Lattner   structs or arrays to registers. Note that the "sroa" pass is
228d80f118eSChris Lattner   more powerful and can promote structs, "unions", and arrays in many
229d80f118eSChris Lattner   cases.
230d80f118eSChris Lattner
231d80f118eSChris LattnerAll of these properties are easy to satisfy for most imperative
232d80f118eSChris Lattnerlanguages, and we'll illustrate it below with Kaleidoscope. The final
233d80f118eSChris Lattnerquestion you may be asking is: should I bother with this nonsense for my
234d80f118eSChris Lattnerfront-end? Wouldn't it be better if I just did SSA construction
235d80f118eSChris Lattnerdirectly, avoiding use of the mem2reg optimization pass? In short, we
236d80f118eSChris Lattnerstrongly recommend that you use this technique for building SSA form,
237d80f118eSChris Lattnerunless there is an extremely good reason not to. Using this technique
238d80f118eSChris Lattneris:
239d80f118eSChris Lattner
240d80f118eSChris Lattner-  Proven and well tested: clang uses this technique
241d80f118eSChris Lattner   for local mutable variables. As such, the most common clients of LLVM
242d80f118eSChris Lattner   are using this to handle a bulk of their variables. You can be sure
243d80f118eSChris Lattner   that bugs are found fast and fixed early.
244d80f118eSChris Lattner-  Extremely Fast: mem2reg has a number of special cases that make it
245d80f118eSChris Lattner   fast in common cases as well as fully general. For example, it has
246d80f118eSChris Lattner   fast-paths for variables that are only used in a single block,
247d80f118eSChris Lattner   variables that only have one assignment point, good heuristics to
248d80f118eSChris Lattner   avoid insertion of unneeded phi nodes, etc.
249d80f118eSChris Lattner-  Needed for debug info generation: `Debug information in
2502916489cSkristina   LLVM <../../SourceLevelDebugging.html>`_ relies on having the address of
251d80f118eSChris Lattner   the variable exposed so that debug info can be attached to it. This
252d80f118eSChris Lattner   technique dovetails very naturally with this style of debug info.
253d80f118eSChris Lattner
254d80f118eSChris LattnerIf nothing else, this makes it much easier to get your front-end up and
255d80f118eSChris Lattnerrunning, and is very simple to implement. Let's extend Kaleidoscope with
256d80f118eSChris Lattnermutable variables now!
257d80f118eSChris Lattner
258d80f118eSChris LattnerMutable Variables in Kaleidoscope
259d80f118eSChris Lattner=================================
260d80f118eSChris Lattner
261d80f118eSChris LattnerNow that we know the sort of problem we want to tackle, let's see what
262d80f118eSChris Lattnerthis looks like in the context of our little Kaleidoscope language.
263d80f118eSChris LattnerWe're going to add two features:
264d80f118eSChris Lattner
265d80f118eSChris Lattner#. The ability to mutate variables with the '=' operator.
266d80f118eSChris Lattner#. The ability to define new variables.
267d80f118eSChris Lattner
268d80f118eSChris LattnerWhile the first item is really what this is about, we only have
269d80f118eSChris Lattnervariables for incoming arguments as well as for induction variables, and
270d80f118eSChris Lattnerredefining those only goes so far :). Also, the ability to define new
271d80f118eSChris Lattnervariables is a useful thing regardless of whether you will be mutating
272d80f118eSChris Lattnerthem. Here's a motivating example that shows how we could use these:
273d80f118eSChris Lattner
274d80f118eSChris Lattner::
275d80f118eSChris Lattner
276d80f118eSChris Lattner    # Define ':' for sequencing: as a low-precedence operator that ignores operands
277d80f118eSChris Lattner    # and just returns the RHS.
278d80f118eSChris Lattner    def binary : 1 (x y) y;
279d80f118eSChris Lattner
280d80f118eSChris Lattner    # Recursive fib, we could do this before.
281d80f118eSChris Lattner    def fib(x)
282d80f118eSChris Lattner      if (x < 3) then
283d80f118eSChris Lattner        1
284d80f118eSChris Lattner      else
285d80f118eSChris Lattner        fib(x-1)+fib(x-2);
286d80f118eSChris Lattner
287d80f118eSChris Lattner    # Iterative fib.
288d80f118eSChris Lattner    def fibi(x)
289d80f118eSChris Lattner      var a = 1, b = 1, c in
290d80f118eSChris Lattner      (for i = 3, i < x in
291d80f118eSChris Lattner         c = a + b :
292d80f118eSChris Lattner         a = b :
293d80f118eSChris Lattner         b = c) :
294d80f118eSChris Lattner      b;
295d80f118eSChris Lattner
296d80f118eSChris Lattner    # Call it.
297d80f118eSChris Lattner    fibi(10);
298d80f118eSChris Lattner
299d80f118eSChris LattnerIn order to mutate variables, we have to change our existing variables
300d80f118eSChris Lattnerto use the "alloca trick". Once we have that, we'll add our new
301d80f118eSChris Lattneroperator, then extend Kaleidoscope to support new variable definitions.
302d80f118eSChris Lattner
303d80f118eSChris LattnerAdjusting Existing Variables for Mutation
304d80f118eSChris Lattner=========================================
305d80f118eSChris Lattner
306d80f118eSChris LattnerThe symbol table in Kaleidoscope is managed at code generation time by
307d80f118eSChris Lattnerthe '``NamedValues``' map. This map currently keeps track of the LLVM
308d80f118eSChris Lattner"Value\*" that holds the double value for the named variable. In order
309d80f118eSChris Lattnerto support mutation, we need to change this slightly, so that
310d80f118eSChris Lattner``NamedValues`` holds the *memory location* of the variable in question.
311d80f118eSChris LattnerNote that this change is a refactoring: it changes the structure of the
312d80f118eSChris Lattnercode, but does not (by itself) change the behavior of the compiler. All
313d80f118eSChris Lattnerof these changes are isolated in the Kaleidoscope code generator.
314d80f118eSChris Lattner
315d80f118eSChris LattnerAt this point in Kaleidoscope's development, it only supports variables
316d80f118eSChris Lattnerfor two things: incoming arguments to functions and the induction
317d80f118eSChris Lattnervariable of 'for' loops. For consistency, we'll allow mutation of these
318d80f118eSChris Lattnervariables in addition to other user-defined variables. This means that
319d80f118eSChris Lattnerthese will both need memory locations.
320d80f118eSChris Lattner
321d80f118eSChris LattnerTo start our transformation of Kaleidoscope, we'll change the
322d80f118eSChris LattnerNamedValues map so that it maps to AllocaInst\* instead of Value\*. Once
323d80f118eSChris Lattnerwe do this, the C++ compiler will tell us what parts of the code we need
324d80f118eSChris Lattnerto update:
325d80f118eSChris Lattner
326d80f118eSChris Lattner.. code-block:: c++
327d80f118eSChris Lattner
328d80f118eSChris Lattner    static std::map<std::string, AllocaInst*> NamedValues;
329d80f118eSChris Lattner
330d80f118eSChris LattnerAlso, since we will need to create these allocas, we'll use a helper
331d80f118eSChris Lattnerfunction that ensures that the allocas are created in the entry block of
332d80f118eSChris Lattnerthe function:
333d80f118eSChris Lattner
334d80f118eSChris Lattner.. code-block:: c++
335d80f118eSChris Lattner
336d80f118eSChris Lattner    /// CreateEntryBlockAlloca - Create an alloca instruction in the entry block of
337d80f118eSChris Lattner    /// the function.  This is used for mutable variables etc.
338d80f118eSChris Lattner    static AllocaInst *CreateEntryBlockAlloca(Function *TheFunction,
339d80f118eSChris Lattner                                              const std::string &VarName) {
340d80f118eSChris Lattner      IRBuilder<> TmpB(&TheFunction->getEntryBlock(),
341d80f118eSChris Lattner                     TheFunction->getEntryBlock().begin());
342d80f118eSChris Lattner      return TmpB.CreateAlloca(Type::getDoubleTy(TheContext), 0,
343d80f118eSChris Lattner                               VarName.c_str());
344d80f118eSChris Lattner    }
345d80f118eSChris Lattner
346d80f118eSChris LattnerThis funny looking code creates an IRBuilder object that is pointing at
347d80f118eSChris Lattnerthe first instruction (.begin()) of the entry block. It then creates an
348d80f118eSChris Lattneralloca with the expected name and returns it. Because all values in
349d80f118eSChris LattnerKaleidoscope are doubles, there is no need to pass in a type to use.
350d80f118eSChris Lattner
351d80f118eSChris LattnerWith this in place, the first functionality change we want to make belongs to
352d80f118eSChris Lattnervariable references. In our new scheme, variables live on the stack, so
353d80f118eSChris Lattnercode generating a reference to them actually needs to produce a load
354d80f118eSChris Lattnerfrom the stack slot:
355d80f118eSChris Lattner
356d80f118eSChris Lattner.. code-block:: c++
357d80f118eSChris Lattner
358d80f118eSChris Lattner    Value *VariableExprAST::codegen() {
359d80f118eSChris Lattner      // Look this variable up in the function.
360d80f118eSChris Lattner      Value *V = NamedValues[Name];
361d80f118eSChris Lattner      if (!V)
362d80f118eSChris Lattner        return LogErrorV("Unknown variable name");
363d80f118eSChris Lattner
364d80f118eSChris Lattner      // Load the value.
365d80f118eSChris Lattner      return Builder.CreateLoad(V, Name.c_str());
366d80f118eSChris Lattner    }
367d80f118eSChris Lattner
368d80f118eSChris LattnerAs you can see, this is pretty straightforward. Now we need to update
369d80f118eSChris Lattnerthe things that define the variables to set up the alloca. We'll start
370d80f118eSChris Lattnerwith ``ForExprAST::codegen()`` (see the `full code listing <#id1>`_ for
371d80f118eSChris Lattnerthe unabridged code):
372d80f118eSChris Lattner
373d80f118eSChris Lattner.. code-block:: c++
374d80f118eSChris Lattner
375d80f118eSChris Lattner      Function *TheFunction = Builder.GetInsertBlock()->getParent();
376d80f118eSChris Lattner
377d80f118eSChris Lattner      // Create an alloca for the variable in the entry block.
378d80f118eSChris Lattner      AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
379d80f118eSChris Lattner
380d80f118eSChris Lattner      // Emit the start code first, without 'variable' in scope.
381d80f118eSChris Lattner      Value *StartVal = Start->codegen();
382d80f118eSChris Lattner      if (!StartVal)
383d80f118eSChris Lattner        return nullptr;
384d80f118eSChris Lattner
385d80f118eSChris Lattner      // Store the value into the alloca.
386d80f118eSChris Lattner      Builder.CreateStore(StartVal, Alloca);
387d80f118eSChris Lattner      ...
388d80f118eSChris Lattner
389d80f118eSChris Lattner      // Compute the end condition.
390d80f118eSChris Lattner      Value *EndCond = End->codegen();
391d80f118eSChris Lattner      if (!EndCond)
392d80f118eSChris Lattner        return nullptr;
393d80f118eSChris Lattner
394d80f118eSChris Lattner      // Reload, increment, and restore the alloca.  This handles the case where
395d80f118eSChris Lattner      // the body of the loop mutates the variable.
396d80f118eSChris Lattner      Value *CurVar = Builder.CreateLoad(Alloca);
397d80f118eSChris Lattner      Value *NextVar = Builder.CreateFAdd(CurVar, StepVal, "nextvar");
398d80f118eSChris Lattner      Builder.CreateStore(NextVar, Alloca);
399d80f118eSChris Lattner      ...
400d80f118eSChris Lattner
401d80f118eSChris LattnerThis code is virtually identical to the code `before we allowed mutable
4026bfd10ffSJonathan Roelofsvariables <LangImpl05.html#code-generation-for-the-for-loop>`_. The big difference is that we
403d80f118eSChris Lattnerno longer have to construct a PHI node, and we use load/store to access
404d80f118eSChris Lattnerthe variable as needed.
405d80f118eSChris Lattner
406d80f118eSChris LattnerTo support mutable argument variables, we need to also make allocas for
407d80f118eSChris Lattnerthem. The code for this is also pretty simple:
408d80f118eSChris Lattner
409d80f118eSChris Lattner.. code-block:: c++
410d80f118eSChris Lattner
411d80f118eSChris Lattner    Function *FunctionAST::codegen() {
412d80f118eSChris Lattner      ...
413d80f118eSChris Lattner      Builder.SetInsertPoint(BB);
414d80f118eSChris Lattner
415d80f118eSChris Lattner      // Record the function arguments in the NamedValues map.
416d80f118eSChris Lattner      NamedValues.clear();
417d80f118eSChris Lattner      for (auto &Arg : TheFunction->args()) {
418d80f118eSChris Lattner        // Create an alloca for this variable.
419d80f118eSChris Lattner        AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, Arg.getName());
420d80f118eSChris Lattner
421d80f118eSChris Lattner        // Store the initial value into the alloca.
422d80f118eSChris Lattner        Builder.CreateStore(&Arg, Alloca);
423d80f118eSChris Lattner
424d80f118eSChris Lattner        // Add arguments to variable symbol table.
425d80f118eSChris Lattner        NamedValues[Arg.getName()] = Alloca;
426d80f118eSChris Lattner      }
427d80f118eSChris Lattner
428d80f118eSChris Lattner      if (Value *RetVal = Body->codegen()) {
429d80f118eSChris Lattner        ...
430d80f118eSChris Lattner
431d80f118eSChris LattnerFor each argument, we make an alloca, store the input value to the
432d80f118eSChris Lattnerfunction into the alloca, and register the alloca as the memory location
433d80f118eSChris Lattnerfor the argument. This method gets invoked by ``FunctionAST::codegen()``
434d80f118eSChris Lattnerright after it sets up the entry block for the function.
435d80f118eSChris Lattner
436d80f118eSChris LattnerThe final missing piece is adding the mem2reg pass, which allows us to
437d80f118eSChris Lattnerget good codegen once again:
438d80f118eSChris Lattner
439d80f118eSChris Lattner.. code-block:: c++
440d80f118eSChris Lattner
441d80f118eSChris Lattner        // Promote allocas to registers.
442d80f118eSChris Lattner        TheFPM->add(createPromoteMemoryToRegisterPass());
443d80f118eSChris Lattner        // Do simple "peephole" optimizations and bit-twiddling optzns.
444d80f118eSChris Lattner        TheFPM->add(createInstructionCombiningPass());
445d80f118eSChris Lattner        // Reassociate expressions.
446d80f118eSChris Lattner        TheFPM->add(createReassociatePass());
447d80f118eSChris Lattner        ...
448d80f118eSChris Lattner
449d80f118eSChris LattnerIt is interesting to see what the code looks like before and after the
450d80f118eSChris Lattnermem2reg optimization runs. For example, this is the before/after code
451d80f118eSChris Lattnerfor our recursive fib function. Before the optimization:
452d80f118eSChris Lattner
453d80f118eSChris Lattner.. code-block:: llvm
454d80f118eSChris Lattner
455d80f118eSChris Lattner    define double @fib(double %x) {
456d80f118eSChris Lattner    entry:
457d80f118eSChris Lattner      %x1 = alloca double
458d80f118eSChris Lattner      store double %x, double* %x1
459d80f118eSChris Lattner      %x2 = load double, double* %x1
460d80f118eSChris Lattner      %cmptmp = fcmp ult double %x2, 3.000000e+00
461d80f118eSChris Lattner      %booltmp = uitofp i1 %cmptmp to double
462d80f118eSChris Lattner      %ifcond = fcmp one double %booltmp, 0.000000e+00
463d80f118eSChris Lattner      br i1 %ifcond, label %then, label %else
464d80f118eSChris Lattner
465d80f118eSChris Lattner    then:       ; preds = %entry
466d80f118eSChris Lattner      br label %ifcont
467d80f118eSChris Lattner
468d80f118eSChris Lattner    else:       ; preds = %entry
469d80f118eSChris Lattner      %x3 = load double, double* %x1
470d80f118eSChris Lattner      %subtmp = fsub double %x3, 1.000000e+00
471d80f118eSChris Lattner      %calltmp = call double @fib(double %subtmp)
472d80f118eSChris Lattner      %x4 = load double, double* %x1
473d80f118eSChris Lattner      %subtmp5 = fsub double %x4, 2.000000e+00
474d80f118eSChris Lattner      %calltmp6 = call double @fib(double %subtmp5)
475d80f118eSChris Lattner      %addtmp = fadd double %calltmp, %calltmp6
476d80f118eSChris Lattner      br label %ifcont
477d80f118eSChris Lattner
478d80f118eSChris Lattner    ifcont:     ; preds = %else, %then
479d80f118eSChris Lattner      %iftmp = phi double [ 1.000000e+00, %then ], [ %addtmp, %else ]
480d80f118eSChris Lattner      ret double %iftmp
481d80f118eSChris Lattner    }
482d80f118eSChris Lattner
483d80f118eSChris LattnerHere there is only one variable (x, the input argument) but you can
484d80f118eSChris Lattnerstill see the extremely simple-minded code generation strategy we are
485d80f118eSChris Lattnerusing. In the entry block, an alloca is created, and the initial input
486d80f118eSChris Lattnervalue is stored into it. Each reference to the variable does a reload
487d80f118eSChris Lattnerfrom the stack. Also, note that we didn't modify the if/then/else
488d80f118eSChris Lattnerexpression, so it still inserts a PHI node. While we could make an
489d80f118eSChris Lattneralloca for it, it is actually easier to create a PHI node for it, so we
490d80f118eSChris Lattnerstill just make the PHI.
491d80f118eSChris Lattner
492d80f118eSChris LattnerHere is the code after the mem2reg pass runs:
493d80f118eSChris Lattner
494d80f118eSChris Lattner.. code-block:: llvm
495d80f118eSChris Lattner
496d80f118eSChris Lattner    define double @fib(double %x) {
497d80f118eSChris Lattner    entry:
498d80f118eSChris Lattner      %cmptmp = fcmp ult double %x, 3.000000e+00
499d80f118eSChris Lattner      %booltmp = uitofp i1 %cmptmp to double
500d80f118eSChris Lattner      %ifcond = fcmp one double %booltmp, 0.000000e+00
501d80f118eSChris Lattner      br i1 %ifcond, label %then, label %else
502d80f118eSChris Lattner
503d80f118eSChris Lattner    then:
504d80f118eSChris Lattner      br label %ifcont
505d80f118eSChris Lattner
506d80f118eSChris Lattner    else:
507d80f118eSChris Lattner      %subtmp = fsub double %x, 1.000000e+00
508d80f118eSChris Lattner      %calltmp = call double @fib(double %subtmp)
509d80f118eSChris Lattner      %subtmp5 = fsub double %x, 2.000000e+00
510d80f118eSChris Lattner      %calltmp6 = call double @fib(double %subtmp5)
511d80f118eSChris Lattner      %addtmp = fadd double %calltmp, %calltmp6
512d80f118eSChris Lattner      br label %ifcont
513d80f118eSChris Lattner
514d80f118eSChris Lattner    ifcont:     ; preds = %else, %then
515d80f118eSChris Lattner      %iftmp = phi double [ 1.000000e+00, %then ], [ %addtmp, %else ]
516d80f118eSChris Lattner      ret double %iftmp
517d80f118eSChris Lattner    }
518d80f118eSChris Lattner
519d80f118eSChris LattnerThis is a trivial case for mem2reg, since there are no redefinitions of
520d80f118eSChris Lattnerthe variable. The point of showing this is to calm your tension about
521bb69208dSNico Weberinserting such blatant inefficiencies :).
522d80f118eSChris Lattner
523d80f118eSChris LattnerAfter the rest of the optimizers run, we get:
524d80f118eSChris Lattner
525d80f118eSChris Lattner.. code-block:: llvm
526d80f118eSChris Lattner
527d80f118eSChris Lattner    define double @fib(double %x) {
528d80f118eSChris Lattner    entry:
529d80f118eSChris Lattner      %cmptmp = fcmp ult double %x, 3.000000e+00
530d80f118eSChris Lattner      %booltmp = uitofp i1 %cmptmp to double
531d80f118eSChris Lattner      %ifcond = fcmp ueq double %booltmp, 0.000000e+00
532d80f118eSChris Lattner      br i1 %ifcond, label %else, label %ifcont
533d80f118eSChris Lattner
534d80f118eSChris Lattner    else:
535d80f118eSChris Lattner      %subtmp = fsub double %x, 1.000000e+00
536d80f118eSChris Lattner      %calltmp = call double @fib(double %subtmp)
537d80f118eSChris Lattner      %subtmp5 = fsub double %x, 2.000000e+00
538d80f118eSChris Lattner      %calltmp6 = call double @fib(double %subtmp5)
539d80f118eSChris Lattner      %addtmp = fadd double %calltmp, %calltmp6
540d80f118eSChris Lattner      ret double %addtmp
541d80f118eSChris Lattner
542d80f118eSChris Lattner    ifcont:
543d80f118eSChris Lattner      ret double 1.000000e+00
544d80f118eSChris Lattner    }
545d80f118eSChris Lattner
546d80f118eSChris LattnerHere we see that the simplifycfg pass decided to clone the return
547d80f118eSChris Lattnerinstruction into the end of the 'else' block. This allowed it to
548d80f118eSChris Lattnereliminate some branches and the PHI node.
549d80f118eSChris Lattner
550d80f118eSChris LattnerNow that all symbol table references are updated to use stack variables,
551d80f118eSChris Lattnerwe'll add the assignment operator.
552d80f118eSChris Lattner
553d80f118eSChris LattnerNew Assignment Operator
554d80f118eSChris Lattner=======================
555d80f118eSChris Lattner
556d80f118eSChris LattnerWith our current framework, adding a new assignment operator is really
557d80f118eSChris Lattnersimple. We will parse it just like any other binary operator, but handle
558d80f118eSChris Lattnerit internally (instead of allowing the user to define it). The first
559d80f118eSChris Lattnerstep is to set a precedence:
560d80f118eSChris Lattner
561d80f118eSChris Lattner.. code-block:: c++
562d80f118eSChris Lattner
563d80f118eSChris Lattner     int main() {
564d80f118eSChris Lattner       // Install standard binary operators.
565d80f118eSChris Lattner       // 1 is lowest precedence.
566d80f118eSChris Lattner       BinopPrecedence['='] = 2;
567d80f118eSChris Lattner       BinopPrecedence['<'] = 10;
568d80f118eSChris Lattner       BinopPrecedence['+'] = 20;
569d80f118eSChris Lattner       BinopPrecedence['-'] = 20;
570d80f118eSChris Lattner
571d80f118eSChris LattnerNow that the parser knows the precedence of the binary operator, it
572d80f118eSChris Lattnertakes care of all the parsing and AST generation. We just need to
573d80f118eSChris Lattnerimplement codegen for the assignment operator. This looks like:
574d80f118eSChris Lattner
575d80f118eSChris Lattner.. code-block:: c++
576d80f118eSChris Lattner
577d80f118eSChris Lattner    Value *BinaryExprAST::codegen() {
578d80f118eSChris Lattner      // Special case '=' because we don't want to emit the LHS as an expression.
579d80f118eSChris Lattner      if (Op == '=') {
580d80f118eSChris Lattner        // Assignment requires the LHS to be an identifier.
581d80f118eSChris Lattner        VariableExprAST *LHSE = dynamic_cast<VariableExprAST*>(LHS.get());
582d80f118eSChris Lattner        if (!LHSE)
583d80f118eSChris Lattner          return LogErrorV("destination of '=' must be a variable");
584d80f118eSChris Lattner
585d80f118eSChris LattnerUnlike the rest of the binary operators, our assignment operator doesn't
586d80f118eSChris Lattnerfollow the "emit LHS, emit RHS, do computation" model. As such, it is
587d80f118eSChris Lattnerhandled as a special case before the other binary operators are handled.
588d80f118eSChris LattnerThe other strange thing is that it requires the LHS to be a variable. It
589d80f118eSChris Lattneris invalid to have "(x+1) = expr" - only things like "x = expr" are
590d80f118eSChris Lattnerallowed.
591d80f118eSChris Lattner
592d80f118eSChris Lattner.. code-block:: c++
593d80f118eSChris Lattner
594d80f118eSChris Lattner        // Codegen the RHS.
595d80f118eSChris Lattner        Value *Val = RHS->codegen();
596d80f118eSChris Lattner        if (!Val)
597d80f118eSChris Lattner          return nullptr;
598d80f118eSChris Lattner
599d80f118eSChris Lattner        // Look up the name.
600d80f118eSChris Lattner        Value *Variable = NamedValues[LHSE->getName()];
601d80f118eSChris Lattner        if (!Variable)
602d80f118eSChris Lattner          return LogErrorV("Unknown variable name");
603d80f118eSChris Lattner
604d80f118eSChris Lattner        Builder.CreateStore(Val, Variable);
605d80f118eSChris Lattner        return Val;
606d80f118eSChris Lattner      }
607d80f118eSChris Lattner      ...
608d80f118eSChris Lattner
609d80f118eSChris LattnerOnce we have the variable, codegen'ing the assignment is
610d80f118eSChris Lattnerstraightforward: we emit the RHS of the assignment, create a store, and
611d80f118eSChris Lattnerreturn the computed value. Returning a value allows for chained
612d80f118eSChris Lattnerassignments like "X = (Y = Z)".
613d80f118eSChris Lattner
614d80f118eSChris LattnerNow that we have an assignment operator, we can mutate loop variables
615d80f118eSChris Lattnerand arguments. For example, we can now run code like this:
616d80f118eSChris Lattner
617d80f118eSChris Lattner::
618d80f118eSChris Lattner
619d80f118eSChris Lattner    # Function to print a double.
620d80f118eSChris Lattner    extern printd(x);
621d80f118eSChris Lattner
622d80f118eSChris Lattner    # Define ':' for sequencing: as a low-precedence operator that ignores operands
623d80f118eSChris Lattner    # and just returns the RHS.
624d80f118eSChris Lattner    def binary : 1 (x y) y;
625d80f118eSChris Lattner
626d80f118eSChris Lattner    def test(x)
627d80f118eSChris Lattner      printd(x) :
628d80f118eSChris Lattner      x = 4 :
629d80f118eSChris Lattner      printd(x);
630d80f118eSChris Lattner
631d80f118eSChris Lattner    test(123);
632d80f118eSChris Lattner
633d80f118eSChris LattnerWhen run, this example prints "123" and then "4", showing that we did
634d80f118eSChris Lattneractually mutate the value! Okay, we have now officially implemented our
635d80f118eSChris Lattnergoal: getting this to work requires SSA construction in the general
636d80f118eSChris Lattnercase. However, to be really useful, we want the ability to define our
637d80f118eSChris Lattnerown local variables, let's add this next!
638d80f118eSChris Lattner
639d80f118eSChris LattnerUser-defined Local Variables
640d80f118eSChris Lattner============================
641d80f118eSChris Lattner
642d80f118eSChris LattnerAdding var/in is just like any other extension we made to
643d80f118eSChris LattnerKaleidoscope: we extend the lexer, the parser, the AST and the code
644d80f118eSChris Lattnergenerator. The first step for adding our new 'var/in' construct is to
645d80f118eSChris Lattnerextend the lexer. As before, this is pretty trivial, the code looks like
646d80f118eSChris Lattnerthis:
647d80f118eSChris Lattner
648d80f118eSChris Lattner.. code-block:: c++
649d80f118eSChris Lattner
650d80f118eSChris Lattner    enum Token {
651d80f118eSChris Lattner      ...
652d80f118eSChris Lattner      // var definition
653d80f118eSChris Lattner      tok_var = -13
654d80f118eSChris Lattner    ...
655d80f118eSChris Lattner    }
656d80f118eSChris Lattner    ...
657d80f118eSChris Lattner    static int gettok() {
658d80f118eSChris Lattner    ...
659d80f118eSChris Lattner        if (IdentifierStr == "in")
660d80f118eSChris Lattner          return tok_in;
661d80f118eSChris Lattner        if (IdentifierStr == "binary")
662d80f118eSChris Lattner          return tok_binary;
663d80f118eSChris Lattner        if (IdentifierStr == "unary")
664d80f118eSChris Lattner          return tok_unary;
665d80f118eSChris Lattner        if (IdentifierStr == "var")
666d80f118eSChris Lattner          return tok_var;
667d80f118eSChris Lattner        return tok_identifier;
668d80f118eSChris Lattner    ...
669d80f118eSChris Lattner
670d80f118eSChris LattnerThe next step is to define the AST node that we will construct. For
671d80f118eSChris Lattnervar/in, it looks like this:
672d80f118eSChris Lattner
673d80f118eSChris Lattner.. code-block:: c++
674d80f118eSChris Lattner
675d80f118eSChris Lattner    /// VarExprAST - Expression class for var/in
676d80f118eSChris Lattner    class VarExprAST : public ExprAST {
677d80f118eSChris Lattner      std::vector<std::pair<std::string, std::unique_ptr<ExprAST>>> VarNames;
678d80f118eSChris Lattner      std::unique_ptr<ExprAST> Body;
679d80f118eSChris Lattner
680d80f118eSChris Lattner    public:
681d80f118eSChris Lattner      VarExprAST(std::vector<std::pair<std::string, std::unique_ptr<ExprAST>>> VarNames,
682d80f118eSChris Lattner                 std::unique_ptr<ExprAST> Body)
683d80f118eSChris Lattner        : VarNames(std::move(VarNames)), Body(std::move(Body)) {}
684d80f118eSChris Lattner
685d80f118eSChris Lattner      Value *codegen() override;
686d80f118eSChris Lattner    };
687d80f118eSChris Lattner
688d80f118eSChris Lattnervar/in allows a list of names to be defined all at once, and each name
689d80f118eSChris Lattnercan optionally have an initializer value. As such, we capture this
690d80f118eSChris Lattnerinformation in the VarNames vector. Also, var/in has a body, this body
691d80f118eSChris Lattneris allowed to access the variables defined by the var/in.
692d80f118eSChris Lattner
693d80f118eSChris LattnerWith this in place, we can define the parser pieces. The first thing we
694d80f118eSChris Lattnerdo is add it as a primary expression:
695d80f118eSChris Lattner
696d80f118eSChris Lattner.. code-block:: c++
697d80f118eSChris Lattner
698d80f118eSChris Lattner    /// primary
699d80f118eSChris Lattner    ///   ::= identifierexpr
700d80f118eSChris Lattner    ///   ::= numberexpr
701d80f118eSChris Lattner    ///   ::= parenexpr
702d80f118eSChris Lattner    ///   ::= ifexpr
703d80f118eSChris Lattner    ///   ::= forexpr
704d80f118eSChris Lattner    ///   ::= varexpr
705d80f118eSChris Lattner    static std::unique_ptr<ExprAST> ParsePrimary() {
706d80f118eSChris Lattner      switch (CurTok) {
707d80f118eSChris Lattner      default:
708d80f118eSChris Lattner        return LogError("unknown token when expecting an expression");
709d80f118eSChris Lattner      case tok_identifier:
710d80f118eSChris Lattner        return ParseIdentifierExpr();
711d80f118eSChris Lattner      case tok_number:
712d80f118eSChris Lattner        return ParseNumberExpr();
713d80f118eSChris Lattner      case '(':
714d80f118eSChris Lattner        return ParseParenExpr();
715d80f118eSChris Lattner      case tok_if:
716d80f118eSChris Lattner        return ParseIfExpr();
717d80f118eSChris Lattner      case tok_for:
718d80f118eSChris Lattner        return ParseForExpr();
719d80f118eSChris Lattner      case tok_var:
720d80f118eSChris Lattner        return ParseVarExpr();
721d80f118eSChris Lattner      }
722d80f118eSChris Lattner    }
723d80f118eSChris Lattner
724d80f118eSChris LattnerNext we define ParseVarExpr:
725d80f118eSChris Lattner
726d80f118eSChris Lattner.. code-block:: c++
727d80f118eSChris Lattner
728d80f118eSChris Lattner    /// varexpr ::= 'var' identifier ('=' expression)?
729d80f118eSChris Lattner    //                    (',' identifier ('=' expression)?)* 'in' expression
730d80f118eSChris Lattner    static std::unique_ptr<ExprAST> ParseVarExpr() {
731d80f118eSChris Lattner      getNextToken();  // eat the var.
732d80f118eSChris Lattner
733d80f118eSChris Lattner      std::vector<std::pair<std::string, std::unique_ptr<ExprAST>>> VarNames;
734d80f118eSChris Lattner
735d80f118eSChris Lattner      // At least one variable name is required.
736d80f118eSChris Lattner      if (CurTok != tok_identifier)
737d80f118eSChris Lattner        return LogError("expected identifier after var");
738d80f118eSChris Lattner
739d80f118eSChris LattnerThe first part of this code parses the list of identifier/expr pairs
740d80f118eSChris Lattnerinto the local ``VarNames`` vector.
741d80f118eSChris Lattner
742d80f118eSChris Lattner.. code-block:: c++
743d80f118eSChris Lattner
744d80f118eSChris Lattner      while (1) {
745d80f118eSChris Lattner        std::string Name = IdentifierStr;
746d80f118eSChris Lattner        getNextToken();  // eat identifier.
747d80f118eSChris Lattner
748d80f118eSChris Lattner        // Read the optional initializer.
749d80f118eSChris Lattner        std::unique_ptr<ExprAST> Init;
750d80f118eSChris Lattner        if (CurTok == '=') {
751d80f118eSChris Lattner          getNextToken(); // eat the '='.
752d80f118eSChris Lattner
753d80f118eSChris Lattner          Init = ParseExpression();
754d80f118eSChris Lattner          if (!Init) return nullptr;
755d80f118eSChris Lattner        }
756d80f118eSChris Lattner
757d80f118eSChris Lattner        VarNames.push_back(std::make_pair(Name, std::move(Init)));
758d80f118eSChris Lattner
759d80f118eSChris Lattner        // End of var list, exit loop.
760d80f118eSChris Lattner        if (CurTok != ',') break;
761d80f118eSChris Lattner        getNextToken(); // eat the ','.
762d80f118eSChris Lattner
763d80f118eSChris Lattner        if (CurTok != tok_identifier)
764d80f118eSChris Lattner          return LogError("expected identifier list after var");
765d80f118eSChris Lattner      }
766d80f118eSChris Lattner
767d80f118eSChris LattnerOnce all the variables are parsed, we then parse the body and create the
768d80f118eSChris LattnerAST node:
769d80f118eSChris Lattner
770d80f118eSChris Lattner.. code-block:: c++
771d80f118eSChris Lattner
772d80f118eSChris Lattner      // At this point, we have to have 'in'.
773d80f118eSChris Lattner      if (CurTok != tok_in)
774d80f118eSChris Lattner        return LogError("expected 'in' keyword after 'var'");
775d80f118eSChris Lattner      getNextToken();  // eat 'in'.
776d80f118eSChris Lattner
777d80f118eSChris Lattner      auto Body = ParseExpression();
778d80f118eSChris Lattner      if (!Body)
779d80f118eSChris Lattner        return nullptr;
780d80f118eSChris Lattner
7810eaee545SJonas Devlieghere      return std::make_unique<VarExprAST>(std::move(VarNames),
782d80f118eSChris Lattner                                           std::move(Body));
783d80f118eSChris Lattner    }
784d80f118eSChris Lattner
785d80f118eSChris LattnerNow that we can parse and represent the code, we need to support
786d80f118eSChris Lattneremission of LLVM IR for it. This code starts out with:
787d80f118eSChris Lattner
788d80f118eSChris Lattner.. code-block:: c++
789d80f118eSChris Lattner
790d80f118eSChris Lattner    Value *VarExprAST::codegen() {
791d80f118eSChris Lattner      std::vector<AllocaInst *> OldBindings;
792d80f118eSChris Lattner
793d80f118eSChris Lattner      Function *TheFunction = Builder.GetInsertBlock()->getParent();
794d80f118eSChris Lattner
795d80f118eSChris Lattner      // Register all variables and emit their initializer.
796d80f118eSChris Lattner      for (unsigned i = 0, e = VarNames.size(); i != e; ++i) {
797d80f118eSChris Lattner        const std::string &VarName = VarNames[i].first;
798d80f118eSChris Lattner        ExprAST *Init = VarNames[i].second.get();
799d80f118eSChris Lattner
800d80f118eSChris LattnerBasically it loops over all the variables, installing them one at a
801d80f118eSChris Lattnertime. For each variable we put into the symbol table, we remember the
802d80f118eSChris Lattnerprevious value that we replace in OldBindings.
803d80f118eSChris Lattner
804d80f118eSChris Lattner.. code-block:: c++
805d80f118eSChris Lattner
806d80f118eSChris Lattner        // Emit the initializer before adding the variable to scope, this prevents
807d80f118eSChris Lattner        // the initializer from referencing the variable itself, and permits stuff
808d80f118eSChris Lattner        // like this:
809d80f118eSChris Lattner        //  var a = 1 in
810d80f118eSChris Lattner        //    var a = a in ...   # refers to outer 'a'.
811d80f118eSChris Lattner        Value *InitVal;
812d80f118eSChris Lattner        if (Init) {
813d80f118eSChris Lattner          InitVal = Init->codegen();
814d80f118eSChris Lattner          if (!InitVal)
815d80f118eSChris Lattner            return nullptr;
816d80f118eSChris Lattner        } else { // If not specified, use 0.0.
817d80f118eSChris Lattner          InitVal = ConstantFP::get(TheContext, APFloat(0.0));
818d80f118eSChris Lattner        }
819d80f118eSChris Lattner
820d80f118eSChris Lattner        AllocaInst *Alloca = CreateEntryBlockAlloca(TheFunction, VarName);
821d80f118eSChris Lattner        Builder.CreateStore(InitVal, Alloca);
822d80f118eSChris Lattner
823d80f118eSChris Lattner        // Remember the old variable binding so that we can restore the binding when
824d80f118eSChris Lattner        // we unrecurse.
825d80f118eSChris Lattner        OldBindings.push_back(NamedValues[VarName]);
826d80f118eSChris Lattner
827d80f118eSChris Lattner        // Remember this binding.
828d80f118eSChris Lattner        NamedValues[VarName] = Alloca;
829d80f118eSChris Lattner      }
830d80f118eSChris Lattner
831d80f118eSChris LattnerThere are more comments here than code. The basic idea is that we emit
832d80f118eSChris Lattnerthe initializer, create the alloca, then update the symbol table to
833d80f118eSChris Lattnerpoint to it. Once all the variables are installed in the symbol table,
834d80f118eSChris Lattnerwe evaluate the body of the var/in expression:
835d80f118eSChris Lattner
836d80f118eSChris Lattner.. code-block:: c++
837d80f118eSChris Lattner
838d80f118eSChris Lattner      // Codegen the body, now that all vars are in scope.
839d80f118eSChris Lattner      Value *BodyVal = Body->codegen();
840d80f118eSChris Lattner      if (!BodyVal)
841d80f118eSChris Lattner        return nullptr;
842d80f118eSChris Lattner
843d80f118eSChris LattnerFinally, before returning, we restore the previous variable bindings:
844d80f118eSChris Lattner
845d80f118eSChris Lattner.. code-block:: c++
846d80f118eSChris Lattner
847d80f118eSChris Lattner      // Pop all our variables from scope.
848d80f118eSChris Lattner      for (unsigned i = 0, e = VarNames.size(); i != e; ++i)
849d80f118eSChris Lattner        NamedValues[VarNames[i].first] = OldBindings[i];
850d80f118eSChris Lattner
851d80f118eSChris Lattner      // Return the body computation.
852d80f118eSChris Lattner      return BodyVal;
853d80f118eSChris Lattner    }
854d80f118eSChris Lattner
855d80f118eSChris LattnerThe end result of all of this is that we get properly scoped variable
856d80f118eSChris Lattnerdefinitions, and we even (trivially) allow mutation of them :).
857d80f118eSChris Lattner
858d80f118eSChris LattnerWith this, we completed what we set out to do. Our nice iterative fib
859d80f118eSChris Lattnerexample from the intro compiles and runs just fine. The mem2reg pass
860d80f118eSChris Lattneroptimizes all of our stack variables into SSA registers, inserting PHI
861d80f118eSChris Lattnernodes where needed, and our front-end remains simple: no "iterated
862d80f118eSChris Lattnerdominance frontier" computation anywhere in sight.
863d80f118eSChris Lattner
864d80f118eSChris LattnerFull Code Listing
865d80f118eSChris Lattner=================
866d80f118eSChris Lattner
867d80f118eSChris LattnerHere is the complete code listing for our running example, enhanced with
868d80f118eSChris Lattnermutable variables and var/in support. To build this example, use:
869d80f118eSChris Lattner
870d80f118eSChris Lattner.. code-block:: bash
871d80f118eSChris Lattner
872d80f118eSChris Lattner    # Compile
8733546b372Sxgupta    clang++ -g toy.cpp `llvm-config --cxxflags --ldflags --system-libs --libs core orcjit native` -O3 -o toy
874d80f118eSChris Lattner    # Run
875d80f118eSChris Lattner    ./toy
876d80f118eSChris Lattner
877d80f118eSChris LattnerHere is the code:
878d80f118eSChris Lattner
879147e0ddaSHans Wennborg.. literalinclude:: ../../../examples/Kaleidoscope/Chapter7/toy.cpp
880d80f118eSChris Lattner   :language: c++
881d80f118eSChris Lattner
882d80f118eSChris Lattner`Next: Compiling to Object Code <LangImpl08.html>`_
883d80f118eSChris Lattner
884