Change hw6 to an unsolved version.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
This commit is contained in:
parent
0c04936ccf
commit
ee01a8f5b2
186 changed files with 9605 additions and 4019 deletions
118
hw6/llprograms/sp24_hw3/linkedlist_cycle.ll
Normal file
118
hw6/llprograms/sp24_hw3/linkedlist_cycle.ll
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
; Eric Zhao (PennKey zhaoer), Nathaniel Lao (PennKey nlao)
|
||||
|
||||
%node = type { i64, %node* }
|
||||
|
||||
define i1 @find_cycle_rec_helper(%node* %slow, %node* %fast) {
|
||||
%fast_is_null = icmp eq %node* %fast, null
|
||||
br i1 %fast_is_null, label %no_cycle_found, label %incr_fast
|
||||
|
||||
incr_fast:
|
||||
%fast_next_ptr = getelementptr %node, %node* %fast, i32 0, i32 1
|
||||
%fast_next = load %node*, %node** %fast_next_ptr
|
||||
%fast_next_is_null = icmp eq %node* %fast_next, null
|
||||
br i1 %fast_next_is_null, label %no_cycle_found, label %find_nexts
|
||||
|
||||
find_nexts:
|
||||
%fast_next_next_ptr = getelementptr %node, %node* %fast_next, i32 0, i32 1
|
||||
%fast_next_next = load %node*, %node** %fast_next_next_ptr
|
||||
%slow_next_ptr = getelementptr %node, %node* %slow, i32 0, i32 1
|
||||
%slow_next = load %node*, %node** %slow_next_ptr
|
||||
%pointers_equal = icmp eq %node* %fast_next_next, %slow_next
|
||||
br i1 %pointers_equal, label %cycle_found, label %recursive_call
|
||||
|
||||
recursive_call:
|
||||
%result = call i1 @find_cycle_rec_helper(%node* %slow_next, %node* %fast_next_next)
|
||||
ret i1 %result
|
||||
|
||||
cycle_found:
|
||||
ret i1 1
|
||||
no_cycle_found:
|
||||
ret i1 0
|
||||
}
|
||||
|
||||
define i1 @find_cycle(%node* %start) {
|
||||
%result = call i1 @find_cycle_rec_helper(%node* %start, %node* %start)
|
||||
ret i1 %result
|
||||
}
|
||||
|
||||
define i1 @main(i64 %argc, i8** %argv) {
|
||||
%1 = alloca %node
|
||||
%2 = alloca %node
|
||||
%3 = alloca %node
|
||||
%4 = alloca %node
|
||||
%5 = alloca %node
|
||||
%next_ptr_1 = getelementptr %node, %node* %1, i32 0, i32 1
|
||||
%next_ptr_2 = getelementptr %node, %node* %2, i32 0, i32 1
|
||||
%next_ptr_3 = getelementptr %node, %node* %3, i32 0, i32 1
|
||||
%next_ptr_4 = getelementptr %node, %node* %4, i32 0, i32 1
|
||||
%next_ptr_5 = getelementptr %node, %node* %5, i32 0, i32 1
|
||||
br label %empty_list
|
||||
|
||||
empty_list:
|
||||
%empty_list_result = call i1 @find_cycle(%node* null)
|
||||
br i1 %empty_list_result, label %failure, label %singleton
|
||||
|
||||
singleton:
|
||||
store %node* null, %node** %next_ptr_1
|
||||
%singleton_result = call i1 @find_cycle(%node* %1)
|
||||
br i1 %singleton_result, label %failure, label %self_loop
|
||||
|
||||
self_loop:
|
||||
store %node* %1, %node** %next_ptr_1
|
||||
%self_loop_result = call i1 @find_cycle(%node* %1)
|
||||
br i1 %self_loop_result, label %long_no_cycle_odd, label %failure
|
||||
|
||||
long_no_cycle_odd:
|
||||
store %node* %2, %node** %next_ptr_1
|
||||
store %node* %3, %node** %next_ptr_2
|
||||
store %node* %4, %node** %next_ptr_3
|
||||
store %node* %5, %node** %next_ptr_4
|
||||
store %node* null, %node** %next_ptr_5
|
||||
%long_no_cycle_odd_result = call i1 @find_cycle(%node* %1)
|
||||
br i1 %long_no_cycle_odd_result, label %failure, label %two_cycle
|
||||
|
||||
two_cycle:
|
||||
store %node* %2, %node** %next_ptr_1
|
||||
store %node* %1, %node** %next_ptr_2
|
||||
%two_cycle_result = call i1 @find_cycle(%node* %1)
|
||||
br i1 %two_cycle_result, label %long_no_cycle_even, label %failure
|
||||
|
||||
long_no_cycle_even:
|
||||
store %node* %2, %node** %next_ptr_1
|
||||
store %node* %3, %node** %next_ptr_2
|
||||
store %node* %4, %node** %next_ptr_3
|
||||
store %node* null, %node** %next_ptr_4
|
||||
%long_no_cycle_even_result = call i1 @find_cycle(%node* %1)
|
||||
br i1 %long_no_cycle_even_result, label %failure, label %long_even_cycle
|
||||
|
||||
long_even_cycle:
|
||||
store %node* %2, %node** %next_ptr_1
|
||||
store %node* %3, %node** %next_ptr_2
|
||||
store %node* %4, %node** %next_ptr_3
|
||||
store %node* %1, %node** %next_ptr_4
|
||||
%long_even_cycle_result = call i1 @find_cycle(%node* %1)
|
||||
br i1 %long_even_cycle_result, label %long_odd_cycle, label %failure
|
||||
|
||||
long_odd_cycle:
|
||||
store %node* %2, %node** %next_ptr_1
|
||||
store %node* %3, %node** %next_ptr_2
|
||||
store %node* %4, %node** %next_ptr_3
|
||||
store %node* %5, %node** %next_ptr_4
|
||||
store %node* %1, %node** %next_ptr_5
|
||||
%long_odd_cycle_result = call i1 @find_cycle(%node* %1)
|
||||
br i1 %long_odd_cycle_result, label %cycle_in_middle, label %failure
|
||||
|
||||
cycle_in_middle:
|
||||
store %node* %2, %node** %next_ptr_1
|
||||
store %node* %3, %node** %next_ptr_2
|
||||
store %node* %4, %node** %next_ptr_3
|
||||
store %node* %5, %node** %next_ptr_4
|
||||
store %node* %3, %node** %next_ptr_5
|
||||
%cycle_in_middle_result = call i1 @find_cycle(%node* %1)
|
||||
br i1 %cycle_in_middle_result, label %success, label %failure
|
||||
|
||||
success:
|
||||
ret i1 0
|
||||
failure:
|
||||
ret i1 1
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue