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 @factorial_iterative(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
  br label %whilecond

whilecond:                                        ; preds = %whilebody, %entry
  %i1 = load i64, ptr %i, align 4
  %n2 = load i64, ptr %n, align 4
  %letmp = icmp sle i64 %i1, %n2
  br i1 %letmp, label %whilebody, label %afterwhile

whilebody:                                        ; preds = %whilecond
  %result3 = load i64, ptr %result, align 4
  %i4 = load i64, ptr %i, align 4
  %multmp = mul i64 %result3, %i4
  store i64 %multmp, ptr %result, align 4
  %i5 = load i64, ptr %i, align 4
  %addtmp = add i64 %i5, 1
  store i64 %addtmp, ptr %i, align 4
  br label %whilecond

afterwhile:                                       ; preds = %whilecond
  %result6 = load i64, ptr %result, align 4
  ret i64 %result6
}

define i64 @sum_to_n(i64 %0) {
entry:
  %n = alloca i64, align 8
  store i64 %0, ptr %n, align 4
  %sum = alloca i64, align 8
  store i64 0, ptr %sum, align 4
  %i = alloca i64, align 8
  store i64 0, ptr %i, align 4
  br label %whilecond

whilecond:                                        ; preds = %whilebody, %entry
  %i1 = load i64, ptr %i, align 4
  %n2 = load i64, ptr %n, align 4
  %letmp = icmp sle i64 %i1, %n2
  br i1 %letmp, label %whilebody, label %afterwhile

whilebody:                                        ; preds = %whilecond
  %sum3 = load i64, ptr %sum, align 4
  %i4 = load i64, ptr %i, align 4
  %i5 = load i64, ptr %i, align 4
  br label %whilecond

afterwhile:                                       ; preds = %whilecond
  %sum6 = load i64, ptr %sum, align 4
  ret i64 %sum6
}

define i64 @fibonacci_iterative(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
  br i1 %letmp, label %then, label %else

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

else:                                             ; preds = %entry
  br label %ifcont

ifcont:                                           ; preds = %else
  %a = alloca i64, align 8
  store i64 0, ptr %a, align 4
  %b = alloca i64, align 8
  store i64 1, ptr %b, align 4
  %i = alloca i64, align 8
  store i64 2, ptr %i, align 4
  br label %whilecond

whilecond:                                        ; preds = %whilebody, %ifcont
  %i3 = load i64, ptr %i, align 4
  %n4 = load i64, ptr %n, align 4
  %letmp5 = icmp sle i64 %i3, %n4
  br i1 %letmp5, label %whilebody, label %afterwhile

whilebody:                                        ; preds = %whilecond
  %a6 = load i64, ptr %a, align 4
  %b7 = load i64, ptr %b, align 4
  %addtmp = add i64 %a6, %b7
  %temp = alloca i64, align 8
  store i64 %addtmp, ptr %temp, align 4
  %b8 = load i64, ptr %b, align 4
  store i64 %b8, ptr %a, align 4
  %temp9 = load i64, ptr %temp, align 4
  store i64 %temp9, ptr %b, align 4
  %i10 = load i64, ptr %i, align 4
  br label %whilecond

afterwhile:                                       ; preds = %whilecond
  %b11 = load i64, ptr %b, align 4
  ret i64 %b11
}

define i64 @gcd(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
  br label %whilecond

whilecond:                                        ; preds = %whilebody, %entry
  %b1 = load i64, ptr %b, align 4
  %netmp = icmp ne i64 %b1, 0
  br i1 %netmp, label %whilebody, label %afterwhile

whilebody:                                        ; preds = %whilecond
  %b2 = load i64, ptr %b, align 4
  %temp = alloca i64, align 8
  store i64 %b2, ptr %temp, align 4
  %a3 = load i64, ptr %a, align 4
  %b4 = load i64, ptr %b, align 4
  %modtmp = srem i64 %a3, %b4
  store i64 %modtmp, ptr %b, align 4
  %temp5 = load i64, ptr %temp, align 4
  store i64 %temp5, ptr %a, align 4
  br label %whilecond

afterwhile:                                       ; preds = %whilecond
  %a6 = load i64, ptr %a, align 4
  ret i64 %a6
}

define i64 @main() {
entry:
  %calltmp = call i64 @factorial_iterative(i64 5)
  %fact5 = alloca i64, align 8
  store i64 %calltmp, ptr %fact5, align 4
  %calltmp1 = call i64 @sum_to_n(i64 10)
  %sum10 = alloca i64, align 8
  store i64 %calltmp1, ptr %sum10, align 4
  %calltmp2 = call i64 @fibonacci_iterative(i64 10)
  %fib10 = alloca i64, align 8
  store i64 %calltmp2, ptr %fib10, align 4
  %calltmp3 = call i64 @gcd(i64 48, i64 18)
  %gcd_result = alloca i64, align 8
  store i64 %calltmp3, ptr %gcd_result, align 4
  %fact54 = load i64, ptr %fact5, align 4
  %sum105 = load i64, ptr %sum10, align 4
  %addtmp = add i64 %fact54, %sum105
  %fib106 = load i64, ptr %fib10, align 4
  %addtmp7 = add i64 %addtmp, %fib106
  %gcd_result8 = load i64, ptr %gcd_result, align 4
  %addtmp9 = add i64 %addtmp7, %gcd_result8
  ret i64 %addtmp9
}