>>> *** Source:
    C := true;
    if (C) "Pass"; else "Fail";
    if (!C) "Fail"; else "Pass";
    if (C) { "Pass" } else { "Fail" }
    if (!C) { "Fail" } else { "Pass" }
    // Covers the no else case.
    if (!C) "Fail";
    "*** Optimizations with goto. ***";
    if (C) goto L0;
    "Fail";
    L0:
    if (C) goto L1;
    else "Fail";
    L1:
    if (!C) "Fail";
    else goto L2;
    "Fail2";
    L2:
    if (!C) { }
    else goto L3;
    "Fail2";
    L3:
    "*** Error in condition. ***";
    if (3 + 5) "Fail";
    "*** Blocks popping namespace ***";
    X := 1;
    if (C) {
        namespace N;
        X := 2;
    }
    (X, N.X);
    "*** Loop for first Fib bigger than....";
    // REVIEW: Optimize to avoid repeated binding and code gen.
    P := (0, 1);
    LLoop0:
        P := (P[1], P[0] + P[1]);
        if (P[1] <= 1000) goto LLoop0;
    P;
    P := (0, 1);
    LLoop1:
    if (P[1] <= 1000) {
        P := (P[1], P[0] + P[1]);
        goto LLoop1;
    }
    P;

>>> *** Instructions:
   0) [0] Define C <- true
   1) [0] JumpIfNot 4 (0=>0) C
   2) [0] Expr "Pass"
   3) [0] Jump 5 (0=>0)
   4) [0] Expr "Fail"
   5) [0] JumpIfNot 8 (0=>0) !C
   6) [0] Expr "Fail"
   7) [0] Jump 9 (0=>0)
   8) [0] Expr "Pass"
   9) [0] JumpIfNot 14 (0=>0) C
  10) [0] Enter (0=>1)
  11) [1] Expr "Pass"
  12) [1] Leave (1=>0)
  13) [0] Jump 17 (0=>0)
  14) [0] Enter (0=>1)
  15) [1] Expr "Fail"
  16) [1] Leave (1=>0)
  17) [0] JumpIfNot 22 (0=>0) !C
  18) [0] Enter (0=>1)
  19) [1] Expr "Fail"
  20) [1] Leave (1=>0)
  21) [0] Jump 25 (0=>0)
  22) [0] Enter (0=>1)
  23) [1] Expr "Pass"
  24) [1] Leave (1=>0)
  25) [0] JumpIfNot 27 (0=>0) !C
  26) [0] Expr "Fail"
  27) [0] Expr "*** Optimizations with goto. ***"
  28) [0] JumpIf 30 (0=>0) C
  29) [0] Expr "Fail"
  30) [0] JumpIf 32 (0=>0) C
  31) [0] Expr "Fail"
  32) [0] JumpIfNot 35 (0=>0) !C
  33) [0] Expr "Fail"
  34) [0] Expr "Fail2"
  35) [0] JumpIfNot 39 (0=>0) !C
  36) [0] Enter (0=>1)
  37) [1] Leave (1=>0)
  38) [0] Expr "Fail2"
  39) [0] Expr "*** Error in condition. ***"
  40) [0] JumpIfNot 42 (0=>0) 3 + 5
  41) [0] Expr "Fail"
  42) [0] Expr "*** Blocks popping namespace ***"
  43) [0] Define X <- 1
  44) [0] JumpIfNot 49 (0=>0) C
  45) [0] Enter (0=>1)
  46) [1] Namespace N
  47) [1] Define X <- 2
  48) [1] Leave (1=>0)
  49) [0] Expr (X, N.X)
  50) [0] Expr "*** Loop for first Fib bigger than...."
  51) [0] Define P <- (0, 1)
  52) [0] Define P <- (P[1], P[0] + P[1])
  53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
  54) [0] Expr P
  55) [0] Define P <- (0, 1)
  56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
  57) [0] Enter (0=>1)
  58) [1] Define P <- (P[1], P[0] + P[1])
  59) [1] Jump 56 (1=>0)
  60) [1] Leave (1=>0)
  61) [0] Expr P
  62) [0] End

>    0) [0] Define C <- true
Global 'C' has DType: b, SysType: bool
>    1) [0] JumpIfNot 4 (0=>0) C
>    2) [0] Expr "Pass"
Pass
>    3) [0] Jump 5 (0=>0)
>    5) [0] JumpIfNot 8 (0=>0) !C
>    8) [0] Expr "Pass"
Pass
>    9) [0] JumpIfNot 14 (0=>0) C
>   10) [0] Enter (0=>1)
>   11) [1] Expr "Pass"
Pass
>   12) [1] Leave (1=>0)
>   13) [0] Jump 17 (0=>0)
>   17) [0] JumpIfNot 22 (0=>0) !C
>   22) [0] Enter (0=>1)
>   23) [1] Expr "Pass"
Pass
>   24) [1] Leave (1=>0)
>   25) [0] JumpIfNot 27 (0=>0) !C
>   27) [0] Expr "*** Optimizations with goto. ***"
*** Optimizations with goto. ***
>   28) [0] JumpIf 30 (0=>0) C
>   30) [0] JumpIf 32 (0=>0) C
>   32) [0] JumpIfNot 35 (0=>0) !C
>   35) [0] JumpIfNot 39 (0=>0) !C
>   39) [0] Expr "*** Error in condition. ***"
*** Error in condition. ***
>   40) [0] JumpIfNot 42 (0=>0) 3 + 5
*** Statement diagnostics:
  [If.txt] Error: (401,402) Node: 3 + 5, Message: The condition for 'if' must be type 'b' instead of type 'i8'
>   42) [0] Expr "*** Blocks popping namespace ***"
*** Blocks popping namespace ***
>   43) [0] Define X <- 1
Global 'X' has DType: i8, SysType: i8
>   44) [0] JumpIfNot 49 (0=>0) C
>   45) [0] Enter (0=>1)
>   46) [1] Namespace N
>   47) [1] Define X <- 2
Global 'N.X' has DType: i8, SysType: i8
>   48) [1] Leave (1=>0)
>   49) [0] Expr (X, N.X)
(1, 2)
>   50) [0] Expr "*** Loop for first Fib bigger than...."
*** Loop for first Fib bigger than....
>   51) [0] Define P <- (0, 1)
Global 'P' has DType: (i8, i8), SysType: (i8,i8)
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   52) [0] Define P <- (P[1], P[0] + P[1])
>   53) [0] JumpIf 52 (0=>0) P[1] $<= 1000
>   54) [0] Expr P
(987, 1597)
>   55) [0] Define P <- (0, 1)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   57) [0] Enter (0=>1)
>   58) [1] Define P <- (P[1], P[0] + P[1])
>   59) [1] Jump 56 (1=>0)
>   56) [0] JumpIfNot 61 (0=>0) P[1] $<= 1000
>   61) [0] Expr P
(987, 1597)
>   62) [0] End

