From 602c832c208f64484e83282f0e80fcb8edda11a7 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 31 Oct 2007 06:30:21 +0000 Subject: [PATCH] Add the first half of chapter 5: if/then/else. To come: for statement. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43546 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/tutorial/LangImpl5-cfg.png | Bin 0 -> 38586 bytes docs/tutorial/LangImpl5.html | 523 ++++++++++++++++++++++++++++++++ docs/tutorial/index.html | 2 +- 3 files changed, 524 insertions(+), 1 deletion(-) create mode 100644 docs/tutorial/LangImpl5-cfg.png create mode 100644 docs/tutorial/LangImpl5.html diff --git a/docs/tutorial/LangImpl5-cfg.png b/docs/tutorial/LangImpl5-cfg.png new file mode 100644 index 0000000000000000000000000000000000000000..cdba92ff6c5c95b142bd928971bcdd560117028c GIT binary patch literal 38586 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 E01+e^=Kufz literal 0 HcmV?d00001 diff --git a/docs/tutorial/LangImpl5.html b/docs/tutorial/LangImpl5.html new file mode 100644 index 00000000000..d1f81efb866 --- /dev/null +++ b/docs/tutorial/LangImpl5.html @@ -0,0 +1,523 @@ + + + + + Kaleidoscope: Extending the Language: Control Flow + + + + + + + +
Kaleidoscope: Extending the Language: Control Flow
+ +
+

Written by Chris Lattner

+
+ + + + + +
+ +

Welcome to Part 5 of the "Implementing a language with +LLVM" tutorial. Parts 1-4 described the implementation of the simple +Kaleidoscope language and included support for generating LLVM IR, following by +optimizations and a JIT compiler. Unfortunately, as presented, Kaleidoscope is +mostly useless: it has no control flow other than call and return. This means +that you can't have conditional branches in the code, significantly limiting its +power. In this episode of "build that compiler", we'll extend Kaleidoscope to +have an if/then/else expression plus a simple looping construct.

+ +
+ + + + + +
+ +

+Extending Kaleidoscope to support if/then/else is quite straight-forward. It +basically requires adding lexer support for this "new" concept to the lexer, +parser, AST, and LLVM code emitter. This example is nice, because it shows how +easy it is to "grow" a language over time, incrementally extending it as new +ideas are discovered.

+ +

Before we get going on "how" we do this extension, lets talk about what we +want. The basic idea is that we want to be able to write this sort of thing: +

+ +
+
+def fib(x)
+  if x < 3 then
+    1
+  else
+    fib(x-1)+fib(x-2);
+
+
+ +

In Kaleidoscope, every construct is an expression: there are no statements. +As such, the if/then/else expression needs to return a value like any other. +Since we're using a mostly functional form, we'll have it evaluate its +conditional, then return the 'then' or 'else' value based on how the condition +was resolved. This is very similar to the C "?:" expression.

+ +

The semantics of the if/then/else expression is that it first evaluates the +condition to a boolean equality value: 0.0 is false and everything else is true. +If the condition is true, the first subexpression is evaluated and returned, if +the condition is false, the second subexpression is evaluated and returned. +Since Kaleidoscope allows side-effects, this behavior is important to nail down. +

+ +

Now that we know what we want, lets break this down into its constituent +pieces.

+ +
+ + + + + + +
+ +

The lexer extensions are straight-forward. First we add new enum values +for the relevant tokens:

+ +
+
+  // control
+  tok_if = -6, tok_then = -7, tok_else = -8,
+
+
+ +

Once we have that, we recognize the new keywords in the lexer, pretty simple +stuff:

+ +
+
+    ...
+    if (IdentifierStr == "def") return tok_def;
+    if (IdentifierStr == "extern") return tok_extern;
+    if (IdentifierStr == "if") return tok_if;
+    if (IdentifierStr == "then") return tok_then;
+    if (IdentifierStr == "else") return tok_else;
+    return tok_identifier;
+
+
+ +
+ + + + + +
+ +

To represent the new expression we add a new AST node for it:

+ +
+
+/// IfExprAST - Expression class for if/then/else.
+class IfExprAST : public ExprAST {
+  ExprAST *Cond, *Then, *Else;
+public:
+  IfExprAST(ExprAST *cond, ExprAST *then, ExprAST *_else)
+    : Cond(cond), Then(then), Else(_else) {}
+  virtual Value *Codegen();
+};
+
+
+ +

The AST node just has pointers to the various subexpressions.

+ +
+ + + + + +
+ +

Now that we have the relevant tokens coming from the lexer and we have the +AST node to build, our parsing logic is relatively straight-forward. First we +define a new parsing function:

+ +
+
+/// ifexpr ::= 'if' expression 'then' expression 'else' expression
+static ExprAST *ParseIfExpr() {
+  getNextToken();  // eat the if.
+  
+  // condition.
+  ExprAST *Cond = ParseExpression();
+  if (!Cond) return 0;
+  
+  if (CurTok != tok_then)
+    return Error("expected then");
+  getNextToken();  // eat the then
+  
+  ExprAST *Then = ParseExpression();
+  if (Then == 0) return 0;
+  
+  if (CurTok != tok_else)
+    return Error("expected else");
+  
+  getNextToken();
+  
+  ExprAST *Else = ParseExpression();
+  if (!Else) return 0;
+  
+  return new IfExprAST(Cond, Then, Else);
+}
+
+
+ +

Next we hook it up as a primary expression:

+ +
+
+static ExprAST *ParsePrimary() {
+  switch (CurTok) {
+  default: return Error("unknown token when expecting an expression");
+  case tok_identifier: return ParseIdentifierExpr();
+  case tok_number:     return ParseNumberExpr();
+  case '(':            return ParseParenExpr();
+  case tok_if:         return ParseIfExpr();
+  }
+}
+
+
+ +
+ + + + + +
+ +

Now that we have it parsing and building the AST, the final piece is adding +LLVM code generation support. This is the most interesting part of the +if/then/else example, because this is where it starts to introduce new concepts. +All of the code above has been described in previous chapters fairly thoroughly. +

+ +

To motivate the code we want to produce, lets take a look at a simple +example. Consider:

+ +
+
+extern foo();
+extern bar();
+def baz(x) if x then foo() else bar();
+
+
+ +

If you disable optimizations, the code you'll (soon) get from Kaleidoscope +looks like this:

+ +
+
+declare double @foo()
+
+declare double @bar()
+
+define double @baz(double %x) {
+entry:
+	%ifcond = fcmp one double %x, 0.000000e+00
+	br i1 %ifcond, label %then, label %else
+
+then:		; preds = %entry
+	%calltmp = call double @foo()
+	br label %ifcont
+
+else:		; preds = %entry
+	%calltmp1 = call double @bar()
+	br label %ifcont
+
+ifcont:		; preds = %else, %then
+	%iftmp = phi double [ %calltmp, %then ], [ %calltmp1, %else ]
+	ret double %iftmp
+}
+
+
+ +

To visualize the control flow graph, you can use a nifty feature of the LLVM +'opt' tool. If you put this LLVM IR +into "t.ll" and run "llvm-as < t.ll | opt -analyze -view-cfg", a window will pop up and you'll +see this graph:

+ +
Example CFG
+ +

Another way to get this is to call "F->viewCFG()" or +"F->viewCFGOnly()" (where F is a "Function*") either by +inserting actual calls into the code and recompiling or by calling these in the +debugger. LLVM has many nice features for visualizing various graphs.

+ +

Coming back to the generated code, it is fairly simple: the entry block +evaluates the conditional expression ("x" in our case here) and compares the +result to 0.0 with the "fcmp one" +instruction ('one' is "ordered and not equal"). Based on the result of this +expression, the code jumps to either the "then" or "else" blocks, which contain +the expressions for the true/false case.

+ +

Once the then/else blocks is finished executing, they both branch back to the +else block to execute the code that happens after the if/then/else. In this +case the only thing left to do is to return to the caller of the function. The +question then becomes: how does the code know which expression to return?

+ +

The answer to this question involves an important SSA operation: the +Phi +operation. If you're not familiar with SSA, the wikipedia +article is a good introduction and there are various other introductions to +it available on your favorite search engine. The short version is that +"execution" of the Phi operation requires "remembering" which block control came +from. The Phi operation takes on the value corresponding to the input control +block. In this case, if control comes in from the "then" block, it gets the +value of "calltmp". If control comes from the "else" block, it gets the value +of "calltmp1".

+ +

At this point, you are probably starting to think "on no! this means my +simple and elegant front-end will have to start generating SSA form in order to +use LLVM!". Fortunately, this is not the case, and we strongly advise +not implementing an SSA construction algorithm in your front-end +unless there is an amazingly good reason to do so. In practice, there are two +sorts of values that float around in code written in your average imperative +programming language that might need Phi nodes:

+ +
    +
  1. Code that involves user variables: x = 1; x = x + 1;
  2. +
  3. Values that are implicit in the structure of your AST, such as the phi node +in this case.
  4. +
+ +

At a future point in this tutorial ("mutable variables"), we'll talk about #1 +in depth. For now, just believe me that you don't need SSA construction to +handle them. For #2, you have the choice of using the techniques that we will +describe for #1, or you can insert Phi nodes directly if convenient. In this +case, it is really really easy to generate the Phi node, so we choose to do it +directly.

+ +

Okay, enough of the motivation and overview, lets generate code!

+ +
+ + + + + +
+ +

In order to generate code for this, we implement the Codegen method +for IfExprAST:

+ +
+
+Value *IfExprAST::Codegen() {
+  Value *CondV = Cond->Codegen();
+  if (CondV == 0) return 0;
+  
+  // Convert condition to a bool by comparing equal to 0.0.
+  CondV = Builder.CreateFCmpONE(CondV, 
+                                ConstantFP::get(Type::DoubleTy, APFloat(0.0)),
+                                "ifcond");
+
+
+ +

This code is straight-forward and similar to what we saw before. We emit the +expression for the condition, then compare that value to zero to get a truth +value as a 1-bit (bool) value.

+ +
+
+  Function *TheFunction = Builder.GetInsertBlock()->getParent();
+  
+  // Create blocks for the then and else cases.  Insert the 'then' block at the
+  // end of the function.
+  BasicBlock *ThenBB = new BasicBlock("then", TheFunction);
+  BasicBlock *ElseBB = new BasicBlock("else");
+  BasicBlock *MergeBB = new BasicBlock("ifcont");
+
+  Builder.CreateCondBr(CondV, ThenBB, ElseBB);
+
+
+ +

This code creates the basic blocks that are related to the if/then/else +statement, and correspond directly to the blocks in the example above. The +first line of this gets the current Function object that is being built. It +gets this by asking the builder for the current BasicBlock, and asking that +block for its "parent" (the function it is currently embedded into).

+ +

Once it has that, it creates three blocks. Note that it passes "TheFunction" +into the constructor for the "then" block. This causes the constructor to +automatically insert the new block onto the end of the specified function. The +other two blocks are created, but aren't yet inserted into the function.

+ +

Once the blocks are created, we can emit the conditional branch that chooses +between them. Note that creating new blocks does not implicitly affect the +LLVMBuilder, so it is still inserting into the block that the condition +went into. Also note that it is creating a branch to the "then" block and the +"else" block, even though the "else" block isn't inserted into the function yet. +This is all ok: it is the standard way that LLVM supports forward +references.

+ +
+
+  // Emit then value.
+  Builder.SetInsertPoint(ThenBB);
+  
+  Value *ThenV = Then->Codegen();
+  if (ThenV == 0) return 0;
+  
+  Builder.CreateBr(MergeBB);
+  // Codegen of 'Then' can change the current block, update ThenBB for the PHI.
+  ThenBB = Builder.GetInsertBlock();
+
+
+ +

After the conditional branch is inserted, we move the builder to start +inserting into the "then" block. Strictly speaking, this call moves the +insertion point to be at the end of the specified block. However, since the +"then" block is empty, it also starts out by inserting at the beginning of the +block. :)

+ +

Once the insertion point is set, we recursively codegen the "then" expression +from the AST. To finish off the then block, we create an unconditional branch +to the merge block. One interesting (and very important) aspect of the LLVM IR +is that it requires all basic blocks +to be "terminated" with a control flow +instruction such as return or branch. This means that all control flow, +including fall throughs must be made explicit in the LLVM IR. If you +violate this rule, the verifier will emit an error.

+ +

The final line here is quite subtle, but is very important. The basic issue +is that when we create the Phi node in the merge block, we need to set up the +block/value pairs that indicate how the Phi will work. Importantly, the Phi +node expects to have an extry for each predecessor of the block in the CFG. Why +then are we getting the current block when we just set it to ThenBB 5 lines +above? The problem is that the "Then" expression may actually itself change the +block that the Builder is emitting into if, for example, it contains a nested +"if/then/else" expression. Because calling Codegen recursively could +arbitrarily change the notion of the current block, we are required to get an +up-to-date value for code that will set up the Phi node.

+ +
+
+  // Emit else block.
+  TheFunction->getBasicBlockList().push_back(ElseBB);
+  Builder.SetInsertPoint(ElseBB);
+  
+  Value *ElseV = Else->Codegen();
+  if (ElseV == 0) return 0;
+  
+  Builder.CreateBr(MergeBB);
+  // Codegen of 'Else' can change the current block, update ElseBB for the PHI.
+  ElseBB = Builder.GetInsertBlock();
+
+
+ +

Code generation for the 'else' block is basically identical to codegen for +the 'then' block. The only significant difference is the first line, which adds +the 'else' block to the function. Recall previously that the 'else' block was +created, but not added to the function. Now that the 'then' and 'else' blocks +are emitted, we can finish up with the merge code:

+ +
+
+  // Emit merge block.
+  TheFunction->getBasicBlockList().push_back(MergeBB);
+  Builder.SetInsertPoint(MergeBB);
+  PHINode *PN = Builder.CreatePHI(Type::DoubleTy, "iftmp");
+  
+  PN->addIncoming(ThenV, ThenBB);
+  PN->addIncoming(ElseV, ElseBB);
+  return PN;
+}
+
+
+ +

The first two lines here are now familiar: the first adds the "merge" block +to the Function object (it was previously floating, like the else block above). +The second block changes the insertion point so that newly created code will go +into the "merge" block. Once that is done, we need to create the PHI node and +set up the block/value pairs for the PHI.

+ +

Finally, the CodeGen function returns the phi node as the value computed by +the if/then/else expression. In our example above, this returned value will +feed into the code for the top-level function, which will create the return +instruction.

+ +

Overall, we now have the ability to execution conditional code in +Kaleidoscope. With this extension, Kaleidoscope is a fairly complete language +that can calculate a wide variety of numeric functions. Next up we'll add +another useful expression that is familiar from non-functional languages...

+ +
+ + + + + +
+ +

...

+ +
+ + + + + +
+ +

+Here is the complete code listing for our running example, enhanced with the +if/then/else and for expressions.. To build this example, use: +

+ +
+
+   # Compile
+   g++ -g toy.cpp `llvm-config --cppflags --ldflags --libs core jit native` -O3 -o toy
+   # Run
+   ./toy
+
+
+ +

Here is the code:

+ +
+
+...
+
+
+ +
+ + +
+
+ Valid CSS! + Valid HTML 4.01! + + Chris Lattner
+ The LLVM Compiler Infrastructure
+ Last modified: $Date: 2007-10-17 11:05:13 -0700 (Wed, 17 Oct 2007) $ +
+ + diff --git a/docs/tutorial/index.html b/docs/tutorial/index.html index 99278fae89a..11e93d3ccd5 100644 --- a/docs/tutorial/index.html +++ b/docs/tutorial/index.html @@ -31,7 +31,7 @@
  • Implementing a Parser and AST
  • Implementing Code Generation to LLVM IR
  • Adding JIT and Optimizer Support
  • -
  • Extending the language: if/then/else
  • +
  • Extending the language: control flow
  • Extending the language: operator overloading
  • Extending the language: mutable variables
  • Thoughts and ideas for extensions