Skip to content

Instantly share code, notes, and snippets.

@osa1
Last active August 29, 2015 14:07
Show Gist options
  • Save osa1/fdd99c1da778b06f0beb to your computer and use it in GitHub Desktop.
Save osa1/fdd99c1da778b06f0beb to your computer and use it in GitHub Desktop.
; ModuleID = 'hello'
define i64 @add(i64 %a, i64 %b) {
%1 = alloca i64
store i64 %a, i64* %1
%2 = alloca i64
store i64 %b, i64* %2
%3 = load i64* %1
%4 = load i64* %2
%5 = add i64 %3, %4
ret i64 %5
}
define i64 @factorial_iter(i64 %n) {
entry:
%funcond = icmp ule i64 %n, 1
br i1 %funcond, label %afterloop, label %loop
loop:
%mult = phi i64 [ 1, %entry ], [ %mult_next, %loop ]
%acc = phi i64 [ 1, %entry ], [ %acc_next, %loop ]
%acc_next = mul i64 %acc, %mult
%mult_next = add i64 %mult, 1
%loop_cond = icmp ule i64 %mult_next, %n
br i1 %loop_cond, label %loop, label %afterloop
afterloop:
%ret = phi i64 [ %acc_next, %loop ], [ %n, %entry ]
ret i64 %ret
}
define i64 @factorial_rec(i64 %n) {
entry:
%funcond = icmp ule i64 %n, 1
br i1 %funcond, label %done, label %recurse
recurse:
%n_minus_one = sub i64 %n, 1
%recursed = call i64 @factorial_rec(i64 %n_minus_one)
%ret = mul i64 %n, %recursed
ret i64 %ret
done:
ret i64 %n
}
define i64 @factorial_tailcall(i64 %n, i64 %acc) {
; acc should be 1 in the beginning
%funcond = icmp ule i64 %n, 1
br i1 %funcond, label %done, label %recurse
recurse:
%newacc = mul i64 %n, %acc
%n_minus_one = sub i64 %n, 1
%r = tail call i64 @factorial_tailcall(i64 %n_minus_one, i64 %newacc)
ret i64 %r
done:
ret i64 %acc
}
declare i64 @printi64(i64)
define void @main() {
%1 = call i64 @add(i64 1, i64 2)
%2 = call i64 @printi64(i64 %1)
%3 = call i64 @factorial_iter(i64 5)
%4 = call i64 @printi64(i64 %3)
%5 = call i64 @factorial_rec(i64 5)
%6 = call i64 @printi64(i64 %5)
%7 = call i64 @factorial_tailcall(i64 5, i64 1)
%8 = call i64 @printi64(i64 %7)
ret void
}
#include "stdio.h"
double printdouble(double d)
{
printf("%f\n", d);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment