Skip to content

Instantly share code, notes, and snippets.

@kkestell
Last active October 30, 2024 11:08
Show Gist options
  • Save kkestell/8aba9c3a9e65f3d7071b0e1c78867323 to your computer and use it in GitHub Desktop.
Save kkestell/8aba9c3a9e65f3d7071b0e1c78867323 to your computer and use it in GitHub Desktop.

Source

function main() -> int
{
    var a: int = 5;
    var b: int;
    if (a > 3)
    {
        b = 1;
    }
    else
    {
        b = 0;
    }
    return b;
}

AST

{
  "functions": [
    {
      "name": "main",
      "parameters": [],
      "return_type": {
        "name": "int"
      },
      "body": {
        "statements": [
          {
            "name": "a",
            "type": {
              "name": "int"
            },
            "initial_value": {
              "value": 5
            }
          },
          {
            "name": "b",
            "type": {
              "name": "int"
            },
            "initial_value": null
          },
          {
            "condition": {
              "operator": "GT",
              "left": {
                "name": "a"
              },
              "right": {
                "value": 3
              }
            },
            "then_block": {
              "statements": [
                {
                  "name": "b",
                  "expression": {
                    "value": 1
                  }
                }
              ]
            },
            "else_block": {
              "statements": [
                {
                  "name": "b",
                  "expression": {
                    "value": 0
                  }
                }
              ]
            }
          },
          {
            "expression": {
              "name": "b"
            }
          }
        ]
      }
    }
  ]
}

Symbol Table

main() -> int
→
  →
    a: int
    b: int
    →
    ←
  ←
←

TAC

procedure main() -> int:
bb1:
  a = 5
  b = 0
  t1 = a > 3
  if t1 goto bb2 else goto bb3
bb2:
  b = 1
  goto bb4
bb3:
  b = 0
  goto bb4
bb4:
  return b
  t2 = 0
  return t2

Optimized TAC

procedure main() -> int:
bb1:
  a = 5
  b = 0
  t1 = a > 3
  if t1 goto bb2 else goto bb3
bb2:
  b = 1
  goto bb4
bb3:
  b = 0
  goto bb4
bb4:
  return b

Control Flow Graphs

main:
  entry: bb1, exit: bb4
  block bb1:
    flags: entry
    predecessors: []
    successors: ['bb2', 'bb3']
    instructions:
      a = 5
      b = 0
      t1 = a > 3
      if t1 goto bb2 else goto bb3
  block bb2:
    predecessors: ['bb1']
    successors: ['bb4']
    instructions:
      b = 1
      goto bb4
  block bb3:
    predecessors: ['bb1']
    successors: ['bb4']
    instructions:
      b = 0
      goto bb4
  block bb4:
    flags: exit
    predecessors: ['bb2', 'bb3']
    successors: []
    instructions:
      return b

SSA Form

proc main() -> int:
block bb1:
  a.0 = 5
  b.0 = 0
  t1 = a.0 > 3
  if t1 goto bb2 else goto bb3
block bb2:
  b.1 = 1
  goto bb4
block bb3:
  b.2 = 0
  goto bb4
block bb4:
  b.4 = φ(bb2: b.1, bb3: b.2)
  return b.4

LLVM IR

; ModuleID = "module"
target triple = "unknown-unknown-unknown"
target datalayout = ""

define i32 @"main"()
{
bb1:
  %"a.0" = add i32 5, 0
  %"b.0" = add i32 0, 0
  %"t1" = icmp sgt i32 %"a.0", 3
  br i1 %"t1", label %"bb2", label %"bb3"
bb2:
  %"b.1" = add i32 1, 0
  br label %"bb4"
bb3:
  %"b.2" = add i32 0, 0
  br label %"bb4"
bb4:
  %"b.4" = phi  i32 [%"b.1", %"bb2"], [%"b.2", %"bb3"]
  ret i32 %"b.4"
}

Execution Result

1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment