• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -basic-aa -gvn -S | FileCheck %s
2
3	%struct.anon = type { i32 (i32, i32, i32)*, i32, i32, [3 x i32], i8*, i8*, i8* }
4@debug = external constant i32		; <i32*> [#uses=0]
5@counters = external constant i32		; <i32*> [#uses=1]
6@trialx = external global [17 x i32]		; <[17 x i32]*> [#uses=1]
7@dummy1 = external global [7 x i32]		; <[7 x i32]*> [#uses=0]
8@dummy2 = external global [4 x i32]		; <[4 x i32]*> [#uses=0]
9@unacceptable = external global i32		; <i32*> [#uses=0]
10@isa = external global [13 x %struct.anon]		; <[13 x %struct.anon]*> [#uses=3]
11@.str = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
12@.str1 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
13@.str2 = external constant [1 x i8]		; <[1 x i8]*> [#uses=0]
14@.str3 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
15@.str4 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
16@.str5 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
17@.str6 = external constant [2 x i8]		; <[2 x i8]*> [#uses=0]
18@.str7 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
19@.str8 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
20@.str9 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
21@.str10 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
22@.str11 = external constant [2 x i8]		; <[2 x i8]*> [#uses=0]
23@.str12 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
24@.str13 = external constant [2 x i8]		; <[2 x i8]*> [#uses=0]
25@.str14 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
26@.str15 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
27@.str16 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
28@.str17 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
29@.str18 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
30@.str19 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
31@.str20 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
32@.str21 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
33@.str22 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
34@.str23 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
35@.str24 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
36@.str25 = external constant [6 x i8]		; <[6 x i8]*> [#uses=0]
37@.str26 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
38@.str27 = external constant [6 x i8]		; <[6 x i8]*> [#uses=0]
39@r = external global [17 x i32]		; <[17 x i32]*> [#uses=0]
40@.str28 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
41@.str29 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
42@pgm = external global [5 x { i32, [3 x i32] }]		; <[5 x { i32, [3 x i32] }]*> [#uses=4]
43@.str30 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
44@.str31 = external constant [13 x i8]		; <[13 x i8]*> [#uses=0]
45@.str32 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
46@.str33 = external constant [4 x i8]		; <[4 x i8]*> [#uses=0]
47@.str34 = external constant [20 x i8]		; <[20 x i8]*> [#uses=0]
48@numi = external global i32		; <i32*> [#uses=7]
49@.str35 = external constant [10 x i8]		; <[10 x i8]*> [#uses=0]
50@counter = external global [5 x i32]		; <[5 x i32]*> [#uses=2]
51@itrialx.2510 = external global i32		; <i32*> [#uses=0]
52@.str36 = external constant [43 x i8]		; <[43 x i8]*> [#uses=0]
53@.str37 = external constant [42 x i8]		; <[42 x i8]*> [#uses=0]
54@corr_result = external global i32		; <i32*> [#uses=0]
55@.str38 = external constant [3 x i8]		; <[3 x i8]*> [#uses=0]
56@.str39 = external constant [5 x i8]		; <[5 x i8]*> [#uses=0]
57@.str40 = external constant [47 x i8]		; <[47 x i8]*> [#uses=0]
58@correct_result = external global [17 x i32]		; <[17 x i32]*> [#uses=1]
59@.str41 = external constant [46 x i8]		; <[46 x i8]*> [#uses=0]
60@.str42 = external constant [32 x i8]		; <[32 x i8]*> [#uses=0]
61@.str43 = external constant [44 x i8]		; <[44 x i8]*> [#uses=1]
62@.str44 = external constant [21 x i8]		; <[21 x i8]*> [#uses=1]
63@.str45 = external constant [12 x i8]		; <[12 x i8]*> [#uses=1]
64@.str46 = external constant [5 x i8]		; <[5 x i8]*> [#uses=1]
65@.str47 = external constant [12 x i8]		; <[12 x i8]*> [#uses=1]
66
67declare i32 @neg(i32, i32, i32)
68
69declare i32 @Not(i32, i32, i32)
70
71declare i32 @pop(i32, i32, i32)
72
73declare i32 @nlz(i32, i32, i32)
74
75declare i32 @rev(i32, i32, i32)
76
77declare i32 @add(i32, i32, i32)
78
79declare i32 @sub(i32, i32, i32)
80
81declare i32 @mul(i32, i32, i32)
82
83declare i32 @divide(i32, i32, i32)
84
85declare i32 @divu(i32, i32, i32)
86
87declare i32 @And(i32, i32, i32)
88
89declare i32 @Or(i32, i32, i32)
90
91declare i32 @Xor(i32, i32, i32)
92
93declare i32 @rotl(i32, i32, i32)
94
95declare i32 @shl(i32, i32, i32)
96
97declare i32 @shr(i32, i32, i32)
98
99declare i32 @shrs(i32, i32, i32)
100
101declare i32 @cmpeq(i32, i32, i32)
102
103declare i32 @cmplt(i32, i32, i32)
104
105declare i32 @cmpltu(i32, i32, i32)
106
107declare i32 @seleq(i32, i32, i32)
108
109declare i32 @sellt(i32, i32, i32)
110
111declare i32 @selle(i32, i32, i32)
112
113declare void @print_expr(i32)
114
115declare i32 @printf(i8*, ...)
116
117declare i32 @putchar(i32)
118
119declare void @print_pgm()
120
121declare void @simulate_one_instruction(i32)
122
123declare i32 @check(i32)
124
125declare i32 @puts(i8*)
126
127declare void @fix_operands(i32)
128
129declare void @abort()
130
131declare i32 @increment()
132
133declare i32 @search()
134
135define i32 @main(i32 %argc, i8** %argv) {
136entry:
137	%argc_addr = alloca i32		; <i32*> [#uses=1]
138	%argv_addr = alloca i8**		; <i8***> [#uses=1]
139	%retval = alloca i32, align 4		; <i32*> [#uses=2]
140	%tmp = alloca i32, align 4		; <i32*> [#uses=2]
141	%i = alloca i32, align 4		; <i32*> [#uses=21]
142	%num_sol = alloca i32, align 4		; <i32*> [#uses=4]
143	%total = alloca i32, align 4		; <i32*> [#uses=4]
144	%"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
145	store i32 %argc, i32* %argc_addr
146	store i8** %argv, i8*** %argv_addr
147	store i32 0, i32* %num_sol
148	store i32 1, i32* @numi
149	br label %bb91
150
151bb:		; preds = %cond_next97
152	%tmp1 = load i32, i32* @numi		; <i32> [#uses=1]
153	%tmp2 = getelementptr [44 x i8], [44 x i8]* @.str43, i32 0, i32 0		; <i8*> [#uses=1]
154	%tmp3 = call i32 (i8*, ...) @printf( i8* %tmp2, i32 %tmp1 )		; <i32> [#uses=0]
155	store i32 0, i32* %i
156	br label %bb13
157
158bb4:		; preds = %bb13
159	%tmp5 = load i32, i32* %i		; <i32> [#uses=1]
160	%tmp6 = load i32, i32* %i		; <i32> [#uses=1]
161	%tmp7 = getelementptr [17 x i32], [17 x i32]* @trialx, i32 0, i32 %tmp6		; <i32*> [#uses=1]
162	%tmp8 = load i32, i32* %tmp7		; <i32> [#uses=1]
163	%tmp9 = call i32 @userfun( i32 %tmp8 )		; <i32> [#uses=1]
164	%tmp10 = getelementptr [17 x i32], [17 x i32]* @correct_result, i32 0, i32 %tmp5		; <i32*> [#uses=1]
165	store i32 %tmp9, i32* %tmp10
166	%tmp11 = load i32, i32* %i		; <i32> [#uses=1]
167	%tmp12 = add i32 %tmp11, 1		; <i32> [#uses=1]
168	store i32 %tmp12, i32* %i
169	br label %bb13
170
171bb13:		; preds = %bb4, %bb
172	%tmp14 = load i32, i32* %i		; <i32> [#uses=1]
173	%tmp15 = icmp sle i32 %tmp14, 16		; <i1> [#uses=1]
174	%tmp1516 = zext i1 %tmp15 to i32		; <i32> [#uses=1]
175	%toBool = icmp ne i32 %tmp1516, 0		; <i1> [#uses=1]
176	br i1 %toBool, label %bb4, label %bb17
177
178bb17:		; preds = %bb13
179	store i32 0, i32* %i
180	br label %bb49
181
182bb18:		; preds = %bb49
183	%tmp19 = load i32, i32* %i		; <i32> [#uses=1]
184	%tmp20 = getelementptr [5 x { i32, [3 x i32] }], [5 x { i32, [3 x i32] }]* @pgm, i32 0, i32 %tmp19		; <{ i32, [3 x i32] }*> [#uses=1]
185	%tmp21 = getelementptr { i32, [3 x i32] }, { i32, [3 x i32] }* %tmp20, i32 0, i32 0		; <i32*> [#uses=1]
186	store i32 0, i32* %tmp21
187	%tmp22 = load i32, i32* %i		; <i32> [#uses=1]
188	%tmp23 = getelementptr [13 x %struct.anon], [13 x %struct.anon]* @isa, i32 0, i32 0		; <%struct.anon*> [#uses=1]
189	%tmp24 = getelementptr %struct.anon, %struct.anon* %tmp23, i32 0, i32 3		; <[3 x i32]*> [#uses=1]
190	%tmp25 = getelementptr [3 x i32], [3 x i32]* %tmp24, i32 0, i32 0		; <i32*> [#uses=1]
191	%tmp26 = load i32, i32* %tmp25		; <i32> [#uses=1]
192	%tmp27 = getelementptr [5 x { i32, [3 x i32] }], [5 x { i32, [3 x i32] }]* @pgm, i32 0, i32 %tmp22		; <{ i32, [3 x i32] }*> [#uses=1]
193	%tmp28 = getelementptr { i32, [3 x i32] }, { i32, [3 x i32] }* %tmp27, i32 0, i32 1		; <[3 x i32]*> [#uses=1]
194	%tmp29 = getelementptr [3 x i32], [3 x i32]* %tmp28, i32 0, i32 0		; <i32*> [#uses=1]
195	store i32 %tmp26, i32* %tmp29
196	%tmp30 = load i32, i32* %i		; <i32> [#uses=1]
197	%tmp31 = getelementptr [13 x %struct.anon], [13 x %struct.anon]* @isa, i32 0, i32 0		; <%struct.anon*> [#uses=1]
198	%tmp32 = getelementptr %struct.anon, %struct.anon* %tmp31, i32 0, i32 3		; <[3 x i32]*> [#uses=1]
199	%tmp33 = getelementptr [3 x i32], [3 x i32]* %tmp32, i32 0, i32 1		; <i32*> [#uses=1]
200	%tmp34 = load i32, i32* %tmp33		; <i32> [#uses=1]
201	%tmp35 = getelementptr [5 x { i32, [3 x i32] }], [5 x { i32, [3 x i32] }]* @pgm, i32 0, i32 %tmp30		; <{ i32, [3 x i32] }*> [#uses=1]
202	%tmp36 = getelementptr { i32, [3 x i32] }, { i32, [3 x i32] }* %tmp35, i32 0, i32 1		; <[3 x i32]*> [#uses=1]
203	%tmp37 = getelementptr [3 x i32], [3 x i32]* %tmp36, i32 0, i32 1		; <i32*> [#uses=1]
204	store i32 %tmp34, i32* %tmp37
205	%tmp38 = load i32, i32* %i		; <i32> [#uses=1]
206	%tmp39 = getelementptr [13 x %struct.anon], [13 x %struct.anon]* @isa, i32 0, i32 0		; <%struct.anon*> [#uses=1]
207	%tmp40 = getelementptr %struct.anon, %struct.anon* %tmp39, i32 0, i32 3		; <[3 x i32]*> [#uses=1]
208	%tmp41 = getelementptr [3 x i32], [3 x i32]* %tmp40, i32 0, i32 2		; <i32*> [#uses=1]
209	%tmp42 = load i32, i32* %tmp41		; <i32> [#uses=1]
210	%tmp43 = getelementptr [5 x { i32, [3 x i32] }], [5 x { i32, [3 x i32] }]* @pgm, i32 0, i32 %tmp38		; <{ i32, [3 x i32] }*> [#uses=1]
211	%tmp44 = getelementptr { i32, [3 x i32] }, { i32, [3 x i32] }* %tmp43, i32 0, i32 1		; <[3 x i32]*> [#uses=1]
212	%tmp45 = getelementptr [3 x i32], [3 x i32]* %tmp44, i32 0, i32 2		; <i32*> [#uses=1]
213	store i32 %tmp42, i32* %tmp45
214	%tmp46 = load i32, i32* %i		; <i32> [#uses=1]
215	call void @fix_operands( i32 %tmp46 )
216	%tmp47 = load i32, i32* %i		; <i32> [#uses=1]
217; CHECK: %tmp47 = phi i32 [ %tmp48, %bb18 ], [ 0, %bb17 ]
218	%tmp48 = add i32 %tmp47, 1		; <i32> [#uses=1]
219	store i32 %tmp48, i32* %i
220	br label %bb49
221
222bb49:		; preds = %bb18, %bb17
223	%tmp50 = load i32, i32* @numi		; <i32> [#uses=1]
224	%tmp51 = load i32, i32* %i		; <i32> [#uses=1]
225	%tmp52 = icmp slt i32 %tmp51, %tmp50		; <i1> [#uses=1]
226	%tmp5253 = zext i1 %tmp52 to i32		; <i32> [#uses=1]
227	%toBool54 = icmp ne i32 %tmp5253, 0		; <i1> [#uses=1]
228	br i1 %toBool54, label %bb18, label %bb55
229
230bb55:		; preds = %bb49
231	%tmp56 = call i32 @search( )		; <i32> [#uses=1]
232	store i32 %tmp56, i32* %num_sol
233	%tmp57 = getelementptr [21 x i8], [21 x i8]* @.str44, i32 0, i32 0		; <i8*> [#uses=1]
234	%tmp58 = load i32, i32* %num_sol		; <i32> [#uses=1]
235	%tmp59 = call i32 (i8*, ...) @printf( i8* %tmp57, i32 %tmp58 )		; <i32> [#uses=0]
236	%tmp60 = load i32, i32* @counters		; <i32> [#uses=1]
237	%tmp61 = icmp ne i32 %tmp60, 0		; <i1> [#uses=1]
238	%tmp6162 = zext i1 %tmp61 to i32		; <i32> [#uses=1]
239	%toBool63 = icmp ne i32 %tmp6162, 0		; <i1> [#uses=1]
240	br i1 %toBool63, label %cond_true, label %cond_next
241
242cond_true:		; preds = %bb55
243	store i32 0, i32* %total
244	%tmp64 = getelementptr [12 x i8], [12 x i8]* @.str45, i32 0, i32 0		; <i8*> [#uses=1]
245	%tmp65 = call i32 (i8*, ...) @printf( i8* %tmp64 )		; <i32> [#uses=0]
246	store i32 0, i32* %i
247	br label %bb79
248
249bb66:		; preds = %bb79
250	%tmp67 = load i32, i32* %i		; <i32> [#uses=1]
251	%tmp68 = getelementptr [5 x i32], [5 x i32]* @counter, i32 0, i32 %tmp67		; <i32*> [#uses=1]
252	%tmp69 = load i32, i32* %tmp68		; <i32> [#uses=1]
253	%tmp70 = getelementptr [5 x i8], [5 x i8]* @.str46, i32 0, i32 0		; <i8*> [#uses=1]
254	%tmp71 = call i32 (i8*, ...) @printf( i8* %tmp70, i32 %tmp69 )		; <i32> [#uses=0]
255	%tmp72 = load i32, i32* %i		; <i32> [#uses=1]
256	%tmp73 = getelementptr [5 x i32], [5 x i32]* @counter, i32 0, i32 %tmp72		; <i32*> [#uses=1]
257	%tmp74 = load i32, i32* %tmp73		; <i32> [#uses=1]
258	%tmp75 = load i32, i32* %total		; <i32> [#uses=1]
259	%tmp76 = add i32 %tmp74, %tmp75		; <i32> [#uses=1]
260	store i32 %tmp76, i32* %total
261	%tmp77 = load i32, i32* %i		; <i32> [#uses=1]
262	%tmp78 = add i32 %tmp77, 1		; <i32> [#uses=1]
263	store i32 %tmp78, i32* %i
264	br label %bb79
265
266bb79:		; preds = %bb66, %cond_true
267	%tmp80 = load i32, i32* @numi		; <i32> [#uses=1]
268	%tmp81 = load i32, i32* %i		; <i32> [#uses=1]
269	%tmp82 = icmp slt i32 %tmp81, %tmp80		; <i1> [#uses=1]
270	%tmp8283 = zext i1 %tmp82 to i32		; <i32> [#uses=1]
271	%toBool84 = icmp ne i32 %tmp8283, 0		; <i1> [#uses=1]
272	br i1 %toBool84, label %bb66, label %bb85
273
274bb85:		; preds = %bb79
275	%tmp86 = getelementptr [12 x i8], [12 x i8]* @.str47, i32 0, i32 0		; <i8*> [#uses=1]
276	%tmp87 = load i32, i32* %total		; <i32> [#uses=1]
277	%tmp88 = call i32 (i8*, ...) @printf( i8* %tmp86, i32 %tmp87 )		; <i32> [#uses=0]
278	br label %cond_next
279
280cond_next:		; preds = %bb85, %bb55
281	%tmp89 = load i32, i32* @numi		; <i32> [#uses=1]
282	%tmp90 = add i32 %tmp89, 1		; <i32> [#uses=1]
283	store i32 %tmp90, i32* @numi
284	br label %bb91
285
286bb91:		; preds = %cond_next, %entry
287	%tmp92 = load i32, i32* @numi		; <i32> [#uses=1]
288	%tmp93 = icmp sgt i32 %tmp92, 5		; <i1> [#uses=1]
289	%tmp9394 = zext i1 %tmp93 to i32		; <i32> [#uses=1]
290	%toBool95 = icmp ne i32 %tmp9394, 0		; <i1> [#uses=1]
291	br i1 %toBool95, label %cond_true96, label %cond_next97
292
293cond_true96:		; preds = %bb91
294	br label %bb102
295
296cond_next97:		; preds = %bb91
297	%tmp98 = load i32, i32* %num_sol		; <i32> [#uses=1]
298	%tmp99 = icmp eq i32 %tmp98, 0		; <i1> [#uses=1]
299	%tmp99100 = zext i1 %tmp99 to i32		; <i32> [#uses=1]
300	%toBool101 = icmp ne i32 %tmp99100, 0		; <i1> [#uses=1]
301	br i1 %toBool101, label %bb, label %bb102
302
303bb102:		; preds = %cond_next97, %cond_true96
304	store i32 0, i32* %tmp
305	%tmp103 = load i32, i32* %tmp		; <i32> [#uses=1]
306	store i32 %tmp103, i32* %retval
307	br label %return
308
309return:		; preds = %bb102
310	%retval104 = load i32, i32* %retval		; <i32> [#uses=1]
311	ret i32 %retval104
312}
313
314declare i32 @userfun(i32)
315