1 // RUN: rm -f %t
2 // RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpDominators %s > %t 2>&1
3 // RUN: FileCheck --input-file=%t %s
4
5 // Test the DominatorsTree implementation with various control flows
test1()6 int test1()
7 {
8 int x = 6;
9 int y = x/2;
10 int z;
11
12 while(y > 0) {
13 if(y < x) {
14 x = x/y;
15 y = y-1;
16 }else{
17 z = x - y;
18 }
19 x = x - 1;
20 x = x - 1;
21 }
22 z = x+y;
23 z = 3;
24 return 0;
25 }
26
27 // CHECK: Immediate dominance tree (Node#,IDom#):
28 // CHECK: (0,1)
29 // CHECK: (1,7)
30 // CHECK: (2,3)
31 // CHECK: (3,6)
32 // CHECK: (4,6)
33 // CHECK: (5,6)
34 // CHECK: (6,7)
35 // CHECK: (7,8)
36 // CHECK: (8,9)
37 // CHECK: (9,9)
38
test2()39 int test2()
40 {
41 int x,y,z;
42
43 x = 10; y = 100;
44 if(x > 0){
45 y = 1;
46 }else{
47 while(x<=0){
48 x++;
49 y++;
50 }
51 }
52 z = y;
53
54 return 0;
55 }
56
57 // CHECK: Immediate dominance tree (Node#,IDom#):
58 // CHECK: (0,1)
59 // CHECK: (1,6)
60 // CHECK: (2,3)
61 // CHECK: (3,4)
62 // CHECK: (4,6)
63 // CHECK: (5,6)
64 // CHECK: (6,7)
65 // CHECK: (7,7)
66
test3()67 int test3()
68 {
69 int x,y,z;
70
71 x = y = z = 1;
72 if(x>0) {
73 while(x>=0){
74 while(y>=x) {
75 x = x-1;
76 y = y/2;
77 }
78 }
79 }
80 z = y;
81
82 return 0;
83 }
84
85 // CHECK: Immediate dominance tree (Node#,IDom#):
86 // CHECK: (0,1)
87 // CHECK: (1,7)
88 // CHECK: (2,5)
89 // CHECK: (3,4)
90 // CHECK: (4,5)
91 // CHECK: (5,6)
92 // CHECK: (6,7)
93 // CHECK: (7,8)
94 // CHECK: (8,8)
95
test4()96 int test4()
97 {
98 int y = 3;
99 while(y > 0) {
100 if(y < 3) {
101 while(y>0)
102 y ++;
103 }else{
104 while(y<10)
105 y ++;
106 }
107 }
108 return 0;
109 }
110
111 // CHECK: Immediate dominance tree (Node#,IDom#):
112 // CHECK: (0,1)
113 // CHECK: (1,10)
114 // CHECK: (2,9)
115 // CHECK: (3,4)
116 // CHECK: (4,5)
117 // CHECK: (5,9)
118 // CHECK: (6,7)
119 // CHECK: (7,8)
120 // CHECK: (8,9)
121 // CHECK: (9,10)
122 // CHECK: (10,11)
123 // CHECK: (11,12)
124 // CHECK: (12,12)
125
test5()126 int test5()
127 {
128 int x,y,z,a,b,c;
129 x = 1;
130 y = 2;
131 z = 3;
132 a = 4;
133 b = 5;
134 c = 6;
135 if ( x < 10 ) {
136 if ( y < 10 ) {
137 if ( z < 10 ) {
138 x = 4;
139 } else {
140 x = 5;
141 }
142 a = 10;
143 } else {
144 x = 6;
145 }
146 b = 10;
147 } else {
148 x = 7;
149 }
150 c = 11;
151 return 0;
152 }
153
154 // CHECK: Immediate dominance tree (Node#,IDom#):
155 // CHECK: (0,1)
156 // CHECK: (1,10)
157 // CHECK: (2,10)
158 // CHECK: (3,9)
159 // CHECK: (4,9)
160 // CHECK: (5,8)
161 // CHECK: (6,8)
162 // CHECK: (7,8)
163 // CHECK: (8,9)
164 // CHECK: (9,10)
165 // CHECK: (10,11)
166 // CHECK: (11,11)
167
168
169