CS153/hw6/llprograms/sp24_hw3/bubblesort.ll
jmug ee01a8f5b2 Change hw6 to an unsolved version.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 23:10:01 -08:00

129 lines
4.1 KiB
LLVM

%arraystruct = type {[12 x i64]}
; eloic + tom
@unsorted_array_1 = global %arraystruct {[12 x i64] [i64 -95, i64 18, i64 -50, i64 -22, i64 -51, i64 -1, i64 94, i64 6, i64 82, i64 82, i64 -23, i64 44]}
@unsorted_array_2 = global %arraystruct {[12 x i64] [i64 2, i64 79, i64 -8, i64 -86, i64 6, i64 -29, i64 88, i64 -80, i64 2, i64 21, i64 -26, i64 -13]}
@unsorted_array_3 = global %arraystruct {[12 x i64] [i64 16, i64 -1, i64 3, i64 51, i64 30, i64 49, i64 -48, i64 -99, i64 -13, i64 57, i64 -63, i64 29]}
@unsorted_array_4 = global %arraystruct {[12 x i64] [i64 91, i64 87, i64 -80, i64 60, i64 -43, i64 -79, i64 -12, i64 -52, i64 -42, i64 69, i64 87, i64 -86]}
@unsorted_array_5 = global %arraystruct {[12 x i64] [i64 89, i64 89, i64 74, i64 89, i64 -50, i64 7, i64 -46, i64 -37, i64 30, i64 -50, i64 34, i64 -80]}
define i1 @is_sorted(%arraystruct* %arr) {
%array_end_ptr = alloca i64
store i64 11, i64* %array_end_ptr
%array_end = load i64, i64* %array_end_ptr
%i = alloca i64
store i64 0, i64* %i
br label %loop_cond
loop_cond:
%i_val = load i64, i64* %i
%loop_cmp = icmp slt i64 %i_val, %array_end
br i1 %loop_cmp, label %loop_body, label %sorted
loop_body:
%curr_ptr = getelementptr %arraystruct, %arraystruct* %arr, i64 0, i32 0, i64 %i_val
%next_ptr = getelementptr i64, i64* %curr_ptr, i64 1
%curr_elem = load i64, i64* %curr_ptr
%next_elem = load i64, i64* %next_ptr
%elem_cmp = icmp sle i64 %curr_elem, %next_elem
br i1 %elem_cmp, label %increment, label %not_sorted
increment:
%next_i = add i64 %i_val, 1
store i64 %next_i, i64* %i
br label %loop_cond
not_sorted:
ret i1 0
sorted:
ret i1 1
}
define void @swap(i64* %x, i64* %y) {
%temp1 = load i64, i64* %x
%temp2 = load i64, i64* %y
store i64 %temp1, i64* %y
store i64 %temp2, i64* %x
ret void
}
define void @bubblesort(%arraystruct* %arr) {
%length = alloca i64
store i64 12, i64* %length
%i = alloca i64
%j = alloca i64
br label %outer_loop_entry
outer_loop_entry:
store i64 0, i64* %i
%length_val = load i64, i64* %length
br label %outer_loop_cond
outer_loop_cond:
%i_val = load i64, i64* %i
%cmp1 = icmp slt i64 %i_val, %length_val
br i1 %cmp1, label %inner_loop_entry, label %exit
inner_loop_entry:
store i64 0, i64* %j
%i_val_for_j = load i64, i64* %i
%length_for_j = sub i64 %length_val, 1
%length_for_j = sub i64 %length_for_j, %i_val_for_j
br label %inner_loop_cond
inner_loop_cond:
%j_val = load i64, i64* %j
%cmp2 = icmp slt i64 %j_val, %length_for_j
br i1 %cmp2, label %swap_check, label %inner_loop_exit
swap_check:
%j_plus_1 = add i64 %j_val, 1
%elem1_ptr = getelementptr %arraystruct, %arraystruct* %arr, i32 0, i32 0, i64 %j_val
%elem2_ptr = getelementptr %arraystruct, %arraystruct* %arr, i32 0, i32 0, i64 %j_plus_1
%elem1 = load i64, i64* %elem1_ptr
%elem2 = load i64, i64* %elem2_ptr
%cmp3 = icmp sgt i64 %elem1, %elem2
br i1 %cmp3, label %do_swap, label %no_swap
do_swap:
call void @swap(i64* %elem1_ptr, i64* %elem2_ptr)
br label %no_swap
no_swap:
%j_inc = add i64 %j_val, 1
store i64 %j_inc, i64* %j
br label %inner_loop_cond
inner_loop_exit:
%i_inc = add i64 %i_val, 1
store i64 %i_inc, i64* %i
br label %outer_loop_cond
exit:
ret void
}
define i1 @main(i64 %argc, i8** %arcv) {
call void @bubblesort(%arraystruct* @unsorted_array_1, i64 0, i64 11)
call void @bubblesort(%arraystruct* @unsorted_array_2, i64 0, i64 11)
call void @bubblesort(%arraystruct* @unsorted_array_3, i64 0, i64 11)
call void @bubblesort(%arraystruct* @unsorted_array_4, i64 0, i64 11)
call void @bubblesort(%arraystruct* @unsorted_array_5, i64 0, i64 11)
%return_val_1 = call i1 @is_sorted(%arraystruct* @unsorted_array_1)
%return_val_2 = call i1 @is_sorted(%arraystruct* @unsorted_array_2)
%return_val_3 = call i1 @is_sorted(%arraystruct* @unsorted_array_5)
%return_val_4 = call i1 @is_sorted(%arraystruct* @unsorted_array_4)
%return_val_5 = call i1 @is_sorted(%arraystruct* @unsorted_array_3)
%ret = add i64 %return_val_1, %return_val_2
%ret = add i64 %ret, %return_val_3
%ret = add i64 %ret, %return_val_4
%ret = add i64 %ret, %return_val_5
ret i1 %ret
}