113 lines
No EOL
3.2 KiB
LLVM
113 lines
No EOL
3.2 KiB
LLVM
@array1 = global [10 x i64] [i64 4, i64 9, i64 9, i64 9, i64 -1, i64 3, i64 3, i64 5, i64 8, i64 1]
|
|
|
|
|
|
define i64 @is_sorted([0 x i64]* %arr, i64 %index, i64 %prev, i64 %n) {
|
|
|
|
%1 = icmp slt i64 %index, %n
|
|
br i1 %1, label %check, label %exit_t
|
|
check:
|
|
%addr = getelementptr [0 x i64], [0 x i64]* %arr, i32 0, i64 %index
|
|
%value = load i64, i64*%addr
|
|
%2 = icmp sge i64 %value, %prev
|
|
br i1 %2, label %recurse, label %exit_f
|
|
recurse:
|
|
%next = add i64 1, %index
|
|
%rec = call i64 @is_sorted([0 x i64]* %arr, i64 %next, i64 %value, i64 %n)
|
|
ret i64 %rec
|
|
exit_t:
|
|
ret i64 1
|
|
exit_f:
|
|
ret i64 0
|
|
}
|
|
|
|
define i64 @partition([0 x i64]* %arr, i64 %left, i64 %right) {
|
|
|
|
%l_mut = alloca i64
|
|
%r_mut = alloca i64
|
|
store i64 %left, i64* %l_mut
|
|
store i64 %right, i64* %r_mut
|
|
|
|
%sum = add i64 %left, %right
|
|
%pivot_i = ashr i64 %sum, 1
|
|
%pivot_addr = getelementptr [0 x i64], [0 x i64]* %arr, i32 0, i64 %pivot_i
|
|
%pivot = load i64, i64* %pivot_addr
|
|
|
|
br label %body
|
|
body:
|
|
br label %check_l
|
|
incr_l:
|
|
%l_i = load i64, i64* %l_mut
|
|
%next = add i64 %l_i, 1
|
|
store i64 %next, i64* %l_mut
|
|
br label %check_l
|
|
check_l:
|
|
%l_index = load i64, i64* %l_mut
|
|
%l_arr_ptr = getelementptr [0 x i64], [0 x i64]* %arr, i32 0, i64 %l_index
|
|
%l_val = load i64, i64* %l_arr_ptr
|
|
%l_cmp = icmp slt i64 %l_val, %pivot
|
|
br i1 %l_cmp, label %incr_l, label %check_r
|
|
incr_r:
|
|
%r_i = load i64, i64* %r_mut
|
|
%next_r = add i64 %r_i, -1
|
|
store i64 %next_r, i64* %r_mut
|
|
br label %check_r
|
|
check_r:
|
|
%r_index = load i64, i64* %r_mut
|
|
%r_arr_ptr = getelementptr [0 x i64], [0 x i64]* %arr, i32 0, i64 %r_index
|
|
%r_val = load i64, i64* %r_arr_ptr
|
|
%r_cmp = icmp sgt i64 %r_val, %pivot
|
|
br i1 %r_cmp, label %incr_r, label %check_body
|
|
check_body:
|
|
%index_l = load i64, i64* %l_mut
|
|
%index_r = load i64, i64* %r_mut
|
|
%cmp_l_r = icmp sge i64 %index_l, %index_r
|
|
br i1 %cmp_l_r, label %exit, label %swap
|
|
exit:
|
|
%r_index1 = load i64, i64* %r_mut
|
|
ret i64 %r_index1
|
|
|
|
swap:
|
|
%l_arr_ptr1 = getelementptr [0 x i64], [0 x i64]* %arr, i32 0, i64 %index_l
|
|
%r_arr_ptr1 = getelementptr [0 x i64], [0 x i64]* %arr, i32 0, i64 %index_r
|
|
%l_val1 = load i64, i64* %l_arr_ptr1
|
|
%r_val1 = load i64, i64* %r_arr_ptr1
|
|
|
|
store i64 %r_val1, i64* %l_arr_ptr1
|
|
store i64 %l_val1, i64* %r_arr_ptr1
|
|
|
|
%l_i1 = load i64, i64* %l_mut
|
|
%next1 = add i64 %l_i1, 1
|
|
store i64 %next1, i64* %l_mut
|
|
|
|
%r_i1 = load i64, i64* %r_mut
|
|
%next_r1 = add i64 %r_i1, -1
|
|
store i64 %next_r1, i64* %r_mut
|
|
|
|
br label %body
|
|
}
|
|
|
|
define void @quicksort([0 x i64]* %arr, i64 %left, i64 %right) {
|
|
%1 = icmp sge i64 %left, 0
|
|
%2 = icmp sge i64 %right, 0
|
|
%3 = icmp slt i64 %left, %right
|
|
%4 = and i1 %1, %2
|
|
%5 = and i1 %3, %4
|
|
br i1 %5, label %body, label %exit
|
|
body:
|
|
|
|
%p = call i64 @partition([0 x i64]* %arr, i64 %left, i64 %right)
|
|
call void @quicksort([0 x i64]* %arr, i64 %left, i64 %p)
|
|
%6 = add i64 %p, 1
|
|
call void @quicksort([0 x i64]* %arr, i64 %6, i64 %right)
|
|
ret void
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define i64 @main() {
|
|
%a = bitcast [10 x i64]* @array1 to [0 x i64]*
|
|
call void @quicksort([0 x i64]* %a, i64 0, i64 9)
|
|
|
|
%1 = call i64 @is_sorted([0 x i64]* %a, i64 0, i64 -5, i64 10)
|
|
ret i64 %1
|
|
} |