32 lines
726 B
LLVM
32 lines
726 B
LLVM
define i64 @ack(i64 %m, i64 %n) {
|
|
%r = alloca i64
|
|
%icm = icmp sgt i64 %m, 0
|
|
br i1 %icm, label %mnonzero, label %mzero
|
|
mzero:
|
|
%tmp = add i64 %n, 1
|
|
store i64 %tmp, i64* %r
|
|
br label %end
|
|
mnonzero:
|
|
%icn = icmp sgt i64 %n, 0
|
|
br i1 %icn, label %nnonzero, label %nzero
|
|
nzero:
|
|
%msub = sub i64 %m, 1
|
|
%tmp = call i64 @ack(i64 %msub, i64 1)
|
|
store i64 %tmp, i64* %r
|
|
br label %end
|
|
nnonzero:
|
|
%msub = sub i64 %m, 1
|
|
%nsub = sub i64 %n, 1
|
|
%newn = call i64 @ack(i64 %m, i64 %nsub)
|
|
%tmp = call i64 @ack(i64 %msub, i64 %newn)
|
|
store i64 %tmp, i64* %r
|
|
br label %end
|
|
end:
|
|
%rv1 = load i64, i64* %r
|
|
ret i64 %rv1
|
|
}
|
|
|
|
define i64 @main(i64 %argc, i8** %argv) {
|
|
%ans = call i64 @ack(i64 2, i64 2)
|
|
ret i64 %ans
|
|
}
|