Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / AVR / rust-avr-bug-99.ll
blob640b2cc97c45dd0d59b6548ecae08561abf77e16
1 ; RUN: llc < %s -march=avr -mcpu=avr5 | FileCheck %s
3 ; The original reason for this failure is that the BranchFolderPass disables liveness
4 ; tracking unless you override the trackLivenessAfterRegAlloc function and return true.
5 ; This probably should be the default because all main targets do this (maybe some gpu targets don't).
7 ; More info can be found at https://github.com/avr-rust/rust/issues/99.
9 %struct.quux = type { [0 x i8], i64, [0 x i8], i64, [0 x i8], i64, [0 x i8], i64, [0 x i8] }
10 %struct.foo = type { [0 x i8], %struct.blam, [0 x i8], i32, [0 x i8], i32, [0 x i8], i8, [0 x i8], %struct.blam.0, [0 x i8], %struct.blam.0, [0 x i8] }
11 %struct.blam = type {}
12 %struct.blam.0 = type { [0 x i8], i8, [2 x i8] }
13 %struct.quux.1 = type { [0 x i8], %struct.wombat, [0 x i8], i64, [0 x i8], i64, [0 x i8], i16, [0 x i8], %struct.quux, [0 x i8], i64, [0 x i8], i16, [0 x i8] }
14 %struct.wombat = type {}
16 declare zeroext i1 @zot(%struct.quux*, %struct.foo*)
18 declare void @wibble(i16, i16)
20 ; CHECK-LABEL: main
21 define zeroext i1 @main(%struct.quux.1* %arg, %struct.foo* %arg62) {
22 bb:
23   %tmp63 = alloca [128 x i8], align 1
24   %tmp = getelementptr inbounds %struct.quux.1, %struct.quux.1* %arg, i16 0, i32 5
25   %tmp64 = getelementptr inbounds %struct.quux.1, %struct.quux.1* %arg, i16 0, i32 13
26   %tmp65 = bitcast %struct.foo* %arg62 to i32*
27   %tmp66 = icmp eq i32 undef, 0
28   br i1 undef, label %bb92, label %bb67
30 bb67:
31   br i1 %tmp66, label %bb83, label %bb68
33 bb68:
34   %tmp69 = load i64, i64* null, align 1
35   br label %bb70
37 bb70:
38   %tmp71 = phi i16 [ 128, %bb68 ], [ %tmp79, %bb70 ]
39   %tmp72 = phi i64 [ %tmp69, %bb68 ], [ %tmp74, %bb70 ]
40   %tmp73 = getelementptr inbounds i8, i8* null, i16 -1
41   %tmp74 = lshr i64 %tmp72, 4
42   %tmp75 = trunc i64 %tmp72 to i8
43   %tmp76 = and i8 %tmp75, 15
44   %tmp77 = add nuw nsw i8 %tmp76, 87
45   %tmp78 = select i1 undef, i8 undef, i8 %tmp77
46   store i8 %tmp78, i8* %tmp73, align 1
47   %tmp79 = add nsw i16 %tmp71, -1
48   %tmp80 = icmp eq i8* %tmp73, null
49   %tmp81 = or i1 undef, %tmp80
50   br i1 %tmp81, label %bb82, label %bb70
52 bb82:
53   call void @wibble(i16 %tmp79, i16 128)
54   unreachable
56 bb83:
57   %tmp84 = icmp eq i32 undef, 0
58   %tmp85 = load i64, i64* null, align 1
59   br i1 %tmp84, label %bb87, label %bb86
61 bb86:
62   unreachable
64 bb87:
65   br label %bb88
67 bb88:
68   %tmp89 = phi i64 [ %tmp90, %bb88 ], [ %tmp85, %bb87 ]
69   %tmp90 = udiv i64 %tmp89, 10000
70   %tmp91 = icmp ugt i64 %tmp89, 99999999
71   br label %bb88
73 bb92:
74   br label %bb93
76 bb93:
77   br i1 undef, label %bb95, label %bb94
79 bb94:
80   unreachable
82 bb95:
83   br label %bb96
85 bb96:
86   %tmp97 = phi i64 [ %tmp98, %bb96 ], [ undef, %bb95 ]
87   %tmp98 = udiv i64 %tmp97, 10000
88   %tmp99 = icmp ugt i64 %tmp97, 99999999
89   br i1 %tmp99, label %bb96, label %bb100
91 bb100:
92   br label %bb101
94 bb101:
95   %tmp102 = and i32 undef, 16
96   %tmp103 = icmp eq i32 %tmp102, 0
97   br i1 undef, label %bb130, label %bb104
99 bb104:
100   br i1 %tmp103, label %bb117, label %bb105
102 bb105:
103   br label %bb106
105 bb106:
106   %tmp107 = phi i16 [ 128, %bb105 ], [ %tmp113, %bb106 ]
107   %tmp108 = phi i64 [ undef, %bb105 ], [ %tmp111, %bb106 ]
108   %tmp109 = phi i8* [ undef, %bb105 ], [ %tmp110, %bb106 ]
109   %tmp110 = getelementptr inbounds i8, i8* %tmp109, i16 -1
110   %tmp111 = lshr i64 %tmp108, 4
111   %tmp112 = trunc i64 %tmp108 to i8
112   %tmp113 = add nsw i16 %tmp107, -1
113   %tmp114 = icmp eq i8* %tmp110, null
114   %tmp115 = or i1 undef, %tmp114
115   br i1 %tmp115, label %bb116, label %bb106
117 bb116:
118   call void @wibble(i16 %tmp113, i16 128)
119   unreachable
121 bb117:
122   %tmp118 = load i64, i64* %tmp, align 1
123   br i1 undef, label %bb120, label %bb119
125 bb119:
126   unreachable
128 bb120:
129   %tmp121 = icmp ugt i64 %tmp118, 9999
130   br i1 %tmp121, label %bb122, label %bb127
132 bb122:
133   br label %bb123
135 bb123:
136   %tmp124 = phi i64 [ %tmp125, %bb123 ], [ %tmp118, %bb122 ]
137   %tmp125 = udiv i64 %tmp124, 10000
138   %tmp126 = icmp ugt i64 %tmp124, 99999999
139   br label %bb123
141 bb127:
142   %tmp128 = load i32, i32* %tmp65, align 1
143   %tmp129 = icmp eq i32 undef, 0
144   br label %bb162
146 bb130:
147   br i1 %tmp103, label %bb142, label %bb131
149 bb131:
150   br label %bb132
152 bb132:
153   %tmp133 = phi i64 [ undef, %bb131 ], [ %tmp134, %bb132 ]
154   %tmp134 = lshr i64 %tmp133, 4
155   %tmp135 = trunc i64 %tmp133 to i8
156   %tmp136 = and i8 %tmp135, 15
157   %tmp137 = add nuw nsw i8 %tmp136, 87
158   %tmp138 = select i1 undef, i8 undef, i8 %tmp137
159   store i8 %tmp138, i8* undef, align 1
160   %tmp139 = icmp eq i8* undef, null
161   %tmp140 = or i1 undef, %tmp139
162   br i1 %tmp140, label %bb141, label %bb132
164 bb141:
165   unreachable
167 bb142:
168   %tmp143 = icmp eq i32 undef, 0
169   %tmp144 = load i64, i64* %tmp, align 1
170   br i1 %tmp143, label %bb156, label %bb145
172 bb145:
173   br label %bb146
175 bb146:
176   %tmp147 = phi i16 [ 128, %bb145 ], [ %tmp151, %bb146 ]
177   %tmp148 = phi i64 [ %tmp144, %bb145 ], [ %tmp150, %bb146 ]
178   %tmp149 = getelementptr inbounds i8, i8* null, i16 -1
179   %tmp150 = lshr i64 %tmp148, 4
180   %tmp151 = add nsw i16 %tmp147, -1
181   %tmp152 = icmp eq i64 %tmp150, 0
182   %tmp153 = icmp eq i8* %tmp149, null
183   %tmp154 = or i1 %tmp152, %tmp153
184   br i1 %tmp154, label %bb155, label %bb146
186 bb155:
187   call void @wibble(i16 %tmp151, i16 128)
188   unreachable
190 bb156:
191   br label %bb157
193 bb157:
194   %tmp158 = phi i64 [ %tmp159, %bb157 ], [ %tmp144, %bb156 ]
195   %tmp159 = udiv i64 %tmp158, 10000
196   %tmp160 = icmp ugt i64 %tmp158, 99999999
197   br i1 %tmp160, label %bb157, label %bb161
199 bb161:
200   unreachable
202 bb162:
203   br i1 %tmp129, label %bb164, label %bb163
205 bb163:
206   unreachable
208 bb164:
209   %tmp165 = and i32 %tmp128, 32
210   %tmp166 = icmp eq i32 %tmp165, 0
211   br i1 %tmp166, label %bb169, label %bb167
213 bb167:
214   br label %bb168
216 bb168:
217   br label %bb168
219 bb169:
220   br label %bb170
222 bb170:
223   br i1 undef, label %bb172, label %bb171
225 bb171:
226   store i32 0, i32* undef, align 1
227   call void @llvm.memcpy.p0i8.p0i8.i16(i8* align 1 undef, i8* align 1 null, i16 3, i1 false)
228   call void @llvm.memcpy.p0i8.p0i8.i16(i8* align 1 undef, i8* align 1 null, i16 3, i1 false)
229   br label %bb214
231 bb172:
232   %tmp173 = call zeroext i1 @zot(%struct.quux* noalias nonnull readonly dereferenceable(32) undef, %struct.foo* nonnull dereferenceable(15) %arg62)
233   br i1 %tmp173, label %bb214, label %bb174
235 bb174:
236   %tmp175 = load i32, i32* %tmp65, align 1
237   %tmp176 = icmp eq i32 undef, 0
238   br label %bb177
240 bb177:
241   br i1 %tmp176, label %bb190, label %bb178
243 bb178:
244   %tmp179 = getelementptr inbounds [128 x i8], [128 x i8]* %tmp63, i16 0, i16 0
245   br label %bb180
247 bb180:
248   %tmp181 = phi i64 [ 0, %bb178 ], [ %tmp182, %bb180 ]
249   %tmp182 = lshr i64 %tmp181, 4
250   %tmp183 = trunc i64 %tmp181 to i8
251   %tmp184 = and i8 %tmp183, 15
252   %tmp185 = add nuw nsw i8 %tmp184, 87
253   %tmp186 = select i1 false, i8 0, i8 %tmp185
254   store i8 %tmp186, i8* null, align 1
255   %tmp187 = icmp eq i8* null, %tmp179
256   %tmp188 = or i1 undef, %tmp187
257   br i1 %tmp188, label %bb189, label %bb180
259 bb189:
260   call void @wibble(i16 0, i16 128)
261   unreachable
263 bb190:
264   %tmp191 = and i32 %tmp175, 32
265   %tmp192 = icmp eq i32 %tmp191, 0
266   br i1 %tmp192, label %bb201, label %bb193
268 bb193:
269   br label %bb194
271 bb194:
272   %tmp195 = phi i64 [ 0, %bb193 ], [ %tmp196, %bb194 ]
273   %tmp196 = lshr i64 %tmp195, 4
274   %tmp197 = add nsw i16 0, -1
275   %tmp198 = icmp eq i64 %tmp196, 0
276   %tmp199 = or i1 %tmp198, undef
277   br i1 %tmp199, label %bb200, label %bb194
279 bb200:
280   call void @wibble(i16 %tmp197, i16 128)
281   unreachable
283 bb201:
284   br i1 undef, label %bb202, label %bb207
286 bb202:
287   br label %bb203
289 bb203:
290   %tmp204 = phi i64 [ %tmp205, %bb203 ], [ 0, %bb202 ]
291   %tmp205 = udiv i64 %tmp204, 10000
292   %tmp206 = icmp ugt i64 %tmp204, 99999999
293   br i1 %tmp206, label %bb203, label %bb207
295 bb207:
296   br label %bb208
298 bb208:
299   store i16* %tmp64, i16** undef, align 1
300   %tmp209 = load i32, i32* %tmp65, align 1
301   %tmp210 = icmp eq i32 undef, 0
302   %tmp211 = and i32 %tmp209, 16
303   %tmp212 = icmp eq i32 %tmp211, 0
304   br i1 %tmp210, label %bb215, label %bb213
306 bb213:
307   unreachable
309 bb214:
310   br label %bb221
312 bb215:
313   br i1 %tmp212, label %bb220, label %bb216
315 bb216:
316   br label %bb217
318 bb217:
319   br i1 undef, label %bb218, label %bb219
321 bb218:
322   unreachable
324 bb219:
325   br label %bb221
327 bb220:
328   unreachable
330 bb221:
331   store %struct.quux.1* %arg, %struct.quux.1** undef, align 1
332   ret i1 undef
335 declare void @llvm.memcpy.p0i8.p0i8.i16(i8* nocapture writeonly, i8* nocapture readonly, i16, i1)