CS153/hw6/llprograms/sp20_hw3/slowsort.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

70 lines
No EOL
2 KiB
LLVM

%list = type [31 x i64]
@length = global i64 31
@input = global %list [i64 5, i64 100, i64 2, i64 0, i64 18, i64 10, i64 2, i64 1, i64 22, i64 98, i64 107, i64 105, i64 116, i64 116, i64 101, i64 110, i64 20, i64 23, i64 102, i64 23, i64 98, i64 97, i64 98, i64 121, i64 15, i64 5, i64 16, i64 116, i64 105, i64 110, i64 155]
define void @slowsort(i64 %i, i64 %j) {
%1 = icmp sge i64 %i, %j
br i1 %1, label %done, label %notdone
notdone:
%2 = add i64 %i, %j
%mid = ashr i64 %2, 1
%mid1 = add i64 %mid, 1
call void @slowsort(i64 %i, i64 %mid)
call void @slowsort(i64 %mid1, i64 %j)
%ptrm = getelementptr %list, %list* @input, i64 0, i64 %mid
%valm = load i64, i64* %ptrm
%ptrj = getelementptr %list, %list* @input, i64 0, i64 %j
%valj = load i64, i64* %ptrj
%isrev = icmp slt i64 %valj, %valm
br i1 %isrev, label %swap, label %finish
swap:
store i64 %valj, i64* %ptrm
store i64 %valm, i64* %ptrj
br label %finish
finish:
%jminus = sub i64 %j, 1
call void @slowsort(i64 %i, i64 %jminus)
br label %done
done:
ret void
}
define i1 @issorted() {
%len = load i64, i64* @length
%len1 = sub i64 %len, 1
%iptr = alloca i64
store i64 0, i64* %iptr
br label %loop
loop:
%i = load i64, i64* %iptr
%ptri = getelementptr %list, %list* @input, i64 0, i64 %i
%vali = load i64, i64* %ptri
%j = add i64 %i, 1
%ptrj = getelementptr %list, %list* @input, i64 0, i64 %j
%valj = load i64, i64* %ptrj
store i64 %j, i64* %iptr
%inorder = icmp sle i64 %vali, %valj
br i1 %inorder, label %checkloop, label %succ
checkloop:
%isdone = icmp eq i64 %i, %len1
br i1 %isdone, label %succ, label %loop
fail:
ret i1 0
succ:
ret i1 1
}
define i64 @main(i64 %argc, i8** %arcv) {
%len = load i64, i64* @length
%len1 = sub i64 %len, 1
call void @slowsort(i64 0, i64 %len1)
%test = call i1 @issorted()
br i1 %test, label %succ, label %fail
fail:
ret i64 0
succ:
%p = getelementptr %list, %list* @input, i64 0, i64 %len1
%big = load i64, i64* %p
ret i64 %big
}