175 lines
No EOL
6.3 KiB
LLVM
175 lines
No EOL
6.3 KiB
LLVM
%Node = type { %Node*, %Node*, i64 }
|
|
|
|
@n6 = global %Node { %Node* null, %Node* null, i64 67 }
|
|
@n5 = global %Node { %Node* null, %Node* null, i64 -42 }
|
|
@n4 = global %Node { %Node* null, %Node* null, i64 12 }
|
|
@n3 = global %Node { %Node* null, %Node* null, i64 1 }
|
|
@n2 = global %Node { %Node* @n5, %Node* @n6, i64 -5 }
|
|
@n1 = global %Node { %Node* @n3, %Node* @n4, i64 -9 }
|
|
@root = global %Node { %Node* @n1, %Node* @n2, i64 15 }
|
|
|
|
define void @swap(%Node* %n1, %Node* %n2) {
|
|
%n1l.p = getelementptr %Node, %Node* %n1, i32 0, i32 0
|
|
%temp_l = load %Node*, %Node** %n1l.p
|
|
%n1r.p = getelementptr %Node, %Node* %n1, i32 0, i32 1
|
|
%temp_r = load %Node*, %Node** %n1r.p
|
|
%n1v.p = getelementptr %Node, %Node* %n1, i32 0, i32 2
|
|
%temp_v = load i64, i64* %n1v.p
|
|
%n2l.p = getelementptr %Node, %Node* %n2, i32 0, i32 0
|
|
%t2_l = load %Node*, %Node** %n2l.p
|
|
store %Node* %t2_l, %Node** %n1l.p
|
|
%n2r.p = getelementptr %Node, %Node* %n2, i32 0, i32 1
|
|
%t2_r = load %Node*, %Node** %n2r.p
|
|
store %Node* %t2_r, %Node** %n1r.p
|
|
%n2v.p = getelementptr %Node, %Node* %n2, i32 0, i32 2
|
|
%t2_v = load i64, i64* %n2v.p
|
|
store i64 %t2_v, i64* %n1v.p
|
|
store %Node* %temp_l, %Node** %n2l.p
|
|
store %Node* %temp_r, %Node** %n2r.p
|
|
store i64 %temp_v, i64* %n2v.p
|
|
ret void
|
|
}
|
|
|
|
define void @heapify(%Node* %0) {
|
|
%2 = alloca %Node*
|
|
%3 = alloca %Node*
|
|
%4 = alloca %Node*
|
|
%5 = alloca %Node*
|
|
store %Node* %0, %Node** %2
|
|
%6 = load %Node*, %Node** %2
|
|
%7 = getelementptr %Node, %Node* %6, i32 0, i32 0
|
|
%8 = load %Node*, %Node** %7
|
|
store %Node* %8, %Node** %3
|
|
%9 = load %Node*, %Node** %2
|
|
%10 = getelementptr %Node, %Node* %9, i32 0, i32 1
|
|
%11 = load %Node*, %Node** %10
|
|
store %Node* %11, %Node** %4
|
|
%12 = load %Node*, %Node** %2
|
|
store %Node* %12, %Node** %5
|
|
%13 = load %Node*, %Node** %3
|
|
%14 = icmp ne %Node* %13, null
|
|
br i1 %14, label %l15, label %l25
|
|
l15:
|
|
%16 = load %Node*, %Node** %3
|
|
%17 = getelementptr %Node, %Node* %16, i32 0, i32 2
|
|
%18 = load i64, i64* %17
|
|
%19 = load %Node*, %Node** %2
|
|
%20 = getelementptr %Node, %Node* %19, i32 0, i32 2
|
|
%21 = load i64, i64* %20
|
|
%22 = icmp sgt i64 %18, %21
|
|
br i1 %22, label %l23, label %l25
|
|
l23:
|
|
%24 = load %Node*, %Node** %3
|
|
store %Node* %24, %Node** %5
|
|
br label %l25
|
|
l25:
|
|
%26 = load %Node*, %Node** %4
|
|
%27 = icmp ne %Node* %26, null
|
|
br i1 %27, label %l28, label %l38
|
|
l28:
|
|
%29 = load %Node*, %Node** %4
|
|
%30 = getelementptr %Node, %Node* %29, i32 0, i32 2
|
|
%31 = load i64, i64* %30
|
|
%32 = load %Node*, %Node** %2
|
|
%33 = getelementptr %Node, %Node* %32, i32 0, i32 2
|
|
%34 = load i64, i64* %33
|
|
%35 = icmp sgt i64 %31, %34
|
|
br i1 %35, label %l36, label %l38
|
|
l36:
|
|
%37 = load %Node*, %Node** %4
|
|
store %Node* %37, %Node** %5
|
|
br label %l38
|
|
l38:
|
|
%39 = load %Node*, %Node** %5
|
|
%40 = load %Node*, %Node** %2
|
|
%41 = icmp ne %Node* %39, %40
|
|
br i1 %41, label %l42, label %l46
|
|
l42:
|
|
%43 = load %Node*, %Node** %2
|
|
%44 = load %Node*, %Node** %5
|
|
call void @swap(%Node* %43, %Node* %44)
|
|
%45 = load %Node*, %Node** %2
|
|
call void @heapify(%Node* %45)
|
|
br label %l46
|
|
l46:
|
|
ret void
|
|
}
|
|
|
|
define void @heapify_total(%Node* %0) {
|
|
%2 = alloca %Node*
|
|
store %Node* %0, %Node** %2
|
|
%3 = load %Node*, %Node** %2
|
|
%4 = getelementptr %Node, %Node* %3, i32 0, i32 0
|
|
%5 = load %Node*, %Node** %4
|
|
%6 = icmp eq %Node* %5, null
|
|
br i1 %6, label %l7, label %l13
|
|
l7:
|
|
%8 = load %Node*, %Node** %2
|
|
%9 = getelementptr %Node, %Node* %8, i32 0, i32 1
|
|
%10 = load %Node*, %Node** %9
|
|
%11 = icmp eq %Node* %10, null
|
|
br i1 %11, label %l12, label %l13
|
|
l12:
|
|
br label %l51
|
|
l13:
|
|
%14 = load %Node*, %Node** %2
|
|
%15 = getelementptr %Node, %Node* %14, i32 0, i32 0
|
|
%16 = load %Node*, %Node** %15
|
|
%17 = icmp ne %Node* %16, null
|
|
br i1 %17, label %l18, label %l31
|
|
l18:
|
|
%19 = load %Node*, %Node** %2
|
|
%20 = getelementptr %Node, %Node* %19, i32 0, i32 1
|
|
%21 = load %Node*, %Node** %20
|
|
%22 = icmp ne %Node* %21, null
|
|
br i1 %22, label %l23, label %l31
|
|
l23:
|
|
%24 = load %Node*, %Node** %2
|
|
%25 = getelementptr %Node, %Node* %24, i32 0, i32 0
|
|
%26 = load %Node*, %Node** %25
|
|
call void @heapify_total(%Node* %26)
|
|
%27 = load %Node*, %Node** %2
|
|
%28 = getelementptr %Node, %Node* %27, i32 0, i32 1
|
|
%29 = load %Node*, %Node** %28
|
|
call void @heapify_total(%Node* %29)
|
|
%30 = load %Node*, %Node** %2
|
|
call void @heapify(%Node* %30)
|
|
br label %l51
|
|
l31:
|
|
%32 = load %Node*, %Node** %2
|
|
%33 = getelementptr %Node, %Node* %32, i32 0, i32 0
|
|
%34 = load %Node*, %Node** %33
|
|
%35 = icmp eq %Node* %34, null
|
|
br i1 %35, label %l36, label %l41
|
|
l36:
|
|
%37 = load %Node*, %Node** %2
|
|
%38 = getelementptr %Node, %Node* %37, i32 0, i32 1
|
|
%39 = load %Node*, %Node** %38
|
|
call void @heapify_total(%Node* %39)
|
|
%40 = load %Node*, %Node** %2
|
|
call void @heapify(%Node* %40)
|
|
br label %l51
|
|
l41:
|
|
%42 = load %Node*, %Node** %2
|
|
%43 = getelementptr %Node, %Node* %42, i32 0, i32 1
|
|
%44 = load %Node*, %Node** %43
|
|
%45 = icmp eq %Node* %44, null
|
|
br i1 %45, label %l46, label %l51
|
|
l46:
|
|
%47 = load %Node*, %Node** %2
|
|
%48 = getelementptr %Node, %Node* %47, i32 0, i32 0
|
|
%49 = load %Node*, %Node** %48
|
|
call void @heapify_total(%Node* %49)
|
|
%50 = load %Node*, %Node** %2
|
|
call void @heapify(%Node* %50)
|
|
br label %l51
|
|
l51:
|
|
ret void
|
|
}
|
|
|
|
define i64 @main() {
|
|
call void @heapify_total(%Node* @root)
|
|
%max_val_ptr = getelementptr %Node, %Node* @root, i32 0, i32 2
|
|
%max_val = load i64, i64* %max_val_ptr
|
|
ret i64 %max_val
|
|
} |