|  | ; Test use forward type references in function blocks. | 
|  |  | 
|  | ; RUN: %p2i -i %s --insts | FileCheck %s | 
|  | ; RUN: llvm-as < %s | pnacl-freeze | pnacl-bcdis -no-records \ | 
|  | ; RUN:              | FileCheck --check-prefix=DUMP %s | 
|  | ; RUN:   %p2i -i %s --args -notranslate -timing | \ | 
|  | ; RUN:   FileCheck --check-prefix=NOIR %s | 
|  |  | 
|  | define internal void @LoopCarriedDep() { | 
|  | b0: | 
|  | %v0 = add i32 1, 2 | 
|  | br label %b1 | 
|  | b1: | 
|  | %v1 = phi i32 [%v0, %b0], [%v2, %b1] | 
|  | %v2 = add i32 %v1, 1 | 
|  | br label %b1 | 
|  | } | 
|  |  | 
|  | ; CHECK:      define internal void @LoopCarriedDep() { | 
|  | ; CHECK-NEXT: b0: | 
|  | ; CHECK-NEXT:   %v0 = add i32 1, 2 | 
|  | ; CHECK-NEXT:   br label %b1 | 
|  | ; CHECK-NEXT: b1: | 
|  | ; CHECK-NEXT:   %v1 = phi i32 [ %v0, %b0 ], [ %v2, %b1 ] | 
|  | ; CHECK-NEXT:   %v2 = add i32 %v1, 1 | 
|  | ; CHECK-NEXT:   br label %b1 | 
|  | ; CHECK-NEXT: } | 
|  |  | 
|  | ; Snippet of bitcode objdump with forward type reference (see "declare"). | 
|  | ; DUMP:        function void @f0() {  // BlockID = 12 | 
|  | ; DUMP-NEXT:     blocks 2; | 
|  | ; DUMP-NEXT:     constants {  // BlockID = 11 | 
|  | ; DUMP-NEXT:       i32: <@a0> | 
|  | ; DUMP-NEXT:         %c0 = i32 1; <@a1> | 
|  | ; DUMP-NEXT:         %c1 = i32 2; <@a1> | 
|  | ; DUMP-NEXT:       } | 
|  | ; DUMP-NEXT:   %b0: | 
|  | ; DUMP-NEXT:     %v0 = add i32 %c0, %c1; <@a1> | 
|  | ; DUMP-NEXT:     br label %b1; | 
|  | ; DUMP-NEXT:   %b1: | 
|  | ; DUMP-NEXT:     declare i32 %v2; <@a6> | 
|  | ; DUMP-NEXT:     %v1 = phi i32 [%v0, %b0], [%v2, %b1]; | 
|  | ; DUMP-NEXT:     %v2 = add i32 %v1, %c0; <@a1> | 
|  | ; DUMP-NEXT:     br label %b1; | 
|  | ; DUMP-NEXT:   } | 
|  |  | 
|  | define internal void @BackBranch(i32 %p0) { | 
|  | b0: | 
|  | br label %b4 | 
|  | b1: | 
|  | %v0 = add i32 %p0, %v3 | 
|  | br label %b6 | 
|  | b2: | 
|  | %v1 = add i32 %p0, %v4 | 
|  | br label %b6 | 
|  | b3: | 
|  | %v2 = add i32 %p0, %v3 ; No forward declare, already done! | 
|  | br label %b6 | 
|  | b4: | 
|  | %v3 = add i32 %p0, %p0 | 
|  | br i1 1, label %b1, label %b5 | 
|  | b5: | 
|  | %v4 = add i32 %v3, %p0 | 
|  | br i1 1, label %b2, label %b3 | 
|  | b6: | 
|  | ret void | 
|  | } | 
|  |  | 
|  | ; CHECK:      define internal void @BackBranch(i32 %p0) { | 
|  | ; CHECK-NEXT: b0: | 
|  | ; CHECK-NEXT:   br label %b4 | 
|  | ; CHECK-NEXT: b1: | 
|  | ; CHECK-NEXT:   %v0 = add i32 %p0, %v3 | 
|  | ; CHECK-NEXT:   br label %b6 | 
|  | ; CHECK-NEXT: b4: | 
|  | ; CHECK-NEXT:   %v3 = add i32 %p0, %p0 | 
|  | ; CHECK-NEXT:   br label %b1 | 
|  | ; CHECK-NEXT: b6: | 
|  | ; CHECK-NEXT:   ret void | 
|  | ; CHECK-NEXT: } | 
|  |  | 
|  | ; Snippet of bitcode objdump with forward type references (see "declare"). | 
|  | ; DUMP:        function void @f1(i32 %p0) {  // BlockID = 12 | 
|  | ; DUMP-NEXT:     blocks 7; | 
|  | ; DUMP-NEXT:     constants {  // BlockID = 11 | 
|  | ; DUMP-NEXT:       i1: <@a0> | 
|  | ; DUMP-NEXT:         %c0 = i1 1; <@a1> | 
|  | ; DUMP-NEXT:       } | 
|  | ; DUMP-NEXT:   %b0: | 
|  | ; DUMP-NEXT:     br label %b4; | 
|  | ; DUMP-NEXT:   %b1: | 
|  | ; DUMP-NEXT:     declare i32 %v3; <@a6> | 
|  | ; DUMP-NEXT:     %v0 = add i32 %p0, %v3; <@a1> | 
|  | ; DUMP-NEXT:     br label %b6; | 
|  | ; DUMP-NEXT:   %b2: | 
|  | ; DUMP-NEXT:     declare i32 %v4; <@a6> | 
|  | ; DUMP-NEXT:     %v1 = add i32 %p0, %v4; <@a1> | 
|  | ; DUMP-NEXT:     br label %b6; | 
|  | ; DUMP-NEXT:   %b3: | 
|  | ; DUMP-NEXT:     %v2 = add i32 %p0, %v3; <@a1> | 
|  | ; DUMP-NEXT:     br label %b6; | 
|  | ; DUMP-NEXT:   %b4: | 
|  | ; DUMP-NEXT:     %v3 = add i32 %p0, %p0; <@a1> | 
|  | ; DUMP-NEXT:     br i1 %c0, label %b1, label %b5; | 
|  | ; DUMP-NEXT:   %b5: | 
|  | ; DUMP-NEXT:     %v4 = add i32 %v3, %p0; <@a1> | 
|  | ; DUMP-NEXT:     br i1 %c0, label %b2, label %b3; | 
|  | ; DUMP-NEXT:   %b6: | 
|  | ; DUMP-NEXT:     ret void; <@a3> | 
|  | ; DUMP-NEXT:   } | 
|  |  | 
|  | ; NOIR: Total across all functions |