1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
4 %struct.i = type { i32, i24 }
5 %struct.m = type { %struct.i }
7 @a = local_unnamed_addr global i32 0, align 4
8 @b = local_unnamed_addr global i16 0, align 2
9 @c = local_unnamed_addr global i16 0, align 2
10 @e = local_unnamed_addr global i16 0, align 2
11 @l = local_unnamed_addr global %struct.i zeroinitializer, align 4
12 @k = local_unnamed_addr global %struct.m zeroinitializer, align 4
14 @x0 = local_unnamed_addr global double 0.000000e+00, align 8
15 @x1 = local_unnamed_addr global i32 0, align 4
16 @x2 = local_unnamed_addr global i32 0, align 4
17 @x3 = local_unnamed_addr global i32 0, align 4
18 @x4 = local_unnamed_addr global i32 0, align 4
19 @x5 = local_unnamed_addr global double* null, align 8
21 ; Check that compiler does not crash.
23 define void @_Z1nv() local_unnamed_addr {
25 ; CHECK: # %bb.0: # %entry
26 ; CHECK-NEXT: movq k@GOTPCREL(%rip), %rax
27 ; CHECK-NEXT: movl 4(%rax), %r11d
28 ; CHECK-NEXT: movq c@GOTPCREL(%rip), %rax
29 ; CHECK-NEXT: movswl (%rax), %r10d
30 ; CHECK-NEXT: movq b@GOTPCREL(%rip), %r8
31 ; CHECK-NEXT: movswl (%r8), %r9d
32 ; CHECK-NEXT: movq a@GOTPCREL(%rip), %rsi
33 ; CHECK-NEXT: movl (%rsi), %esi
34 ; CHECK-NEXT: movq l@GOTPCREL(%rip), %rax
35 ; CHECK-NEXT: movl (%rax), %edi
36 ; CHECK-NEXT: movl %edi, %eax
37 ; CHECK-NEXT: shll $7, %eax
38 ; CHECK-NEXT: sarl $7, %eax
39 ; CHECK-NEXT: negl %eax
40 ; CHECK-NEXT: testl %esi, %esi
41 ; CHECK-NEXT: cmovel %esi, %eax
42 ; CHECK-NEXT: movzwl %r11w, %ecx
43 ; CHECK-NEXT: leal (%r10,%rcx,2), %ecx
44 ; CHECK-NEXT: addl %r9d, %ecx
45 ; CHECK-NEXT: cmpl %eax, %ecx
46 ; CHECK-NEXT: sete %al
47 ; CHECK-NEXT: testl $33554431, %edi # imm = 0x1FFFFFF
48 ; CHECK-NEXT: sete %dl
49 ; CHECK-NEXT: orb %al, %dl
50 ; CHECK-NEXT: movzbl %dl, %eax
51 ; CHECK-NEXT: movq e@GOTPCREL(%rip), %rdx
52 ; CHECK-NEXT: movw %ax, (%rdx)
53 ; CHECK-NEXT: notl %ecx
54 ; CHECK-NEXT: shrl $31, %ecx
55 ; CHECK-NEXT: addl %r11d, %ecx
56 ; CHECK-NEXT: # kill: def $cl killed $cl killed $ecx
57 ; CHECK-NEXT: sarl %cl, %esi
58 ; CHECK-NEXT: movw %si, (%r8)
61 %bf.load = load i32, i32* bitcast (i24* getelementptr inbounds (%struct.m, %struct.m* @k, i64 0, i32 0, i32 1) to i32*), align 4
62 %0 = load i16, i16* @c, align 2
63 %conv = sext i16 %0 to i32
64 %1 = load i16, i16* @b, align 2
65 %conv1 = sext i16 %1 to i32
66 %2 = load i32, i32* @a, align 4
67 %tobool = icmp ne i32 %2, 0
68 %bf.load3 = load i32, i32* getelementptr inbounds (%struct.i, %struct.i* @l, i64 0, i32 0), align 4
69 %bf.shl = shl i32 %bf.load3, 7
70 %bf.ashr = ashr exact i32 %bf.shl, 7
71 %bf.clear = shl i32 %bf.load, 1
72 %factor = and i32 %bf.clear, 131070
73 %add13 = add nsw i32 %factor, %conv
74 %add15 = add nsw i32 %add13, %conv1
75 %bf.ashr.op = sub nsw i32 0, %bf.ashr
76 %add28 = select i1 %tobool, i32 %bf.ashr.op, i32 0
77 %tobool29 = icmp eq i32 %add15, %add28
78 %phitmp = icmp eq i32 %bf.ashr, 0
79 %.phitmp = or i1 %phitmp, %tobool29
80 %conv37 = zext i1 %.phitmp to i16
81 store i16 %conv37, i16* @e, align 2
82 %bf.clear39 = and i32 %bf.load, 65535
83 %factor53 = shl nuw nsw i32 %bf.clear39, 1
84 %add46 = add nsw i32 %factor53, %conv
85 %add48 = add nsw i32 %add46, %conv1
86 %add48.lobit = lshr i32 %add48, 31
87 %add48.lobit.not = xor i32 %add48.lobit, 1
88 %add51 = add nuw nsw i32 %add48.lobit.not, %bf.clear39
89 %shr = ashr i32 %2, %add51
90 %conv52 = trunc i32 %shr to i16
91 store i16 %conv52, i16* @b, align 2
96 define void @_Z2x6v() local_unnamed_addr {
97 ; CHECK-LABEL: _Z2x6v:
98 ; CHECK: # %bb.0: # %entry
99 ; CHECK-NEXT: pushq %rbp
100 ; CHECK-NEXT: .cfi_def_cfa_offset 16
101 ; CHECK-NEXT: pushq %r15
102 ; CHECK-NEXT: .cfi_def_cfa_offset 24
103 ; CHECK-NEXT: pushq %r14
104 ; CHECK-NEXT: .cfi_def_cfa_offset 32
105 ; CHECK-NEXT: pushq %r13
106 ; CHECK-NEXT: .cfi_def_cfa_offset 40
107 ; CHECK-NEXT: pushq %r12
108 ; CHECK-NEXT: .cfi_def_cfa_offset 48
109 ; CHECK-NEXT: pushq %rbx
110 ; CHECK-NEXT: .cfi_def_cfa_offset 56
111 ; CHECK-NEXT: .cfi_offset %rbx, -56
112 ; CHECK-NEXT: .cfi_offset %r12, -48
113 ; CHECK-NEXT: .cfi_offset %r13, -40
114 ; CHECK-NEXT: .cfi_offset %r14, -32
115 ; CHECK-NEXT: .cfi_offset %r15, -24
116 ; CHECK-NEXT: .cfi_offset %rbp, -16
117 ; CHECK-NEXT: movq x1@GOTPCREL(%rip), %rax
118 ; CHECK-NEXT: movl (%rax), %ecx
119 ; CHECK-NEXT: andl $511, %ecx # imm = 0x1FF
120 ; CHECK-NEXT: leaq 1(%rcx), %r13
121 ; CHECK-NEXT: movq x4@GOTPCREL(%rip), %rax
122 ; CHECK-NEXT: movl %r13d, (%rax)
123 ; CHECK-NEXT: movq x3@GOTPCREL(%rip), %rax
124 ; CHECK-NEXT: movl (%rax), %edx
125 ; CHECK-NEXT: testl %edx, %edx
126 ; CHECK-NEXT: je .LBB1_18
127 ; CHECK-NEXT: # %bb.1: # %for.cond1thread-pre-split.lr.ph
128 ; CHECK-NEXT: movq x5@GOTPCREL(%rip), %rax
129 ; CHECK-NEXT: movq (%rax), %r12
130 ; CHECK-NEXT: movl %edx, %eax
131 ; CHECK-NEXT: notl %eax
132 ; CHECK-NEXT: leaq 8(,%rax,8), %r14
133 ; CHECK-NEXT: imulq %r13, %r14
134 ; CHECK-NEXT: addq %r12, %r14
135 ; CHECK-NEXT: movq x2@GOTPCREL(%rip), %r15
136 ; CHECK-NEXT: movl (%r15), %eax
137 ; CHECK-NEXT: leal 8(,%rcx,8), %ecx
138 ; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
139 ; CHECK-NEXT: leaq 8(%r12), %rcx
140 ; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
141 ; CHECK-NEXT: leaq 32(%r12), %rbx
142 ; CHECK-NEXT: shlq $3, %r13
143 ; CHECK-NEXT: xorl %esi, %esi
144 ; CHECK-NEXT: movq x0@GOTPCREL(%rip), %rcx
145 ; CHECK-NEXT: movq %r12, %rdi
146 ; CHECK-NEXT: jmp .LBB1_2
147 ; CHECK-NEXT: .p2align 4, 0x90
148 ; CHECK-NEXT: .LBB1_15: # %for.cond1.for.inc3_crit_edge
149 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
150 ; CHECK-NEXT: movl %eax, (%r15)
151 ; CHECK-NEXT: .LBB1_16: # %for.inc3
152 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
153 ; CHECK-NEXT: addq %r13, %rdi
154 ; CHECK-NEXT: incq %rsi
155 ; CHECK-NEXT: addq %r13, %rbx
156 ; CHECK-NEXT: incl %edx
157 ; CHECK-NEXT: je .LBB1_17
158 ; CHECK-NEXT: .LBB1_2: # %for.cond1thread-pre-split
159 ; CHECK-NEXT: # =>This Loop Header: Depth=1
160 ; CHECK-NEXT: # Child Loop BB1_12 Depth 2
161 ; CHECK-NEXT: # Child Loop BB1_14 Depth 2
162 ; CHECK-NEXT: testl %eax, %eax
163 ; CHECK-NEXT: jns .LBB1_16
164 ; CHECK-NEXT: # %bb.3: # %for.body2.preheader
165 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
166 ; CHECK-NEXT: movslq %eax, %r9
167 ; CHECK-NEXT: testq %r9, %r9
168 ; CHECK-NEXT: movq $-1, %rbp
169 ; CHECK-NEXT: cmovnsq %r9, %rbp
170 ; CHECK-NEXT: subq %r9, %rbp
171 ; CHECK-NEXT: incq %rbp
172 ; CHECK-NEXT: cmpq $4, %rbp
173 ; CHECK-NEXT: jb .LBB1_14
174 ; CHECK-NEXT: # %bb.4: # %min.iters.checked
175 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
176 ; CHECK-NEXT: movq %rbp, %r8
177 ; CHECK-NEXT: andq $-4, %r8
178 ; CHECK-NEXT: je .LBB1_14
179 ; CHECK-NEXT: # %bb.5: # %vector.memcheck
180 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
181 ; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Reload
182 ; CHECK-NEXT: imulq %rsi, %r10
183 ; CHECK-NEXT: leaq (%r12,%r10), %rax
184 ; CHECK-NEXT: leaq (%rax,%r9,8), %rax
185 ; CHECK-NEXT: testq %r9, %r9
186 ; CHECK-NEXT: movq $-1, %r11
187 ; CHECK-NEXT: cmovnsq %r9, %r11
188 ; CHECK-NEXT: cmpq %rcx, %rax
189 ; CHECK-NEXT: jae .LBB1_7
190 ; CHECK-NEXT: # %bb.6: # %vector.memcheck
191 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
192 ; CHECK-NEXT: addq {{[-0-9]+}}(%r{{[sb]}}p), %r10 # 8-byte Folded Reload
193 ; CHECK-NEXT: leaq (%r10,%r11,8), %rax
194 ; CHECK-NEXT: cmpq %rcx, %rax
195 ; CHECK-NEXT: ja .LBB1_14
196 ; CHECK-NEXT: .LBB1_7: # %vector.body.preheader
197 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
198 ; CHECK-NEXT: leaq -4(%r8), %rax
199 ; CHECK-NEXT: movq %rax, %r10
200 ; CHECK-NEXT: shrq $2, %r10
201 ; CHECK-NEXT: btl $2, %eax
202 ; CHECK-NEXT: jb .LBB1_8
203 ; CHECK-NEXT: # %bb.9: # %vector.body.prol.preheader
204 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
205 ; CHECK-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
206 ; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
207 ; CHECK-NEXT: movdqu %xmm0, (%rdi,%r9,8)
208 ; CHECK-NEXT: movdqu %xmm0, 16(%rdi,%r9,8)
209 ; CHECK-NEXT: movl $4, %r11d
210 ; CHECK-NEXT: testq %r10, %r10
211 ; CHECK-NEXT: jne .LBB1_11
212 ; CHECK-NEXT: jmp .LBB1_13
213 ; CHECK-NEXT: .LBB1_8: # in Loop: Header=BB1_2 Depth=1
214 ; CHECK-NEXT: xorl %r11d, %r11d
215 ; CHECK-NEXT: testq %r10, %r10
216 ; CHECK-NEXT: je .LBB1_13
217 ; CHECK-NEXT: .LBB1_11: # %vector.body.preheader.new
218 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
219 ; CHECK-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
220 ; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
221 ; CHECK-NEXT: movq %r11, %rax
222 ; CHECK-NEXT: subq %r8, %rax
223 ; CHECK-NEXT: addq %r9, %r11
224 ; CHECK-NEXT: leaq (%rbx,%r11,8), %r11
225 ; CHECK-NEXT: .p2align 4, 0x90
226 ; CHECK-NEXT: .LBB1_12: # %vector.body
227 ; CHECK-NEXT: # Parent Loop BB1_2 Depth=1
228 ; CHECK-NEXT: # => This Inner Loop Header: Depth=2
229 ; CHECK-NEXT: movdqu %xmm0, -32(%r11)
230 ; CHECK-NEXT: movdqu %xmm0, -16(%r11)
231 ; CHECK-NEXT: movdqu %xmm0, (%r11)
232 ; CHECK-NEXT: movdqu %xmm0, 16(%r11)
233 ; CHECK-NEXT: addq $64, %r11
234 ; CHECK-NEXT: addq $8, %rax
235 ; CHECK-NEXT: jne .LBB1_12
236 ; CHECK-NEXT: .LBB1_13: # %middle.block
237 ; CHECK-NEXT: # in Loop: Header=BB1_2 Depth=1
238 ; CHECK-NEXT: addq %r8, %r9
239 ; CHECK-NEXT: cmpq %r8, %rbp
240 ; CHECK-NEXT: movq %r9, %rax
241 ; CHECK-NEXT: je .LBB1_15
242 ; CHECK-NEXT: .p2align 4, 0x90
243 ; CHECK-NEXT: .LBB1_14: # %for.body2
244 ; CHECK-NEXT: # Parent Loop BB1_2 Depth=1
245 ; CHECK-NEXT: # => This Inner Loop Header: Depth=2
246 ; CHECK-NEXT: movq (%rcx), %rax
247 ; CHECK-NEXT: movq %rax, (%rdi,%r9,8)
248 ; CHECK-NEXT: leaq 1(%r9), %rax
249 ; CHECK-NEXT: cmpq $-1, %r9
250 ; CHECK-NEXT: movq %rax, %r9
251 ; CHECK-NEXT: jl .LBB1_14
252 ; CHECK-NEXT: jmp .LBB1_15
253 ; CHECK-NEXT: .LBB1_17: # %for.cond.for.end5_crit_edge
254 ; CHECK-NEXT: movq x5@GOTPCREL(%rip), %rax
255 ; CHECK-NEXT: movq %r14, (%rax)
256 ; CHECK-NEXT: movq x3@GOTPCREL(%rip), %rax
257 ; CHECK-NEXT: movl $0, (%rax)
258 ; CHECK-NEXT: .LBB1_18: # %for.end5
259 ; CHECK-NEXT: popq %rbx
260 ; CHECK-NEXT: .cfi_def_cfa_offset 48
261 ; CHECK-NEXT: popq %r12
262 ; CHECK-NEXT: .cfi_def_cfa_offset 40
263 ; CHECK-NEXT: popq %r13
264 ; CHECK-NEXT: .cfi_def_cfa_offset 32
265 ; CHECK-NEXT: popq %r14
266 ; CHECK-NEXT: .cfi_def_cfa_offset 24
267 ; CHECK-NEXT: popq %r15
268 ; CHECK-NEXT: .cfi_def_cfa_offset 16
269 ; CHECK-NEXT: popq %rbp
270 ; CHECK-NEXT: .cfi_def_cfa_offset 8
273 %0 = load i32, i32* @x1, align 4
274 %and = and i32 %0, 511
275 %add = add nuw nsw i32 %and, 1
276 store i32 %add, i32* @x4, align 4
277 %.pr = load i32, i32* @x3, align 4
278 %tobool8 = icmp eq i32 %.pr, 0
279 br i1 %tobool8, label %for.end5, label %for.cond1thread-pre-split.lr.ph
281 for.cond1thread-pre-split.lr.ph: ; preds = %entry
282 %idx.ext13 = zext i32 %add to i64
283 %x5.promoted = load double*, double** @x5, align 8
284 %x5.promoted9 = bitcast double* %x5.promoted to i8*
285 %1 = xor i32 %.pr, -1
286 %2 = zext i32 %1 to i64
287 %3 = shl nuw nsw i64 %2, 3
288 %4 = add nuw nsw i64 %3, 8
289 %5 = mul nuw nsw i64 %4, %idx.ext13
290 %uglygep = getelementptr i8, i8* %x5.promoted9, i64 %5
291 %.pr6.pre = load i32, i32* @x2, align 4
292 %6 = shl nuw nsw i32 %and, 3
293 %addconv = add nuw nsw i32 %6, 8
294 %7 = zext i32 %addconv to i64
295 %scevgep15 = getelementptr double, double* %x5.promoted, i64 1
296 %scevgep1516 = bitcast double* %scevgep15 to i8*
297 br label %for.cond1thread-pre-split
299 for.cond1thread-pre-split: ; preds = %for.cond1thread-pre-split.lr.ph, %for.inc3
300 %indvar = phi i64 [ 0, %for.cond1thread-pre-split.lr.ph ], [ %indvar.next, %for.inc3 ]
301 %.pr6 = phi i32 [ %.pr6.pre, %for.cond1thread-pre-split.lr.ph ], [ %.pr611, %for.inc3 ]
302 %8 = phi double* [ %x5.promoted, %for.cond1thread-pre-split.lr.ph ], [ %add.ptr, %for.inc3 ]
303 %9 = phi i32 [ %.pr, %for.cond1thread-pre-split.lr.ph ], [ %inc4, %for.inc3 ]
304 %10 = mul i64 %7, %indvar
305 %uglygep14 = getelementptr i8, i8* %x5.promoted9, i64 %10
306 %uglygep17 = getelementptr i8, i8* %scevgep1516, i64 %10
307 %cmp7 = icmp slt i32 %.pr6, 0
308 br i1 %cmp7, label %for.body2.preheader, label %for.inc3
310 for.body2.preheader: ; preds = %for.cond1thread-pre-split
311 %11 = sext i32 %.pr6 to i64
312 %12 = sext i32 %.pr6 to i64
313 %13 = icmp sgt i64 %12, -1
314 %smax = select i1 %13, i64 %12, i64 -1
315 %14 = add nsw i64 %smax, 1
316 %15 = sub nsw i64 %14, %12
317 %min.iters.check = icmp ult i64 %15, 4
318 br i1 %min.iters.check, label %for.body2.preheader21, label %min.iters.checked
320 min.iters.checked: ; preds = %for.body2.preheader
321 %n.vec = and i64 %15, -4
322 %cmp.zero = icmp eq i64 %n.vec, 0
323 br i1 %cmp.zero, label %for.body2.preheader21, label %vector.memcheck
325 vector.memcheck: ; preds = %min.iters.checked
326 %16 = shl nsw i64 %11, 3
327 %scevgep = getelementptr i8, i8* %uglygep14, i64 %16
328 %17 = icmp sgt i64 %11, -1
329 %smax18 = select i1 %17, i64 %11, i64 -1
330 %18 = shl nsw i64 %smax18, 3
331 %scevgep19 = getelementptr i8, i8* %uglygep17, i64 %18
332 %bound0 = icmp ult i8* %scevgep, bitcast (double* @x0 to i8*)
333 %bound1 = icmp ugt i8* %scevgep19, bitcast (double* @x0 to i8*)
334 %memcheck.conflict = and i1 %bound0, %bound1
335 %ind.end = add nsw i64 %11, %n.vec
336 br i1 %memcheck.conflict, label %for.body2.preheader21, label %vector.body.preheader
338 vector.body.preheader: ; preds = %vector.memcheck
339 %19 = add nsw i64 %n.vec, -4
340 %20 = lshr exact i64 %19, 2
342 %lcmp.mod = icmp eq i64 %21, 0
343 br i1 %lcmp.mod, label %vector.body.prol.preheader, label %vector.body.prol.loopexit.unr-lcssa
345 vector.body.prol.preheader: ; preds = %vector.body.preheader
346 br label %vector.body.prol
348 vector.body.prol: ; preds = %vector.body.prol.preheader
349 %22 = load i64, i64* bitcast (double* @x0 to i64*), align 8
350 %23 = insertelement <2 x i64> undef, i64 %22, i32 0
351 %24 = shufflevector <2 x i64> %23, <2 x i64> undef, <2 x i32> zeroinitializer
352 %25 = insertelement <2 x i64> undef, i64 %22, i32 0
353 %26 = shufflevector <2 x i64> %25, <2 x i64> undef, <2 x i32> zeroinitializer
354 %27 = getelementptr inbounds double, double* %8, i64 %11
355 %28 = bitcast double* %27 to <2 x i64>*
356 store <2 x i64> %24, <2 x i64>* %28, align 8
357 %29 = getelementptr double, double* %27, i64 2
358 %30 = bitcast double* %29 to <2 x i64>*
359 store <2 x i64> %26, <2 x i64>* %30, align 8
360 br label %vector.body.prol.loopexit.unr-lcssa
362 vector.body.prol.loopexit.unr-lcssa: ; preds = %vector.body.preheader, %vector.body.prol
363 %index.unr.ph = phi i64 [ 4, %vector.body.prol ], [ 0, %vector.body.preheader ]
364 br label %vector.body.prol.loopexit
366 vector.body.prol.loopexit: ; preds = %vector.body.prol.loopexit.unr-lcssa
367 %31 = icmp eq i64 %20, 0
368 br i1 %31, label %middle.block, label %vector.body.preheader.new
370 vector.body.preheader.new: ; preds = %vector.body.prol.loopexit
371 %32 = load i64, i64* bitcast (double* @x0 to i64*), align 8
372 %33 = insertelement <2 x i64> undef, i64 %32, i32 0
373 %34 = shufflevector <2 x i64> %33, <2 x i64> undef, <2 x i32> zeroinitializer
374 %35 = insertelement <2 x i64> undef, i64 %32, i32 0
375 %36 = shufflevector <2 x i64> %35, <2 x i64> undef, <2 x i32> zeroinitializer
376 %37 = load i64, i64* bitcast (double* @x0 to i64*), align 8
377 %38 = insertelement <2 x i64> undef, i64 %37, i32 0
378 %39 = shufflevector <2 x i64> %38, <2 x i64> undef, <2 x i32> zeroinitializer
379 %40 = insertelement <2 x i64> undef, i64 %37, i32 0
380 %41 = shufflevector <2 x i64> %40, <2 x i64> undef, <2 x i32> zeroinitializer
381 br label %vector.body
383 vector.body: ; preds = %vector.body, %vector.body.preheader.new
384 %index = phi i64 [ %index.unr.ph, %vector.body.preheader.new ], [ %index.next.1, %vector.body ]
385 %42 = add i64 %11, %index
386 %43 = getelementptr inbounds double, double* %8, i64 %42
387 %44 = bitcast double* %43 to <2 x i64>*
388 store <2 x i64> %34, <2 x i64>* %44, align 8
389 %45 = getelementptr double, double* %43, i64 2
390 %46 = bitcast double* %45 to <2 x i64>*
391 store <2 x i64> %36, <2 x i64>* %46, align 8
392 %index.next = add i64 %index, 4
393 %47 = add i64 %11, %index.next
394 %48 = getelementptr inbounds double, double* %8, i64 %47
395 %49 = bitcast double* %48 to <2 x i64>*
396 store <2 x i64> %39, <2 x i64>* %49, align 8
397 %50 = getelementptr double, double* %48, i64 2
398 %51 = bitcast double* %50 to <2 x i64>*
399 store <2 x i64> %41, <2 x i64>* %51, align 8
400 %index.next.1 = add i64 %index, 8
401 %52 = icmp eq i64 %index.next.1, %n.vec
402 br i1 %52, label %middle.block.unr-lcssa, label %vector.body
404 middle.block.unr-lcssa: ; preds = %vector.body
405 br label %middle.block
407 middle.block: ; preds = %vector.body.prol.loopexit, %middle.block.unr-lcssa
408 %cmp.n = icmp eq i64 %15, %n.vec
409 br i1 %cmp.n, label %for.cond1.for.inc3_crit_edge, label %for.body2.preheader21
411 for.body2.preheader21: ; preds = %middle.block, %vector.memcheck, %min.iters.checked, %for.body2.preheader
412 %indvars.iv.ph = phi i64 [ %11, %vector.memcheck ], [ %11, %min.iters.checked ], [ %11, %for.body2.preheader ], [ %ind.end, %middle.block ]
415 for.body2: ; preds = %for.body2.preheader21, %for.body2
416 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body2 ], [ %indvars.iv.ph, %for.body2.preheader21 ]
417 %53 = load i64, i64* bitcast (double* @x0 to i64*), align 8
418 %arrayidx = getelementptr inbounds double, double* %8, i64 %indvars.iv
419 %54 = bitcast double* %arrayidx to i64*
420 store i64 %53, i64* %54, align 8
421 %indvars.iv.next = add nsw i64 %indvars.iv, 1
422 %cmp = icmp slt i64 %indvars.iv, -1
423 br i1 %cmp, label %for.body2, label %for.cond1.for.inc3_crit_edge.loopexit
425 for.cond1.for.inc3_crit_edge.loopexit: ; preds = %for.body2
426 br label %for.cond1.for.inc3_crit_edge
428 for.cond1.for.inc3_crit_edge: ; preds = %for.cond1.for.inc3_crit_edge.loopexit, %middle.block
429 %indvars.iv.next.lcssa = phi i64 [ %ind.end, %middle.block ], [ %indvars.iv.next, %for.cond1.for.inc3_crit_edge.loopexit ]
430 %55 = trunc i64 %indvars.iv.next.lcssa to i32
431 store i32 %55, i32* @x2, align 4
434 for.inc3: ; preds = %for.cond1.for.inc3_crit_edge, %for.cond1thread-pre-split
435 %.pr611 = phi i32 [ %55, %for.cond1.for.inc3_crit_edge ], [ %.pr6, %for.cond1thread-pre-split ]
436 %inc4 = add nsw i32 %9, 1
437 %add.ptr = getelementptr inbounds double, double* %8, i64 %idx.ext13
438 %tobool = icmp eq i32 %inc4, 0
439 %indvar.next = add i64 %indvar, 1
440 br i1 %tobool, label %for.cond.for.end5_crit_edge, label %for.cond1thread-pre-split
442 for.cond.for.end5_crit_edge: ; preds = %for.inc3
443 store i8* %uglygep, i8** bitcast (double** @x5 to i8**), align 8
444 store i32 0, i32* @x3, align 4
447 for.end5: ; preds = %for.cond.for.end5_crit_edge, %entry