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