CS153/hw6/llprograms/sp22_hw3/foldl.ll
jmug 0c04936ccf Updated hw6 to a newer version
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 21:23:08 -08:00

26 lines
756 B
LLVM

@gbl = global [5 x i64] [ i64 2, i64 3, i64 4, i64 5, i64 6 ]
define i64 @add(i64 %x1, i64 %x2) {
%1 = add i64 %x1, %x2
ret i64 %1
}
define i64 @foldl(i64(i64, i64)* %f, i64 %acc, i64* %argv, i64 %argc) {
%cmp = icmp eq i64 %argc, 0
br i1 %cmp, label %then, label %else
then:
ret i64 %acc
else:
%tail = getelementptr i64, i64* %argv, i32 1
%head = load i64, i64* %argv
%new_acc = call i64 %f(i64 %acc, i64 %head)
%new_argc = sub i64 %argc, 1
%val = call i64 @foldl(i64(i64, i64)* %f, i64 %new_acc, i64* %tail, i64 %new_argc)
ret i64 %val
}
define i64 @main(i64 %argc, i8** %arcv) {
%1 = getelementptr [5 x i64], [5 x i64]* @gbl, i32 0, i32 0
%2 = call i64 @foldl(i64(i64, i64)* @add, i64 0, i64* %1, i64 5)
ret i64 %2
}