[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / Hexagon / regscavenger_fail_hwloop.ll
blob2db79424d915fe57a8fb9d48d55d3d92d1b84349
1 ; RUN: llc -march=hexagon < %s
2 ; REQUIRES: asserts
4 ; This test used to fail with;
5 ;  Assertion `ScavengingFrameIndex >= 0 && "Cannot scavenge register without an
6 ;             emergency spill slot!"' failed.
8 target triple = "hexagon-unknown-linux-gnu"
10 ; Function Attrs: nounwind
11 define hidden fastcc void @f0(i8* nocapture %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i8* nocapture %a5) #0 {
12 b0:
13   %v0 = add i32 %a3, -4
14   %v1 = icmp ult i32 %v0, %a1
15   %v2 = add i32 %a2, -2
16   br i1 %v1, label %b2, label %b1
18 b1:                                               ; preds = %b0
19   %v3 = add i32 %a4, -9
20   %v4 = icmp ugt i32 %v2, %v3
21   br i1 %v4, label %b2, label %b3
23 b2:                                               ; preds = %b1, %b0
24   %v5 = add nsw i32 %a4, -1
25   %v6 = add nsw i32 %a3, -1
26   %v7 = add i32 %a2, 1
27   %v8 = add i32 %a2, 2
28   %v9 = icmp slt i32 %v7, 0
29   %v10 = icmp slt i32 %v7, %a4
30   %v11 = select i1 %v10, i32 %v7, i32 %v5
31   %v12 = select i1 %v9, i32 0, i32 %v11
32   %v13 = mul i32 %v12, %a3
33   %v14 = add i32 %a2, -1
34   %v15 = icmp slt i32 %v2, 0
35   %v16 = icmp slt i32 %v2, %a4
36   %v17 = select i1 %v16, i32 %v2, i32 %v5
37   %v18 = select i1 %v15, i32 0, i32 %v17
38   %v19 = mul i32 %v18, %a3
39   %v20 = icmp slt i32 %v14, 0
40   %v21 = icmp slt i32 %v14, %a4
41   %v22 = select i1 %v21, i32 %v14, i32 %v5
42   %v23 = select i1 %v20, i32 0, i32 %v22
43   %v24 = mul i32 %v23, %a3
44   %v25 = icmp slt i32 %a2, 0
45   %v26 = icmp slt i32 %a2, %a4
46   %v27 = select i1 %v26, i32 %a2, i32 %v5
47   %v28 = select i1 %v25, i32 0, i32 %v27
48   %v29 = mul i32 %v28, %a3
49   %v30 = add i32 %a2, 3
50   %v31 = icmp slt i32 %v8, 0
51   %v32 = icmp slt i32 %v8, %a4
52   %v33 = select i1 %v32, i32 %v8, i32 %v5
53   %v34 = select i1 %v31, i32 0, i32 %v33
54   %v35 = mul i32 %v34, %a3
55   %v36 = icmp slt i32 %v30, 0
56   %v37 = icmp slt i32 %v30, %a4
57   %v38 = select i1 %v37, i32 %v30, i32 %v5
58   %v39 = select i1 %v36, i32 0, i32 %v38
59   %v40 = mul i32 %v39, %a3
60   %v41 = add i32 %a2, 4
61   %v42 = icmp slt i32 %v41, 0
62   %v43 = icmp slt i32 %v41, %a4
63   %v44 = select i1 %v43, i32 %v41, i32 %v5
64   %v45 = select i1 %v42, i32 0, i32 %v44
65   %v46 = mul i32 %v45, %a3
66   %v47 = add i32 %a2, 5
67   %v48 = icmp slt i32 %v47, 0
68   %v49 = icmp slt i32 %v47, %a4
69   %v50 = select i1 %v49, i32 %v47, i32 %v5
70   %v51 = select i1 %v48, i32 0, i32 %v50
71   %v52 = mul i32 %v51, %a3
72   %v53 = add i32 %a2, 6
73   %v54 = icmp slt i32 %v53, 0
74   %v55 = icmp slt i32 %v53, %a4
75   %v56 = select i1 %v55, i32 %v53, i32 %v5
76   %v57 = select i1 %v54, i32 0, i32 %v56
77   %v58 = mul i32 %v57, %a3
78   br label %b5
80 b3:                                               ; preds = %b1
81   %v59 = mul i32 %a3, %a2
82   %v60 = add i32 %v59, %a1
83   %v61 = getelementptr inbounds i8, i8* %a5, i32 %v60
84   %v62 = shl i32 %a3, 1
85   %v63 = sub i32 0, %v62
86   %v64 = sub i32 %a3, %v62
87   %v65 = add i32 %v64, %a3
88   %v66 = add i32 %v65, %a3
89   %v67 = add i32 %v66, %a3
90   %v68 = add i32 %v67, %a3
91   %v69 = add i32 %v68, %a3
92   %v70 = add i32 %v69, %a3
93   %v71 = add i32 %v70, %a3
94   br label %b4
96 b4:                                               ; preds = %b4, %b3
97   %v72 = phi i8* [ %a0, %b3 ], [ %v165, %b4 ]
98   %v73 = phi i8* [ %v61, %b3 ], [ %v164, %b4 ]
99   %v74 = phi i32 [ 4, %b3 ], [ %v166, %b4 ]
100   %v75 = getelementptr inbounds i8, i8* %v73, i32 %v63
101   %v76 = load i8, i8* %v75, align 1, !tbaa !0
102   %v77 = zext i8 %v76 to i32
103   %v78 = getelementptr inbounds i8, i8* %v73, i32 %v64
104   %v79 = load i8, i8* %v78, align 1, !tbaa !0
105   %v80 = zext i8 %v79 to i32
106   %v81 = load i8, i8* %v73, align 1, !tbaa !0
107   %v82 = zext i8 %v81 to i32
108   %v83 = getelementptr inbounds i8, i8* %v73, i32 %v66
109   %v84 = load i8, i8* %v83, align 1, !tbaa !0
110   %v85 = zext i8 %v84 to i32
111   %v86 = getelementptr inbounds i8, i8* %v73, i32 %v67
112   %v87 = load i8, i8* %v86, align 1, !tbaa !0
113   %v88 = zext i8 %v87 to i32
114   %v89 = getelementptr inbounds i8, i8* %v73, i32 %v68
115   %v90 = load i8, i8* %v89, align 1, !tbaa !0
116   %v91 = zext i8 %v90 to i32
117   %v92 = getelementptr inbounds i8, i8* %v73, i32 %v69
118   %v93 = load i8, i8* %v92, align 1, !tbaa !0
119   %v94 = zext i8 %v93 to i32
120   %v95 = getelementptr inbounds i8, i8* %v73, i32 %v70
121   %v96 = load i8, i8* %v95, align 1, !tbaa !0
122   %v97 = zext i8 %v96 to i32
123   %v98 = getelementptr inbounds i8, i8* %v73, i32 %v71
124   %v99 = load i8, i8* %v98, align 1, !tbaa !0
125   %v100 = zext i8 %v99 to i32
126   %v101 = add nsw i32 %v88, %v80
127   %v102 = mul i32 %v101, -5
128   %v103 = add nsw i32 %v85, %v82
129   %v104 = mul nsw i32 %v103, 20
130   %v105 = add i32 %v77, 16
131   %v106 = add i32 %v105, %v104
132   %v107 = add i32 %v106, %v91
133   %v108 = add i32 %v107, %v102
134   %v109 = ashr i32 %v108, 5
135   %v110 = and i32 %v109, 256
136   %v111 = icmp ne i32 %v110, 0
137   %v112 = lshr i32 %v108, 31
138   %v113 = add i32 %v112, 255
139   %v114 = select i1 %v111, i32 %v113, i32 %v109
140   %v115 = trunc i32 %v114 to i8
141   store i8 %v115, i8* %v72, align 1, !tbaa !0
142   %v116 = add nsw i32 %v91, %v82
143   %v117 = mul i32 %v116, -5
144   %v118 = add nsw i32 %v88, %v85
145   %v119 = mul nsw i32 %v118, 20
146   %v120 = add i32 %v80, 16
147   %v121 = add i32 %v120, %v119
148   %v122 = add i32 %v121, %v94
149   %v123 = add i32 %v122, %v117
150   %v124 = ashr i32 %v123, 5
151   %v125 = and i32 %v124, 256
152   %v126 = icmp ne i32 %v125, 0
153   %v127 = lshr i32 %v123, 31
154   %v128 = add i32 %v127, 255
155   %v129 = select i1 %v126, i32 %v128, i32 %v124
156   %v130 = trunc i32 %v129 to i8
157   %v131 = getelementptr inbounds i8, i8* %v72, i32 4
158   store i8 %v130, i8* %v131, align 1, !tbaa !0
159   %v132 = add nsw i32 %v94, %v85
160   %v133 = mul i32 %v132, -5
161   %v134 = add nsw i32 %v91, %v88
162   %v135 = mul nsw i32 %v134, 20
163   %v136 = add i32 %v82, 16
164   %v137 = add i32 %v136, %v135
165   %v138 = add i32 %v137, %v97
166   %v139 = add i32 %v138, %v133
167   %v140 = ashr i32 %v139, 5
168   %v141 = and i32 %v140, 256
169   %v142 = icmp ne i32 %v141, 0
170   %v143 = lshr i32 %v139, 31
171   %v144 = add i32 %v143, 255
172   %v145 = select i1 %v142, i32 %v144, i32 %v140
173   %v146 = trunc i32 %v145 to i8
174   %v147 = getelementptr inbounds i8, i8* %v72, i32 8
175   store i8 %v146, i8* %v147, align 1, !tbaa !0
176   %v148 = add nsw i32 %v97, %v88
177   %v149 = mul i32 %v148, -5
178   %v150 = add nsw i32 %v94, %v91
179   %v151 = mul nsw i32 %v150, 20
180   %v152 = add i32 %v85, 16
181   %v153 = add i32 %v152, %v151
182   %v154 = add i32 %v153, %v100
183   %v155 = add i32 %v154, %v149
184   %v156 = ashr i32 %v155, 5
185   %v157 = and i32 %v156, 256
186   %v158 = icmp ne i32 %v157, 0
187   %v159 = lshr i32 %v155, 31
188   %v160 = add i32 %v159, 255
189   %v161 = select i1 %v158, i32 %v160, i32 %v156
190   %v162 = trunc i32 %v161 to i8
191   %v163 = getelementptr inbounds i8, i8* %v72, i32 12
192   store i8 %v162, i8* %v163, align 1, !tbaa !0
193   %v164 = getelementptr inbounds i8, i8* %v73, i32 1
194   %v165 = getelementptr inbounds i8, i8* %v72, i32 1
195   %v166 = add i32 %v74, -1
196   %v167 = icmp eq i32 %v166, 0
197   br i1 %v167, label %b7, label %b4
199 b5:                                               ; preds = %b5, %b2
200   %v168 = phi i8* [ %a0, %b2 ], [ %v312, %b5 ]
201   %v169 = phi i32 [ 0, %b2 ], [ %v313, %b5 ]
202   %v170 = add i32 %v169, %a1
203   %v171 = icmp slt i32 %v170, 0
204   %v172 = icmp slt i32 %v170, %a3
205   %v173 = select i1 %v172, i32 %v170, i32 %v6
206   %v174 = select i1 %v171, i32 0, i32 %v173
207   %v175 = add i32 %v19, %v174
208   %v176 = getelementptr inbounds i8, i8* %a5, i32 %v175
209   %v177 = load i8, i8* %v176, align 1, !tbaa !0
210   %v178 = zext i8 %v177 to i32
211   %v179 = add i32 %v24, %v174
212   %v180 = getelementptr inbounds i8, i8* %a5, i32 %v179
213   %v181 = load i8, i8* %v180, align 1, !tbaa !0
214   %v182 = zext i8 %v181 to i32
215   %v183 = mul nsw i32 %v182, -5
216   %v184 = add nsw i32 %v183, %v178
217   %v185 = add i32 %v29, %v174
218   %v186 = getelementptr inbounds i8, i8* %a5, i32 %v185
219   %v187 = load i8, i8* %v186, align 1, !tbaa !0
220   %v188 = zext i8 %v187 to i32
221   %v189 = mul nsw i32 %v188, 20
222   %v190 = add nsw i32 %v189, %v184
223   %v191 = add i32 %v13, %v174
224   %v192 = getelementptr inbounds i8, i8* %a5, i32 %v191
225   %v193 = load i8, i8* %v192, align 1, !tbaa !0
226   %v194 = zext i8 %v193 to i32
227   %v195 = mul nsw i32 %v194, 20
228   %v196 = add nsw i32 %v195, %v190
229   %v197 = add i32 %v35, %v174
230   %v198 = getelementptr inbounds i8, i8* %a5, i32 %v197
231   %v199 = load i8, i8* %v198, align 1, !tbaa !0
232   %v200 = zext i8 %v199 to i32
233   %v201 = mul nsw i32 %v200, -5
234   %v202 = add nsw i32 %v201, %v196
235   %v203 = add i32 %v40, %v174
236   %v204 = getelementptr inbounds i8, i8* %a5, i32 %v203
237   %v205 = load i8, i8* %v204, align 1, !tbaa !0
238   %v206 = zext i8 %v205 to i32
239   %v207 = add nsw i32 %v206, %v202
240   %v208 = add nsw i32 %v207, 16
241   %v209 = ashr i32 %v208, 5
242   %v210 = and i32 %v209, 256
243   %v211 = icmp ne i32 %v210, 0
244   %v212 = lshr i32 %v208, 31
245   %v213 = add i32 %v212, 255
246   %v214 = select i1 %v211, i32 %v213, i32 %v209
247   %v215 = trunc i32 %v214 to i8
248   store i8 %v215, i8* %v168, align 1, !tbaa !0
249   %v216 = getelementptr inbounds i8, i8* %v168, i32 4
250   %v217 = load i8, i8* %v180, align 1, !tbaa !0
251   %v218 = zext i8 %v217 to i32
252   %v219 = load i8, i8* %v186, align 1, !tbaa !0
253   %v220 = zext i8 %v219 to i32
254   %v221 = mul nsw i32 %v220, -5
255   %v222 = add nsw i32 %v221, %v218
256   %v223 = load i8, i8* %v192, align 1, !tbaa !0
257   %v224 = zext i8 %v223 to i32
258   %v225 = mul nsw i32 %v224, 20
259   %v226 = add nsw i32 %v225, %v222
260   %v227 = load i8, i8* %v198, align 1, !tbaa !0
261   %v228 = zext i8 %v227 to i32
262   %v229 = mul nsw i32 %v228, 20
263   %v230 = add nsw i32 %v229, %v226
264   %v231 = load i8, i8* %v204, align 1, !tbaa !0
265   %v232 = zext i8 %v231 to i32
266   %v233 = mul nsw i32 %v232, -5
267   %v234 = add nsw i32 %v233, %v230
268   %v235 = add i32 %v46, %v174
269   %v236 = getelementptr inbounds i8, i8* %a5, i32 %v235
270   %v237 = load i8, i8* %v236, align 1, !tbaa !0
271   %v238 = zext i8 %v237 to i32
272   %v239 = add nsw i32 %v238, %v234
273   %v240 = add nsw i32 %v239, 16
274   %v241 = ashr i32 %v240, 5
275   %v242 = and i32 %v241, 256
276   %v243 = icmp ne i32 %v242, 0
277   %v244 = lshr i32 %v240, 31
278   %v245 = add i32 %v244, 255
279   %v246 = select i1 %v243, i32 %v245, i32 %v241
280   %v247 = trunc i32 %v246 to i8
281   store i8 %v247, i8* %v216, align 1, !tbaa !0
282   %v248 = getelementptr inbounds i8, i8* %v168, i32 8
283   %v249 = load i8, i8* %v186, align 1, !tbaa !0
284   %v250 = zext i8 %v249 to i32
285   %v251 = load i8, i8* %v192, align 1, !tbaa !0
286   %v252 = zext i8 %v251 to i32
287   %v253 = mul nsw i32 %v252, -5
288   %v254 = add nsw i32 %v253, %v250
289   %v255 = load i8, i8* %v198, align 1, !tbaa !0
290   %v256 = zext i8 %v255 to i32
291   %v257 = mul nsw i32 %v256, 20
292   %v258 = add nsw i32 %v257, %v254
293   %v259 = load i8, i8* %v204, align 1, !tbaa !0
294   %v260 = zext i8 %v259 to i32
295   %v261 = mul nsw i32 %v260, 20
296   %v262 = add nsw i32 %v261, %v258
297   %v263 = load i8, i8* %v236, align 1, !tbaa !0
298   %v264 = zext i8 %v263 to i32
299   %v265 = mul nsw i32 %v264, -5
300   %v266 = add nsw i32 %v265, %v262
301   %v267 = add i32 %v52, %v174
302   %v268 = getelementptr inbounds i8, i8* %a5, i32 %v267
303   %v269 = load i8, i8* %v268, align 1, !tbaa !0
304   %v270 = zext i8 %v269 to i32
305   %v271 = add nsw i32 %v270, %v266
306   %v272 = add nsw i32 %v271, 16
307   %v273 = ashr i32 %v272, 5
308   %v274 = and i32 %v273, 256
309   %v275 = icmp ne i32 %v274, 0
310   %v276 = lshr i32 %v272, 31
311   %v277 = add i32 %v276, 255
312   %v278 = select i1 %v275, i32 %v277, i32 %v273
313   %v279 = trunc i32 %v278 to i8
314   store i8 %v279, i8* %v248, align 1, !tbaa !0
315   %v280 = getelementptr inbounds i8, i8* %v168, i32 12
316   %v281 = load i8, i8* %v192, align 1, !tbaa !0
317   %v282 = zext i8 %v281 to i32
318   %v283 = load i8, i8* %v198, align 1, !tbaa !0
319   %v284 = zext i8 %v283 to i32
320   %v285 = mul nsw i32 %v284, -5
321   %v286 = add nsw i32 %v285, %v282
322   %v287 = load i8, i8* %v204, align 1, !tbaa !0
323   %v288 = zext i8 %v287 to i32
324   %v289 = mul nsw i32 %v288, 20
325   %v290 = add nsw i32 %v289, %v286
326   %v291 = load i8, i8* %v236, align 1, !tbaa !0
327   %v292 = zext i8 %v291 to i32
328   %v293 = mul nsw i32 %v292, 20
329   %v294 = add nsw i32 %v293, %v290
330   %v295 = load i8, i8* %v268, align 1, !tbaa !0
331   %v296 = zext i8 %v295 to i32
332   %v297 = mul nsw i32 %v296, -5
333   %v298 = add nsw i32 %v297, %v294
334   %v299 = add i32 %v58, %v174
335   %v300 = getelementptr inbounds i8, i8* %a5, i32 %v299
336   %v301 = load i8, i8* %v300, align 1, !tbaa !0
337   %v302 = zext i8 %v301 to i32
338   %v303 = add nsw i32 %v302, %v298
339   %v304 = add nsw i32 %v303, 16
340   %v305 = ashr i32 %v304, 5
341   %v306 = and i32 %v305, 256
342   %v307 = icmp ne i32 %v306, 0
343   %v308 = lshr i32 %v304, 31
344   %v309 = add i32 %v308, 255
345   %v310 = select i1 %v307, i32 %v309, i32 %v305
346   %v311 = trunc i32 %v310 to i8
347   store i8 %v311, i8* %v280, align 1, !tbaa !0
348   %v312 = getelementptr inbounds i8, i8* %v168, i32 1
349   %v313 = add i32 %v169, 1
350   %v314 = icmp eq i32 %v313, 4
351   br i1 %v314, label %b6, label %b5
353 b6:                                               ; preds = %b5
354   br label %b8
356 b7:                                               ; preds = %b4
357   br label %b8
359 b8:                                               ; preds = %b7, %b6
360   ret void
363 attributes #0 = { nounwind }
365 !0 = !{!1, !1, i64 0}
366 !1 = !{!"omnipotent char", !2}
367 !2 = !{!"Simple C/C++ TBAA"}