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