• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; Test use forward type references in function blocks.
2
3; RUN: %p2i -i %s --insts | FileCheck %s
4; RUN: llvm-as < %s | pnacl-freeze | pnacl-bcdis -no-records \
5; RUN:              | FileCheck --check-prefix=DUMP %s
6; RUN:   %p2i -i %s --args -notranslate -timing | \
7; RUN:   FileCheck --check-prefix=NOIR %s
8
9define internal void @LoopCarriedDep() {
10b0:
11  %v0 = add i32 1, 2
12  br label %b1
13b1:
14  %v1 = phi i32 [%v0, %b0], [%v2, %b1]
15  %v2 = add i32 %v1, 1
16  br label %b1
17}
18
19; CHECK:      define internal void @LoopCarriedDep() {
20; CHECK-NEXT: b0:
21; CHECK-NEXT:   %v0 = add i32 1, 2
22; CHECK-NEXT:   br label %b1
23; CHECK-NEXT: b1:
24; CHECK-NEXT:   %v1 = phi i32 [ %v0, %b0 ], [ %v2, %b1 ]
25; CHECK-NEXT:   %v2 = add i32 %v1, 1
26; CHECK-NEXT:   br label %b1
27; CHECK-NEXT: }
28
29; Snippet of bitcode objdump with forward type reference (see "declare").
30; DUMP:        function void @f0() {  // BlockID = 12
31; DUMP-NEXT:     blocks 2;
32; DUMP-NEXT:     constants {  // BlockID = 11
33; DUMP-NEXT:       i32: <@a0>
34; DUMP-NEXT:         %c0 = i32 1; <@a1>
35; DUMP-NEXT:         %c1 = i32 2; <@a1>
36; DUMP-NEXT:       }
37; DUMP-NEXT:   %b0:
38; DUMP-NEXT:     %v0 = add i32 %c0, %c1; <@a1>
39; DUMP-NEXT:     br label %b1;
40; DUMP-NEXT:   %b1:
41; DUMP-NEXT:     declare i32 %v2; <@a6>
42; DUMP-NEXT:     %v1 = phi i32 [%v0, %b0], [%v2, %b1];
43; DUMP-NEXT:     %v2 = add i32 %v1, %c0; <@a1>
44; DUMP-NEXT:     br label %b1;
45; DUMP-NEXT:   }
46
47define internal void @BackBranch(i32 %p0) {
48b0:
49  br label %b4
50b1:
51  %v0 = add i32 %p0, %v3
52  br label %b6
53b2:
54  %v1 = add i32 %p0, %v4
55  br label %b6
56b3:
57  %v2 = add i32 %p0, %v3 ; No forward declare, already done!
58  br label %b6
59b4:
60  %v3 = add i32 %p0, %p0
61  br i1 1, label %b1, label %b5
62b5:
63  %v4 = add i32 %v3, %p0
64  br i1 1, label %b2, label %b3
65b6:
66  ret void
67}
68
69; CHECK:      define internal void @BackBranch(i32 %p0) {
70; CHECK-NEXT: b0:
71; CHECK-NEXT:   br label %b4
72; CHECK-NEXT: b1:
73; CHECK-NEXT:   %v0 = add i32 %p0, %v3
74; CHECK-NEXT:   br label %b6
75; CHECK-NEXT: b4:
76; CHECK-NEXT:   %v3 = add i32 %p0, %p0
77; CHECK-NEXT:   br label %b1
78; CHECK-NEXT: b6:
79; CHECK-NEXT:   ret void
80; CHECK-NEXT: }
81
82; Snippet of bitcode objdump with forward type references (see "declare").
83; DUMP:        function void @f1(i32 %p0) {  // BlockID = 12
84; DUMP-NEXT:     blocks 7;
85; DUMP-NEXT:     constants {  // BlockID = 11
86; DUMP-NEXT:       i1: <@a0>
87; DUMP-NEXT:         %c0 = i1 1; <@a1>
88; DUMP-NEXT:       }
89; DUMP-NEXT:   %b0:
90; DUMP-NEXT:     br label %b4;
91; DUMP-NEXT:   %b1:
92; DUMP-NEXT:     declare i32 %v3; <@a6>
93; DUMP-NEXT:     %v0 = add i32 %p0, %v3; <@a1>
94; DUMP-NEXT:     br label %b6;
95; DUMP-NEXT:   %b2:
96; DUMP-NEXT:     declare i32 %v4; <@a6>
97; DUMP-NEXT:     %v1 = add i32 %p0, %v4; <@a1>
98; DUMP-NEXT:     br label %b6;
99; DUMP-NEXT:   %b3:
100; DUMP-NEXT:     %v2 = add i32 %p0, %v3; <@a1>
101; DUMP-NEXT:     br label %b6;
102; DUMP-NEXT:   %b4:
103; DUMP-NEXT:     %v3 = add i32 %p0, %p0; <@a1>
104; DUMP-NEXT:     br i1 %c0, label %b1, label %b5;
105; DUMP-NEXT:   %b5:
106; DUMP-NEXT:     %v4 = add i32 %v3, %p0; <@a1>
107; DUMP-NEXT:     br i1 %c0, label %b2, label %b3;
108; DUMP-NEXT:   %b6:
109; DUMP-NEXT:     ret void; <@a3>
110; DUMP-NEXT:   }
111
112; NOIR: Total across all functions
113