sharp 0.1.0

A modern, statically-typed programming language with Python-like syntax, compiled to native code via LLVM. Game engine ready!
; ModuleID = 'sharp_module'
source_filename = "sharp_module"

define i64 @fibonacci(i64 %0) {
entry:
  %n = alloca i64, align 8
  store i64 %0, ptr %n, align 4
  %n1 = load i64, ptr %n, align 4
  %letmp = icmp sle i64 %n1, 1
  %ifcond = icmp ne i1 %letmp, i64 0
  br i1 %ifcond, label %then, label %else

then:                                             ; preds = %entry
  %n2 = load i64, ptr %n, align 4
  ret i64 %n2

else:                                             ; preds = %entry
  %n3 = load i64, ptr %n, align 4
  %subtmp = sub i64 %n3, 1
  %calltmp = call i64 @fibonacci(i64 %subtmp)
  %n4 = load i64, ptr %n, align 4
  %subtmp5 = sub i64 %n4, 2
  %calltmp6 = call i64 @fibonacci(i64 %subtmp5)
  %addtmp = add i64 %calltmp, %calltmp6
  ret i64 %addtmp

ifcont:                                           ; No predecessors!
  ret i64 0
}

define i64 @factorial(i64 %0) {
entry:
  %n = alloca i64, align 8
  store i64 %0, ptr %n, align 4
  %result = alloca i64, align 8
  store i64 1, ptr %result, align 4
  %i = alloca i64, align 8
  store i64 1, ptr %i, align 4
  %result1 = load i64, ptr %result, align 4
  ret i64 %result1
}

define i64 @test_ops(i64 %0, i64 %1) {
entry:
  %a = alloca i64, align 8
  store i64 %0, ptr %a, align 4
  %b = alloca i64, align 8
  store i64 %1, ptr %b, align 4
  %x = alloca i64, align 8
  %a1 = load i64, ptr %a, align 4
  %b2 = load i64, ptr %b, align 4
  %addtmp = add i64 %a1, %b2
  store i64 %addtmp, ptr %x, align 4
  %y = alloca i64, align 8
  %a3 = load i64, ptr %a, align 4
  %b4 = load i64, ptr %b, align 4
  %multmp = mul i64 %a3, %b4
  store i64 %multmp, ptr %y, align 4
  %z = alloca i64, align 8
  %a5 = load i64, ptr %a, align 4
  %b6 = load i64, ptr %b, align 4
  %subtmp = sub i64 %a5, %b6
  store i64 %subtmp, ptr %z, align 4
  %x7 = load i64, ptr %x, align 4
  %y8 = load i64, ptr %y, align 4
  %addtmp9 = add i64 %x7, %y8
  %z10 = load i64, ptr %z, align 4
  %addtmp11 = add i64 %addtmp9, %z10
  ret i64 %addtmp11
}

define i64 @main() {
entry:
  %x = alloca i64, align 8
  store i64 10, ptr %x, align 4
  %y = alloca i64, align 8
  store i64 20, ptr %y, align 4
  %result = alloca i64, align 8
  %x1 = load i64, ptr %x, align 4
  %y2 = load i64, ptr %y, align 4
  %calltmp = call i64 @test_ops(i64 %x1, i64 %y2)
  store i64 %calltmp, ptr %result, align 4
  %result3 = load i64, ptr %result, align 4
  ret i64 %result3
}