32 lines
No EOL
1.2 KiB
LLVM
32 lines
No EOL
1.2 KiB
LLVM
@gbl = global [9 x i64] [ i64 -2, i64 1, i64 -3, i64 4, i64 -1, i64 2, i64 1, i64 -5, i64 4 ]
|
|
define i64 @kadane([0 x i64]* %arr, i64 %max_so_far, i64 %max_here, i64 %size, i64 %i) {
|
|
%done = icmp slt i64 %i, %size
|
|
br i1 %done, label %start_iter, label %exit
|
|
start_iter:
|
|
%addr = getelementptr [0 x i64], [0 x i64]* %arr, i64 0, i64 %i
|
|
%new_i = add i64 1, %i
|
|
%v = load i64, i64* %addr
|
|
%curr = add i64 %max_here, %v
|
|
br label %check_positive
|
|
check_positive:
|
|
%is_pos = icmp sge i64 %curr, 0
|
|
br i1 %is_pos, label %pos, label %not_pos
|
|
pos:
|
|
%is_max = icmp sge i64 %curr, %max_so_far
|
|
br i1 %is_max, label %max, label %no_max
|
|
max:
|
|
%rec_max = call i64 @kadane([0 x i64]* %arr, i64 %curr, i64 %curr, i64 %size, i64 %new_i)
|
|
ret i64 %rec_max
|
|
no_max:
|
|
%rec_no_max = call i64 @kadane([0 x i64]* %arr, i64 %max_so_far, i64 %curr, i64 %size, i64 %new_i)
|
|
ret i64 %rec_no_max
|
|
not_pos:
|
|
%rec_no_pos = call i64 @kadane([0 x i64]* %arr, i64 %max_so_far, i64 0, i64 %size, i64 %new_i)
|
|
ret i64 %rec_no_pos
|
|
exit:
|
|
ret i64 %max_so_far
|
|
}
|
|
define i64 @main(i64 %argc, i8** %arcv) {
|
|
%out = call i64 @kadane([0 x i64]* @gbl, i64 0, i64 0, i64 9, i64 0)
|
|
ret i64 %out
|
|
} |