294 lines · plain
1; RUN: opt < %s -passes=inline,argpromotion -disable-output2; ModuleID = '<stdin>'3target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"4target triple = "i386-apple-darwin9.6"5 %struct.quad_struct = type { i32, i32, ptr, ptr, ptr, ptr, ptr }6@NumNodes = external global i32 ; <ptr> [#uses=0]7@"\01LC" = external constant [43 x i8] ; <ptr> [#uses=0]8@"\01LC1" = external constant [19 x i8] ; <ptr> [#uses=0]9@"\01LC2" = external constant [17 x i8] ; <ptr> [#uses=0]10 11declare i32 @dealwithargs(i32, ptr nocapture) nounwind12 13declare i32 @atoi(ptr)14 15define internal fastcc i32 @adj(i32 %d, i32 %ct) nounwind readnone {16entry:17 switch i32 %d, label %return [18 i32 0, label %bb19 i32 1, label %bb1020 i32 2, label %bb521 i32 3, label %bb1522 ]23 24bb: ; preds = %entry25 switch i32 %ct, label %bb3 [26 i32 1, label %return27 i32 0, label %return28 ]29 30bb3: ; preds = %bb31 ret i32 032 33bb5: ; preds = %entry34 switch i32 %ct, label %bb8 [35 i32 3, label %return36 i32 2, label %return37 ]38 39bb8: ; preds = %bb540 ret i32 041 42bb10: ; preds = %entry43 switch i32 %ct, label %bb13 [44 i32 1, label %return45 i32 3, label %return46 ]47 48bb13: ; preds = %bb1049 ret i32 050 51bb15: ; preds = %entry52 switch i32 %ct, label %bb18 [53 i32 2, label %return54 i32 0, label %return55 ]56 57bb18: ; preds = %bb1558 ret i32 059 60return: ; preds = %bb15, %bb15, %bb10, %bb10, %bb5, %bb5, %bb, %bb, %entry61 ret i32 162}63 64declare fastcc i32 @reflect(i32, i32) nounwind readnone65 66declare i32 @CountTree(ptr nocapture) nounwind readonly67 68define internal fastcc ptr @child(ptr nocapture %tree, i32 %ct) nounwind readonly {69entry:70 switch i32 %ct, label %bb5 [71 i32 0, label %bb172 i32 1, label %bb73 i32 2, label %bb374 i32 3, label %bb275 ]76 77bb: ; preds = %entry78 %0 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 3 ; <ptr> [#uses=1]79 %1 = load ptr, ptr %0, align 4 ; <ptr> [#uses=1]80 ret ptr %181 82bb1: ; preds = %entry83 %2 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 2 ; <ptr> [#uses=1]84 %3 = load ptr, ptr %2, align 4 ; <ptr> [#uses=1]85 ret ptr %386 87bb2: ; preds = %entry88 %4 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 5 ; <ptr> [#uses=1]89 %5 = load ptr, ptr %4, align 4 ; <ptr> [#uses=1]90 ret ptr %591 92bb3: ; preds = %entry93 %6 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 4 ; <ptr> [#uses=1]94 %7 = load ptr, ptr %6, align 4 ; <ptr> [#uses=1]95 ret ptr %796 97bb5: ; preds = %entry98 ret ptr null99}100 101define internal fastcc ptr @gtequal_adj_neighbor(ptr nocapture %tree, i32 %d) nounwind readonly {102entry:103 %0 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 6 ; <ptr> [#uses=1]104 %1 = load ptr, ptr %0, align 4 ; <ptr> [#uses=4]105 %2 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 1 ; <ptr> [#uses=1]106 %3 = load i32, ptr %2, align 4 ; <i32> [#uses=2]107 %4 = icmp eq ptr %1, null ; <i1> [#uses=1]108 br i1 %4, label %bb3, label %bb109 110bb: ; preds = %entry111 %5 = call fastcc i32 @adj(i32 %d, i32 %3) nounwind ; <i32> [#uses=1]112 %6 = icmp eq i32 %5, 0 ; <i1> [#uses=1]113 br i1 %6, label %bb3, label %bb1114 115bb1: ; preds = %bb116 %7 = call fastcc ptr @gtequal_adj_neighbor(ptr %1, i32 %d) nounwind ; <ptr> [#uses=1]117 br label %bb3118 119bb3: ; preds = %bb1, %bb, %entry120 %q.0 = phi ptr [ %7, %bb1 ], [ %1, %bb ], [ %1, %entry ] ; <ptr> [#uses=4]121 %8 = icmp eq ptr %q.0, null ; <i1> [#uses=1]122 br i1 %8, label %bb7, label %bb4123 124bb4: ; preds = %bb3125 %9 = getelementptr %struct.quad_struct, ptr %q.0, i32 0, i32 0 ; <ptr> [#uses=1]126 %10 = load i32, ptr %9, align 4 ; <i32> [#uses=1]127 %11 = icmp eq i32 %10, 2 ; <i1> [#uses=1]128 br i1 %11, label %bb5, label %bb7129 130bb5: ; preds = %bb4131 %12 = call fastcc i32 @reflect(i32 %d, i32 %3) nounwind ; <i32> [#uses=1]132 %13 = call fastcc ptr @child(ptr %q.0, i32 %12) nounwind ; <ptr> [#uses=1]133 ret ptr %13134 135bb7: ; preds = %bb4, %bb3136 ret ptr %q.0137}138 139declare fastcc i32 @sum_adjacent(ptr nocapture, i32, i32, i32) nounwind readonly140 141define i32 @perimeter(ptr nocapture %tree, i32 %size) nounwind readonly {142entry:143 %0 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 0 ; <ptr> [#uses=1]144 %1 = load i32, ptr %0, align 4 ; <i32> [#uses=1]145 %2 = icmp eq i32 %1, 2 ; <i1> [#uses=1]146 br i1 %2, label %bb, label %bb2147 148bb: ; preds = %entry149 %3 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 4 ; <ptr> [#uses=1]150 %4 = load ptr, ptr %3, align 4 ; <ptr> [#uses=1]151 %5 = sdiv i32 %size, 2 ; <i32> [#uses=1]152 %6 = call i32 @perimeter(ptr %4, i32 %5) nounwind ; <i32> [#uses=1]153 %7 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 5 ; <ptr> [#uses=1]154 %8 = load ptr, ptr %7, align 4 ; <ptr> [#uses=1]155 %9 = sdiv i32 %size, 2 ; <i32> [#uses=1]156 %10 = call i32 @perimeter(ptr %8, i32 %9) nounwind ; <i32> [#uses=1]157 %11 = add i32 %10, %6 ; <i32> [#uses=1]158 %12 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 3 ; <ptr> [#uses=1]159 %13 = load ptr, ptr %12, align 4 ; <ptr> [#uses=1]160 %14 = sdiv i32 %size, 2 ; <i32> [#uses=1]161 %15 = call i32 @perimeter(ptr %13, i32 %14) nounwind ; <i32> [#uses=1]162 %16 = add i32 %15, %11 ; <i32> [#uses=1]163 %17 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 2 ; <ptr> [#uses=1]164 %18 = load ptr, ptr %17, align 4 ; <ptr> [#uses=1]165 %19 = sdiv i32 %size, 2 ; <i32> [#uses=1]166 %20 = call i32 @perimeter(ptr %18, i32 %19) nounwind ; <i32> [#uses=1]167 %21 = add i32 %20, %16 ; <i32> [#uses=1]168 ret i32 %21169 170bb2: ; preds = %entry171 %22 = getelementptr %struct.quad_struct, ptr %tree, i32 0, i32 0 ; <ptr> [#uses=1]172 %23 = load i32, ptr %22, align 4 ; <i32> [#uses=1]173 %24 = icmp eq i32 %23, 0 ; <i1> [#uses=1]174 br i1 %24, label %bb3, label %bb23175 176bb3: ; preds = %bb2177 %25 = call fastcc ptr @gtequal_adj_neighbor(ptr %tree, i32 0) nounwind ; <ptr> [#uses=4]178 %26 = icmp eq ptr %25, null ; <i1> [#uses=1]179 br i1 %26, label %bb8, label %bb4180 181bb4: ; preds = %bb3182 %27 = getelementptr %struct.quad_struct, ptr %25, i32 0, i32 0 ; <ptr> [#uses=1]183 %28 = load i32, ptr %27, align 4 ; <i32> [#uses=1]184 %29 = icmp eq i32 %28, 1 ; <i1> [#uses=1]185 br i1 %29, label %bb8, label %bb6186 187bb6: ; preds = %bb4188 %30 = getelementptr %struct.quad_struct, ptr %25, i32 0, i32 0 ; <ptr> [#uses=1]189 %31 = load i32, ptr %30, align 4 ; <i32> [#uses=1]190 %32 = icmp eq i32 %31, 2 ; <i1> [#uses=1]191 br i1 %32, label %bb7, label %bb8192 193bb7: ; preds = %bb6194 %33 = call fastcc i32 @sum_adjacent(ptr %25, i32 3, i32 2, i32 %size) nounwind ; <i32> [#uses=1]195 br label %bb8196 197bb8: ; preds = %bb7, %bb6, %bb4, %bb3198 %retval1.1 = phi i32 [ 0, %bb6 ], [ %33, %bb7 ], [ %size, %bb4 ], [ %size, %bb3 ] ; <i32> [#uses=3]199 %34 = call fastcc ptr @gtequal_adj_neighbor(ptr %tree, i32 1) nounwind ; <ptr> [#uses=4]200 %35 = icmp eq ptr %34, null ; <i1> [#uses=1]201 br i1 %35, label %bb10, label %bb9202 203bb9: ; preds = %bb8204 %36 = getelementptr %struct.quad_struct, ptr %34, i32 0, i32 0 ; <ptr> [#uses=1]205 %37 = load i32, ptr %36, align 4 ; <i32> [#uses=1]206 %38 = icmp eq i32 %37, 1 ; <i1> [#uses=1]207 br i1 %38, label %bb10, label %bb11208 209bb10: ; preds = %bb9, %bb8210 %39 = add i32 %retval1.1, %size ; <i32> [#uses=1]211 br label %bb13212 213bb11: ; preds = %bb9214 %40 = getelementptr %struct.quad_struct, ptr %34, i32 0, i32 0 ; <ptr> [#uses=1]215 %41 = load i32, ptr %40, align 4 ; <i32> [#uses=1]216 %42 = icmp eq i32 %41, 2 ; <i1> [#uses=1]217 br i1 %42, label %bb12, label %bb13218 219bb12: ; preds = %bb11220 %43 = call fastcc i32 @sum_adjacent(ptr %34, i32 2, i32 0, i32 %size) nounwind ; <i32> [#uses=1]221 %44 = add i32 %43, %retval1.1 ; <i32> [#uses=1]222 br label %bb13223 224bb13: ; preds = %bb12, %bb11, %bb10225 %retval1.2 = phi i32 [ %retval1.1, %bb11 ], [ %44, %bb12 ], [ %39, %bb10 ] ; <i32> [#uses=3]226 %45 = call fastcc ptr @gtequal_adj_neighbor(ptr %tree, i32 2) nounwind ; <ptr> [#uses=4]227 %46 = icmp eq ptr %45, null ; <i1> [#uses=1]228 br i1 %46, label %bb15, label %bb14229 230bb14: ; preds = %bb13231 %47 = getelementptr %struct.quad_struct, ptr %45, i32 0, i32 0 ; <ptr> [#uses=1]232 %48 = load i32, ptr %47, align 4 ; <i32> [#uses=1]233 %49 = icmp eq i32 %48, 1 ; <i1> [#uses=1]234 br i1 %49, label %bb15, label %bb16235 236bb15: ; preds = %bb14, %bb13237 %50 = add i32 %retval1.2, %size ; <i32> [#uses=1]238 br label %bb18239 240bb16: ; preds = %bb14241 %51 = getelementptr %struct.quad_struct, ptr %45, i32 0, i32 0 ; <ptr> [#uses=1]242 %52 = load i32, ptr %51, align 4 ; <i32> [#uses=1]243 %53 = icmp eq i32 %52, 2 ; <i1> [#uses=1]244 br i1 %53, label %bb17, label %bb18245 246bb17: ; preds = %bb16247 %54 = call fastcc i32 @sum_adjacent(ptr %45, i32 0, i32 1, i32 %size) nounwind ; <i32> [#uses=1]248 %55 = add i32 %54, %retval1.2 ; <i32> [#uses=1]249 br label %bb18250 251bb18: ; preds = %bb17, %bb16, %bb15252 %retval1.3 = phi i32 [ %retval1.2, %bb16 ], [ %55, %bb17 ], [ %50, %bb15 ] ; <i32> [#uses=3]253 %56 = call fastcc ptr @gtequal_adj_neighbor(ptr %tree, i32 3) nounwind ; <ptr> [#uses=4]254 %57 = icmp eq ptr %56, null ; <i1> [#uses=1]255 br i1 %57, label %bb20, label %bb19256 257bb19: ; preds = %bb18258 %58 = getelementptr %struct.quad_struct, ptr %56, i32 0, i32 0 ; <ptr> [#uses=1]259 %59 = load i32, ptr %58, align 4 ; <i32> [#uses=1]260 %60 = icmp eq i32 %59, 1 ; <i1> [#uses=1]261 br i1 %60, label %bb20, label %bb21262 263bb20: ; preds = %bb19, %bb18264 %61 = add i32 %retval1.3, %size ; <i32> [#uses=1]265 ret i32 %61266 267bb21: ; preds = %bb19268 %62 = getelementptr %struct.quad_struct, ptr %56, i32 0, i32 0 ; <ptr> [#uses=1]269 %63 = load i32, ptr %62, align 4 ; <i32> [#uses=1]270 %64 = icmp eq i32 %63, 2 ; <i1> [#uses=1]271 br i1 %64, label %bb22, label %bb23272 273bb22: ; preds = %bb21274 %65 = call fastcc i32 @sum_adjacent(ptr %56, i32 1, i32 3, i32 %size) nounwind ; <i32> [#uses=1]275 %66 = add i32 %65, %retval1.3 ; <i32> [#uses=1]276 ret i32 %66277 278bb23: ; preds = %bb21, %bb2279 %retval1.0 = phi i32 [ 0, %bb2 ], [ %retval1.3, %bb21 ] ; <i32> [#uses=1]280 ret i32 %retval1.0281}282 283declare i32 @main(i32, ptr nocapture) noreturn nounwind284 285declare i32 @printf(ptr, ...) nounwind286 287declare void @exit(i32) noreturn nounwind288 289declare fastcc i32 @CheckOutside(i32, i32) nounwind readnone290 291declare fastcc i32 @CheckIntersect(i32, i32, i32) nounwind readnone292 293declare ptr @MakeTree(i32, i32, i32, i32, i32, ptr, i32, i32) nounwind294