forked from NUDT-compiler/nudt-compiler-cpp
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
406 lines
13 KiB
406 lines
13 KiB
@space = global i32 32
|
|
@LF = global i32 10
|
|
@maxNode = global i32 10000
|
|
@value = global [10000 x i32] zeroinitializer
|
|
@left_child = global [10000 x i32] zeroinitializer
|
|
@right_child = global [10000 x i32] zeroinitializer
|
|
@now = global i32 0
|
|
|
|
declare i32 @getint()
|
|
declare float @getfloat()
|
|
declare i32 @getarray(i32* %arg.a)
|
|
declare i32 @getfarray(float* %arg.a)
|
|
declare i32 @getch()
|
|
declare void @putint(i32 %arg.x)
|
|
declare void @putfloat(float %arg.x)
|
|
declare void @putarray(i32 %arg.n, i32* %arg.a)
|
|
declare void @putfarray(i32 %arg.n, float* %arg.a)
|
|
declare void @putch(i32 %arg.x)
|
|
declare void @starttime()
|
|
declare void @stoptime()
|
|
define i32 @search(i32 %arg.root, i32 %arg.x) {
|
|
entry:
|
|
%t0 = alloca i32
|
|
store i32 %arg.root, i32* %t0
|
|
%t1 = alloca i32
|
|
store i32 %arg.x, i32* %t1
|
|
%t2 = load i32, i32* %t0
|
|
%t3 = icmp eq i32 %t2, -1
|
|
%t4 = zext i1 %t3 to i32
|
|
%t5 = icmp ne i32 %t4, 0
|
|
br i1 %t5, label %if.then.1, label %lor.rhs.4
|
|
if.then.1:
|
|
%t13 = load i32, i32* %t0
|
|
ret i32 %t13
|
|
if.else.2:
|
|
%t14 = load i32, i32* %t1
|
|
%t15 = load i32, i32* %t0
|
|
%t16 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t15
|
|
%t17 = load i32, i32* %t16
|
|
%t18 = icmp sgt i32 %t14, %t17
|
|
%t19 = zext i1 %t18 to i32
|
|
%t20 = icmp ne i32 %t19, 0
|
|
br i1 %t20, label %if.then.5, label %if.else.6
|
|
if.end.3:
|
|
ret i32 0
|
|
lor.rhs.4:
|
|
%t6 = load i32, i32* %t0
|
|
%t7 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t6
|
|
%t8 = load i32, i32* %t7
|
|
%t9 = load i32, i32* %t1
|
|
%t10 = icmp eq i32 %t8, %t9
|
|
%t11 = zext i1 %t10 to i32
|
|
%t12 = icmp ne i32 %t11, 0
|
|
br i1 %t12, label %if.then.1, label %if.else.2
|
|
if.then.5:
|
|
%t21 = load i32, i32* %t0
|
|
%t22 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t21
|
|
%t23 = load i32, i32* %t22
|
|
%t24 = load i32, i32* %t1
|
|
%t25 = call i32 @search(i32 %t23, i32 %t24)
|
|
ret i32 %t25
|
|
if.else.6:
|
|
%t26 = load i32, i32* %t0
|
|
%t27 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t26
|
|
%t28 = load i32, i32* %t27
|
|
%t29 = load i32, i32* %t1
|
|
%t30 = call i32 @search(i32 %t28, i32 %t29)
|
|
ret i32 %t30
|
|
if.end.7:
|
|
ret i32 0
|
|
}
|
|
define i32 @find_minimum(i32 %arg.root) {
|
|
entry:
|
|
%t31 = alloca i32
|
|
store i32 %arg.root, i32* %t31
|
|
%t32 = load i32, i32* %t31
|
|
%t33 = icmp eq i32 %t32, -1
|
|
%t34 = zext i1 %t33 to i32
|
|
%t35 = icmp ne i32 %t34, 0
|
|
br i1 %t35, label %if.then.8, label %if.else.9
|
|
if.then.8:
|
|
ret i32 -1
|
|
if.else.9:
|
|
%t36 = load i32, i32* %t31
|
|
%t37 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t36
|
|
%t38 = load i32, i32* %t37
|
|
%t39 = icmp ne i32 %t38, -1
|
|
%t40 = zext i1 %t39 to i32
|
|
%t41 = icmp ne i32 %t40, 0
|
|
br i1 %t41, label %if.then.11, label %if.end.12
|
|
if.end.10:
|
|
%t46 = load i32, i32* %t31
|
|
ret i32 %t46
|
|
if.then.11:
|
|
%t42 = load i32, i32* %t31
|
|
%t43 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t42
|
|
%t44 = load i32, i32* %t43
|
|
%t45 = call i32 @find_minimum(i32 %t44)
|
|
ret i32 %t45
|
|
if.end.12:
|
|
br label %if.end.10
|
|
}
|
|
define i32 @new_node(i32 %arg.x) {
|
|
entry:
|
|
%t47 = alloca i32
|
|
store i32 %arg.x, i32* %t47
|
|
%t48 = load i32, i32* @now
|
|
%t49 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t48
|
|
%t50 = load i32, i32* %t47
|
|
store i32 %t50, i32* %t49
|
|
%t51 = load i32, i32* @now
|
|
%t52 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t51
|
|
store i32 -1, i32* %t52
|
|
%t53 = load i32, i32* @now
|
|
%t54 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t53
|
|
store i32 -1, i32* %t54
|
|
%t55 = load i32, i32* @now
|
|
%t56 = add i32 %t55, 1
|
|
store i32 %t56, i32* @now
|
|
%t57 = load i32, i32* @now
|
|
%t58 = sub i32 %t57, 1
|
|
ret i32 %t58
|
|
}
|
|
define i32 @insert(i32 %arg.root, i32 %arg.x) {
|
|
entry:
|
|
%t59 = alloca i32
|
|
store i32 %arg.root, i32* %t59
|
|
%t60 = alloca i32
|
|
store i32 %arg.x, i32* %t60
|
|
%t61 = load i32, i32* %t59
|
|
%t62 = icmp eq i32 %t61, -1
|
|
%t63 = zext i1 %t62 to i32
|
|
%t64 = icmp ne i32 %t63, 0
|
|
br i1 %t64, label %if.then.13, label %if.else.14
|
|
if.then.13:
|
|
%t65 = load i32, i32* %t60
|
|
%t66 = call i32 @new_node(i32 %t65)
|
|
ret i32 %t66
|
|
if.else.14:
|
|
%t67 = load i32, i32* %t60
|
|
%t68 = load i32, i32* %t59
|
|
%t69 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t68
|
|
%t70 = load i32, i32* %t69
|
|
%t71 = icmp sgt i32 %t67, %t70
|
|
%t72 = zext i1 %t71 to i32
|
|
%t73 = icmp ne i32 %t72, 0
|
|
br i1 %t73, label %if.then.16, label %if.else.17
|
|
if.end.15:
|
|
%t88 = load i32, i32* %t59
|
|
ret i32 %t88
|
|
if.then.16:
|
|
%t74 = load i32, i32* %t59
|
|
%t75 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t74
|
|
%t76 = load i32, i32* %t59
|
|
%t77 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t76
|
|
%t78 = load i32, i32* %t77
|
|
%t79 = load i32, i32* %t60
|
|
%t80 = call i32 @insert(i32 %t78, i32 %t79)
|
|
store i32 %t80, i32* %t75
|
|
br label %if.end.18
|
|
if.else.17:
|
|
%t81 = load i32, i32* %t59
|
|
%t82 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t81
|
|
%t83 = load i32, i32* %t59
|
|
%t84 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t83
|
|
%t85 = load i32, i32* %t84
|
|
%t86 = load i32, i32* %t60
|
|
%t87 = call i32 @insert(i32 %t85, i32 %t86)
|
|
store i32 %t87, i32* %t82
|
|
br label %if.end.18
|
|
if.end.18:
|
|
br label %if.end.15
|
|
}
|
|
define i32 @delete(i32 %arg.root, i32 %arg.x) {
|
|
entry:
|
|
%t159 = alloca i32
|
|
%t89 = alloca i32
|
|
store i32 %arg.root, i32* %t89
|
|
%t90 = alloca i32
|
|
store i32 %arg.x, i32* %t90
|
|
%t91 = load i32, i32* %t89
|
|
%t92 = icmp eq i32 %t91, -1
|
|
%t93 = zext i1 %t92 to i32
|
|
%t94 = icmp ne i32 %t93, 0
|
|
br i1 %t94, label %if.then.19, label %if.end.20
|
|
if.then.19:
|
|
ret i32 -1
|
|
if.end.20:
|
|
%t95 = load i32, i32* %t90
|
|
%t96 = load i32, i32* %t89
|
|
%t97 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t96
|
|
%t98 = load i32, i32* %t97
|
|
%t99 = icmp sgt i32 %t95, %t98
|
|
%t100 = zext i1 %t99 to i32
|
|
%t101 = icmp ne i32 %t100, 0
|
|
br i1 %t101, label %if.then.21, label %if.else.22
|
|
if.then.21:
|
|
%t102 = load i32, i32* %t89
|
|
%t103 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t102
|
|
%t104 = load i32, i32* %t89
|
|
%t105 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t104
|
|
%t106 = load i32, i32* %t105
|
|
%t107 = load i32, i32* %t90
|
|
%t108 = call i32 @delete(i32 %t106, i32 %t107)
|
|
store i32 %t108, i32* %t103
|
|
br label %if.end.23
|
|
if.else.22:
|
|
%t109 = load i32, i32* %t90
|
|
%t110 = load i32, i32* %t89
|
|
%t111 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t110
|
|
%t112 = load i32, i32* %t111
|
|
%t113 = icmp slt i32 %t109, %t112
|
|
%t114 = zext i1 %t113 to i32
|
|
%t115 = icmp ne i32 %t114, 0
|
|
br i1 %t115, label %if.then.24, label %if.else.25
|
|
if.end.23:
|
|
%t178 = load i32, i32* %t89
|
|
ret i32 %t178
|
|
if.then.24:
|
|
%t116 = load i32, i32* %t89
|
|
%t117 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t116
|
|
%t118 = load i32, i32* %t89
|
|
%t119 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t118
|
|
%t120 = load i32, i32* %t119
|
|
%t121 = load i32, i32* %t90
|
|
%t122 = call i32 @delete(i32 %t120, i32 %t121)
|
|
store i32 %t122, i32* %t117
|
|
br label %if.end.26
|
|
if.else.25:
|
|
%t123 = load i32, i32* %t89
|
|
%t124 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t123
|
|
%t125 = load i32, i32* %t124
|
|
%t126 = icmp eq i32 %t125, -1
|
|
%t127 = zext i1 %t126 to i32
|
|
%t128 = icmp ne i32 %t127, 0
|
|
br i1 %t128, label %land.rhs.30, label %if.else.28
|
|
if.end.26:
|
|
br label %if.end.23
|
|
if.then.27:
|
|
ret i32 -1
|
|
if.else.28:
|
|
%t135 = load i32, i32* %t89
|
|
%t136 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t135
|
|
%t137 = load i32, i32* %t136
|
|
%t138 = icmp eq i32 %t137, -1
|
|
%t139 = zext i1 %t138 to i32
|
|
%t140 = icmp ne i32 %t139, 0
|
|
br i1 %t140, label %if.then.31, label %lor.rhs.34
|
|
if.end.29:
|
|
br label %if.end.26
|
|
land.rhs.30:
|
|
%t129 = load i32, i32* %t89
|
|
%t130 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t129
|
|
%t131 = load i32, i32* %t130
|
|
%t132 = icmp eq i32 %t131, -1
|
|
%t133 = zext i1 %t132 to i32
|
|
%t134 = icmp ne i32 %t133, 0
|
|
br i1 %t134, label %if.then.27, label %if.else.28
|
|
if.then.31:
|
|
%t147 = load i32, i32* %t89
|
|
%t148 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t147
|
|
%t149 = load i32, i32* %t148
|
|
%t150 = icmp eq i32 %t149, -1
|
|
%t151 = zext i1 %t150 to i32
|
|
%t152 = icmp ne i32 %t151, 0
|
|
br i1 %t152, label %if.then.35, label %if.else.36
|
|
if.else.32:
|
|
%t160 = load i32, i32* %t89
|
|
%t161 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t160
|
|
%t162 = load i32, i32* %t161
|
|
%t163 = call i32 @find_minimum(i32 %t162)
|
|
store i32 %t163, i32* %t159
|
|
%t164 = load i32, i32* %t89
|
|
%t165 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t164
|
|
%t166 = load i32, i32* %t159
|
|
%t167 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t166
|
|
%t168 = load i32, i32* %t167
|
|
store i32 %t168, i32* %t165
|
|
%t169 = load i32, i32* %t89
|
|
%t170 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t169
|
|
%t171 = load i32, i32* %t89
|
|
%t172 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t171
|
|
%t173 = load i32, i32* %t172
|
|
%t174 = load i32, i32* %t159
|
|
%t175 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t174
|
|
%t176 = load i32, i32* %t175
|
|
%t177 = call i32 @delete(i32 %t173, i32 %t176)
|
|
store i32 %t177, i32* %t170
|
|
br label %if.end.33
|
|
if.end.33:
|
|
br label %if.end.29
|
|
lor.rhs.34:
|
|
%t141 = load i32, i32* %t89
|
|
%t142 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t141
|
|
%t143 = load i32, i32* %t142
|
|
%t144 = icmp eq i32 %t143, -1
|
|
%t145 = zext i1 %t144 to i32
|
|
%t146 = icmp ne i32 %t145, 0
|
|
br i1 %t146, label %if.then.31, label %if.else.32
|
|
if.then.35:
|
|
%t153 = load i32, i32* %t89
|
|
%t154 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t153
|
|
%t155 = load i32, i32* %t154
|
|
ret i32 %t155
|
|
if.else.36:
|
|
%t156 = load i32, i32* %t89
|
|
%t157 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t156
|
|
%t158 = load i32, i32* %t157
|
|
ret i32 %t158
|
|
if.end.37:
|
|
ret i32 0
|
|
}
|
|
define void @inorder(i32 %arg.root) {
|
|
entry:
|
|
%t179 = alloca i32
|
|
store i32 %arg.root, i32* %t179
|
|
%t180 = load i32, i32* %t179
|
|
%t181 = icmp ne i32 %t180, -1
|
|
%t182 = zext i1 %t181 to i32
|
|
%t183 = icmp ne i32 %t182, 0
|
|
br i1 %t183, label %if.then.38, label %if.end.39
|
|
if.then.38:
|
|
%t184 = load i32, i32* %t179
|
|
%t185 = getelementptr inbounds [10000 x i32], [10000 x i32]* @left_child, i32 0, i32 %t184
|
|
%t186 = load i32, i32* %t185
|
|
call void @inorder(i32 %t186)
|
|
%t188 = load i32, i32* %t179
|
|
%t189 = getelementptr inbounds [10000 x i32], [10000 x i32]* @value, i32 0, i32 %t188
|
|
%t190 = load i32, i32* %t189
|
|
call void @putint(i32 %t190)
|
|
call void @putch(i32 32)
|
|
%t193 = load i32, i32* %t179
|
|
%t194 = getelementptr inbounds [10000 x i32], [10000 x i32]* @right_child, i32 0, i32 %t193
|
|
%t195 = load i32, i32* %t194
|
|
call void @inorder(i32 %t195)
|
|
br label %if.end.39
|
|
if.end.39:
|
|
ret void
|
|
}
|
|
define i32 @main() {
|
|
entry:
|
|
%t197 = alloca i32
|
|
%t203 = alloca i32
|
|
%t206 = alloca i32
|
|
store i32 0, i32* @now
|
|
%t198 = call i32 @getint()
|
|
store i32 %t198, i32* %t197
|
|
%t199 = load i32, i32* %t197
|
|
%t200 = icmp eq i32 %t199, 0
|
|
%t201 = zext i1 %t200 to i32
|
|
%t202 = icmp ne i32 %t201, 0
|
|
br i1 %t202, label %if.then.40, label %if.end.41
|
|
if.then.40:
|
|
ret i32 0
|
|
if.end.41:
|
|
%t204 = call i32 @getint()
|
|
%t205 = call i32 @new_node(i32 %t204)
|
|
store i32 %t205, i32* %t203
|
|
store i32 1, i32* %t206
|
|
br label %while.cond.42
|
|
while.cond.42:
|
|
%t207 = load i32, i32* %t206
|
|
%t208 = load i32, i32* %t197
|
|
%t209 = icmp slt i32 %t207, %t208
|
|
%t210 = zext i1 %t209 to i32
|
|
%t211 = icmp ne i32 %t210, 0
|
|
br i1 %t211, label %while.body.43, label %while.end.44
|
|
while.body.43:
|
|
%t212 = load i32, i32* %t203
|
|
%t213 = call i32 @getint()
|
|
%t214 = call i32 @insert(i32 %t212, i32 %t213)
|
|
%t215 = load i32, i32* %t206
|
|
%t216 = add i32 %t215, 1
|
|
store i32 %t216, i32* %t206
|
|
br label %while.cond.42
|
|
while.end.44:
|
|
%t217 = load i32, i32* %t203
|
|
call void @inorder(i32 %t217)
|
|
call void @putch(i32 10)
|
|
%t220 = call i32 @getint()
|
|
store i32 %t220, i32* %t197
|
|
store i32 0, i32* %t206
|
|
br label %while.cond.45
|
|
while.cond.45:
|
|
%t221 = load i32, i32* %t206
|
|
%t222 = load i32, i32* %t197
|
|
%t223 = icmp slt i32 %t221, %t222
|
|
%t224 = zext i1 %t223 to i32
|
|
%t225 = icmp ne i32 %t224, 0
|
|
br i1 %t225, label %while.body.46, label %while.end.47
|
|
while.body.46:
|
|
%t226 = load i32, i32* %t203
|
|
%t227 = call i32 @getint()
|
|
%t228 = call i32 @delete(i32 %t226, i32 %t227)
|
|
store i32 %t228, i32* %t203
|
|
%t229 = load i32, i32* %t206
|
|
%t230 = add i32 %t229, 1
|
|
store i32 %t230, i32* %t206
|
|
br label %while.cond.45
|
|
while.end.47:
|
|
%t231 = load i32, i32* %t203
|
|
call void @inorder(i32 %t231)
|
|
call void @putch(i32 10)
|
|
ret i32 0
|
|
}
|