[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / dag-update-nodetomatch.ll
blobadb7319fe80b11430463ae2450c5111292b9ac54
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 ptr null, align 8
21 ; Check that compiler does not crash.
22 ; Test for PR30775
23 define void @_Z1nv() local_unnamed_addr {
24 ; CHECK-LABEL: _Z1nv:
25 ; CHECK:       # %bb.0: # %entry
26 ; CHECK-NEXT:    movq k@GOTPCREL(%rip), %rax
27 ; CHECK-NEXT:    movl 4(%rax), %edx
28 ; CHECK-NEXT:    movq c@GOTPCREL(%rip), %rax
29 ; CHECK-NEXT:    movswl (%rax), %ecx
30 ; CHECK-NEXT:    movq b@GOTPCREL(%rip), %rax
31 ; CHECK-NEXT:    movswl (%rax), %edi
32 ; CHECK-NEXT:    movq a@GOTPCREL(%rip), %rsi
33 ; CHECK-NEXT:    movl (%rsi), %esi
34 ; CHECK-NEXT:    movq l@GOTPCREL(%rip), %r8
35 ; CHECK-NEXT:    movl (%r8), %r8d
36 ; CHECK-NEXT:    movl %r8d, %r9d
37 ; CHECK-NEXT:    shll $7, %r9d
38 ; CHECK-NEXT:    sarl $7, %r9d
39 ; CHECK-NEXT:    negl %r9d
40 ; CHECK-NEXT:    testl %esi, %esi
41 ; CHECK-NEXT:    cmovel %esi, %r9d
42 ; CHECK-NEXT:    movzwl %dx, %r10d
43 ; CHECK-NEXT:    leal (%rcx,%r10,2), %ecx
44 ; CHECK-NEXT:    addl %edi, %ecx
45 ; CHECK-NEXT:    cmpl %r9d, %ecx
46 ; CHECK-NEXT:    sete %dil
47 ; CHECK-NEXT:    testl $33554431, %r8d # imm = 0x1FFFFFF
48 ; CHECK-NEXT:    sete %r8b
49 ; CHECK-NEXT:    orb %dil, %r8b
50 ; CHECK-NEXT:    movzbl %r8b, %edi
51 ; CHECK-NEXT:    movq e@GOTPCREL(%rip), %r8
52 ; CHECK-NEXT:    movw %di, (%r8)
53 ; CHECK-NEXT:    notl %ecx
54 ; CHECK-NEXT:    shrl $31, %ecx
55 ; CHECK-NEXT:    addl %edx, %ecx
56 ; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
57 ; CHECK-NEXT:    sarl %cl, %esi
58 ; CHECK-NEXT:    movw %si, (%rax)
59 ; CHECK-NEXT:    retq
60 entry:
61   %bf.load = load i32, ptr getelementptr inbounds (%struct.m, ptr @k, i64 0, i32 0, i32 1), align 4
62   %0 = load i16, ptr @c, align 2
63   %conv = sext i16 %0 to i32
64   %1 = load i16, ptr @b, align 2
65   %conv1 = sext i16 %1 to i32
66   %2 = load i32, ptr @a, align 4
67   %tobool = icmp ne i32 %2, 0
68   %bf.load3 = load i32, ptr @l, 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, ptr @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, ptr @b, align 2
92   ret void
95 ; Test for PR31536
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), %ebx
119 ; CHECK-NEXT:    andl $511, %ebx # imm = 0x1FF
120 ; CHECK-NEXT:    leaq 1(%rbx), %rax
121 ; CHECK-NEXT:    movq x4@GOTPCREL(%rip), %rcx
122 ; CHECK-NEXT:    movl %eax, (%rcx)
123 ; CHECK-NEXT:    movq x3@GOTPCREL(%rip), %rcx
124 ; CHECK-NEXT:    movl (%rcx), %ecx
125 ; CHECK-NEXT:    testl %ecx, %ecx
126 ; CHECK-NEXT:    je .LBB1_18
127 ; CHECK-NEXT:  # %bb.1: # %for.cond1thread-pre-split.lr.ph
128 ; CHECK-NEXT:    movq x5@GOTPCREL(%rip), %rdx
129 ; CHECK-NEXT:    movq (%rdx), %rsi
130 ; CHECK-NEXT:    movl %ecx, %edx
131 ; CHECK-NEXT:    notl %edx
132 ; CHECK-NEXT:    leaq 8(,%rdx,8), %rdi
133 ; CHECK-NEXT:    imulq %rax, %rdi
134 ; CHECK-NEXT:    addq %rsi, %rdi
135 ; CHECK-NEXT:    movq x2@GOTPCREL(%rip), %r8
136 ; CHECK-NEXT:    movl (%r8), %edx
137 ; CHECK-NEXT:    leal 8(,%rbx,8), %eax
138 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
139 ; CHECK-NEXT:    leaq 8(%rsi), %rax
140 ; CHECK-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
141 ; CHECK-NEXT:    leaq 32(%rsi), %r11
142 ; CHECK-NEXT:    leaq 8(,%rbx,8), %rbx
143 ; CHECK-NEXT:    xorl %r14d, %r14d
144 ; CHECK-NEXT:    movq x0@GOTPCREL(%rip), %r15
145 ; CHECK-NEXT:    movq %rsi, %r12
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 %edx, (%r8)
151 ; CHECK-NEXT:  .LBB1_16: # %for.inc3
152 ; CHECK-NEXT:    # in Loop: Header=BB1_2 Depth=1
153 ; CHECK-NEXT:    addq %rbx, %r12
154 ; CHECK-NEXT:    incq %r14
155 ; CHECK-NEXT:    addq %rbx, %r11
156 ; CHECK-NEXT:    incl %ecx
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 %edx, %edx
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 %edx, %r13
167 ; CHECK-NEXT:    testq %r13, %r13
168 ; CHECK-NEXT:    movq $-1, %rbp
169 ; CHECK-NEXT:    cmovnsq %r13, %rbp
170 ; CHECK-NEXT:    subq %r13, %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, %rdx
177 ; CHECK-NEXT:    andq $-4, %rdx
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), %rax # 8-byte Reload
182 ; CHECK-NEXT:    imulq %r14, %rax
183 ; CHECK-NEXT:    leaq (%rsi,%rax), %r10
184 ; CHECK-NEXT:    leaq (%r10,%r13,8), %r9
185 ; CHECK-NEXT:    testq %r13, %r13
186 ; CHECK-NEXT:    movq $-1, %r10
187 ; CHECK-NEXT:    cmovnsq %r13, %r10
188 ; CHECK-NEXT:    cmpq %r15, %r9
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), %rax # 8-byte Folded Reload
193 ; CHECK-NEXT:    leaq (%rax,%r10,8), %rax
194 ; CHECK-NEXT:    cmpq %r15, %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(%rdx), %rax
199 ; CHECK-NEXT:    btl $2, %eax
200 ; CHECK-NEXT:    jb .LBB1_8
201 ; CHECK-NEXT:  # %bb.9: # %vector.body.prol.preheader
202 ; CHECK-NEXT:    # in Loop: Header=BB1_2 Depth=1
203 ; CHECK-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
204 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
205 ; CHECK-NEXT:    movdqu %xmm0, (%r12,%r13,8)
206 ; CHECK-NEXT:    movdqu %xmm0, 16(%r12,%r13,8)
207 ; CHECK-NEXT:    movl $4, %r10d
208 ; CHECK-NEXT:    shrq $2, %rax
209 ; CHECK-NEXT:    jne .LBB1_11
210 ; CHECK-NEXT:    jmp .LBB1_13
211 ; CHECK-NEXT:  .LBB1_8: # in Loop: Header=BB1_2 Depth=1
212 ; CHECK-NEXT:    xorl %r10d, %r10d
213 ; CHECK-NEXT:    shrq $2, %rax
214 ; CHECK-NEXT:    je .LBB1_13
215 ; CHECK-NEXT:  .LBB1_11: # %vector.body.preheader.new
216 ; CHECK-NEXT:    # in Loop: Header=BB1_2 Depth=1
217 ; CHECK-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
218 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
219 ; CHECK-NEXT:    movq %r10, %rax
220 ; CHECK-NEXT:    subq %rdx, %rax
221 ; CHECK-NEXT:    addq %r13, %r10
222 ; CHECK-NEXT:    leaq (%r11,%r10,8), %r10
223 ; CHECK-NEXT:    .p2align 4, 0x90
224 ; CHECK-NEXT:  .LBB1_12: # %vector.body
225 ; CHECK-NEXT:    # Parent Loop BB1_2 Depth=1
226 ; CHECK-NEXT:    # => This Inner Loop Header: Depth=2
227 ; CHECK-NEXT:    movdqu %xmm0, -32(%r10)
228 ; CHECK-NEXT:    movdqu %xmm0, -16(%r10)
229 ; CHECK-NEXT:    movdqu %xmm0, (%r10)
230 ; CHECK-NEXT:    movdqu %xmm0, 16(%r10)
231 ; CHECK-NEXT:    addq $64, %r10
232 ; CHECK-NEXT:    addq $8, %rax
233 ; CHECK-NEXT:    jne .LBB1_12
234 ; CHECK-NEXT:  .LBB1_13: # %middle.block
235 ; CHECK-NEXT:    # in Loop: Header=BB1_2 Depth=1
236 ; CHECK-NEXT:    addq %rdx, %r13
237 ; CHECK-NEXT:    cmpq %rdx, %rbp
238 ; CHECK-NEXT:    movq %r13, %rdx
239 ; CHECK-NEXT:    je .LBB1_15
240 ; CHECK-NEXT:    .p2align 4, 0x90
241 ; CHECK-NEXT:  .LBB1_14: # %for.body2
242 ; CHECK-NEXT:    # Parent Loop BB1_2 Depth=1
243 ; CHECK-NEXT:    # => This Inner Loop Header: Depth=2
244 ; CHECK-NEXT:    movq (%r15), %rax
245 ; CHECK-NEXT:    movq %rax, (%r12,%r13,8)
246 ; CHECK-NEXT:    leaq 1(%r13), %rdx
247 ; CHECK-NEXT:    cmpq $-1, %r13
248 ; CHECK-NEXT:    movq %rdx, %r13
249 ; CHECK-NEXT:    jl .LBB1_14
250 ; CHECK-NEXT:    jmp .LBB1_15
251 ; CHECK-NEXT:  .LBB1_17: # %for.cond.for.end5_crit_edge
252 ; CHECK-NEXT:    movq x5@GOTPCREL(%rip), %rax
253 ; CHECK-NEXT:    movq %rdi, (%rax)
254 ; CHECK-NEXT:    movq x3@GOTPCREL(%rip), %rax
255 ; CHECK-NEXT:    movl $0, (%rax)
256 ; CHECK-NEXT:  .LBB1_18: # %for.end5
257 ; CHECK-NEXT:    popq %rbx
258 ; CHECK-NEXT:    .cfi_def_cfa_offset 48
259 ; CHECK-NEXT:    popq %r12
260 ; CHECK-NEXT:    .cfi_def_cfa_offset 40
261 ; CHECK-NEXT:    popq %r13
262 ; CHECK-NEXT:    .cfi_def_cfa_offset 32
263 ; CHECK-NEXT:    popq %r14
264 ; CHECK-NEXT:    .cfi_def_cfa_offset 24
265 ; CHECK-NEXT:    popq %r15
266 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
267 ; CHECK-NEXT:    popq %rbp
268 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
269 ; CHECK-NEXT:    retq
270 entry:
271   %0 = load i32, ptr @x1, align 4
272   %and = and i32 %0, 511
273   %add = add nuw nsw i32 %and, 1
274   store i32 %add, ptr @x4, align 4
275   %.pr = load i32, ptr @x3, align 4
276   %tobool8 = icmp eq i32 %.pr, 0
277   br i1 %tobool8, label %for.end5, label %for.cond1thread-pre-split.lr.ph
279 for.cond1thread-pre-split.lr.ph:                  ; preds = %entry
280   %idx.ext13 = zext i32 %add to i64
281   %x5.promoted = load ptr, ptr @x5, align 8
282   %1 = xor i32 %.pr, -1
283   %2 = zext i32 %1 to i64
284   %3 = shl nuw nsw i64 %2, 3
285   %4 = add nuw nsw i64 %3, 8
286   %5 = mul nuw nsw i64 %4, %idx.ext13
287   %uglygep = getelementptr i8, ptr %x5.promoted, i64 %5
288   %.pr6.pre = load i32, ptr @x2, align 4
289   %6 = shl nuw nsw i32 %and, 3
290   %addconv = add nuw nsw i32 %6, 8
291   %7 = zext i32 %addconv to i64
292   %scevgep15 = getelementptr double, ptr %x5.promoted, i64 1
293   br label %for.cond1thread-pre-split
295 for.cond1thread-pre-split:                        ; preds = %for.cond1thread-pre-split.lr.ph, %for.inc3
296   %indvar = phi i64 [ 0, %for.cond1thread-pre-split.lr.ph ], [ %indvar.next, %for.inc3 ]
297   %.pr6 = phi i32 [ %.pr6.pre, %for.cond1thread-pre-split.lr.ph ], [ %.pr611, %for.inc3 ]
298   %8 = phi ptr [ %x5.promoted, %for.cond1thread-pre-split.lr.ph ], [ %add.ptr, %for.inc3 ]
299   %9 = phi i32 [ %.pr, %for.cond1thread-pre-split.lr.ph ], [ %inc4, %for.inc3 ]
300   %10 = mul i64 %7, %indvar
301   %uglygep14 = getelementptr i8, ptr %x5.promoted, i64 %10
302   %uglygep17 = getelementptr i8, ptr %scevgep15, i64 %10
303   %cmp7 = icmp slt i32 %.pr6, 0
304   br i1 %cmp7, label %for.body2.preheader, label %for.inc3
306 for.body2.preheader:                              ; preds = %for.cond1thread-pre-split
307   %11 = sext i32 %.pr6 to i64
308   %12 = sext i32 %.pr6 to i64
309   %13 = icmp sgt i64 %12, -1
310   %smax = select i1 %13, i64 %12, i64 -1
311   %14 = add nsw i64 %smax, 1
312   %15 = sub nsw i64 %14, %12
313   %min.iters.check = icmp ult i64 %15, 4
314   br i1 %min.iters.check, label %for.body2.preheader21, label %min.iters.checked
316 min.iters.checked:                                ; preds = %for.body2.preheader
317   %n.vec = and i64 %15, -4
318   %cmp.zero = icmp eq i64 %n.vec, 0
319   br i1 %cmp.zero, label %for.body2.preheader21, label %vector.memcheck
321 vector.memcheck:                                  ; preds = %min.iters.checked
322   %16 = shl nsw i64 %11, 3
323   %scevgep = getelementptr i8, ptr %uglygep14, i64 %16
324   %17 = icmp sgt i64 %11, -1
325   %smax18 = select i1 %17, i64 %11, i64 -1
326   %18 = shl nsw i64 %smax18, 3
327   %scevgep19 = getelementptr i8, ptr %uglygep17, i64 %18
328   %bound0 = icmp ult ptr %scevgep, @x0
329   %bound1 = icmp ugt ptr %scevgep19, @x0
330   %memcheck.conflict = and i1 %bound0, %bound1
331   %ind.end = add nsw i64 %11, %n.vec
332   br i1 %memcheck.conflict, label %for.body2.preheader21, label %vector.body.preheader
334 vector.body.preheader:                            ; preds = %vector.memcheck
335   %19 = add nsw i64 %n.vec, -4
336   %20 = lshr exact i64 %19, 2
337   %21 = and i64 %20, 1
338   %lcmp.mod = icmp eq i64 %21, 0
339   br i1 %lcmp.mod, label %vector.body.prol.preheader, label %vector.body.prol.loopexit.unr-lcssa
341 vector.body.prol.preheader:                       ; preds = %vector.body.preheader
342   br label %vector.body.prol
344 vector.body.prol:                                 ; preds = %vector.body.prol.preheader
345   %22 = load i64, ptr @x0, align 8
346   %23 = insertelement <2 x i64> undef, i64 %22, i32 0
347   %24 = shufflevector <2 x i64> %23, <2 x i64> undef, <2 x i32> zeroinitializer
348   %25 = insertelement <2 x i64> undef, i64 %22, i32 0
349   %26 = shufflevector <2 x i64> %25, <2 x i64> undef, <2 x i32> zeroinitializer
350   %27 = getelementptr inbounds double, ptr %8, i64 %11
351   store <2 x i64> %24, ptr %27, align 8
352   %28 = getelementptr double, ptr %27, i64 2
353   store <2 x i64> %26, ptr %28, align 8
354   br label %vector.body.prol.loopexit.unr-lcssa
356 vector.body.prol.loopexit.unr-lcssa:              ; preds = %vector.body.preheader, %vector.body.prol
357   %index.unr.ph = phi i64 [ 4, %vector.body.prol ], [ 0, %vector.body.preheader ]
358   br label %vector.body.prol.loopexit
360 vector.body.prol.loopexit:                        ; preds = %vector.body.prol.loopexit.unr-lcssa
361   %29 = icmp eq i64 %20, 0
362   br i1 %29, label %middle.block, label %vector.body.preheader.new
364 vector.body.preheader.new:                        ; preds = %vector.body.prol.loopexit
365   %30 = load i64, ptr @x0, align 8
366   %31 = insertelement <2 x i64> undef, i64 %30, i32 0
367   %32 = shufflevector <2 x i64> %31, <2 x i64> undef, <2 x i32> zeroinitializer
368   %33 = insertelement <2 x i64> undef, i64 %30, i32 0
369   %34 = shufflevector <2 x i64> %33, <2 x i64> undef, <2 x i32> zeroinitializer
370   %35 = load i64, ptr @x0, align 8
371   %36 = insertelement <2 x i64> undef, i64 %35, i32 0
372   %37 = shufflevector <2 x i64> %36, <2 x i64> undef, <2 x i32> zeroinitializer
373   %38 = insertelement <2 x i64> undef, i64 %35, i32 0
374   %39 = shufflevector <2 x i64> %38, <2 x i64> undef, <2 x i32> zeroinitializer
375   br label %vector.body
377 vector.body:                                      ; preds = %vector.body, %vector.body.preheader.new
378   %index = phi i64 [ %index.unr.ph, %vector.body.preheader.new ], [ %index.next.1, %vector.body ]
379   %40 = add i64 %11, %index
380   %41 = getelementptr inbounds double, ptr %8, i64 %40
381   store <2 x i64> %32, ptr %41, align 8
382   %42 = getelementptr double, ptr %41, i64 2
383   store <2 x i64> %34, ptr %42, align 8
384   %index.next = add i64 %index, 4
385   %43 = add i64 %11, %index.next
386   %44 = getelementptr inbounds double, ptr %8, i64 %43
387   store <2 x i64> %37, ptr %44, align 8
388   %45 = getelementptr double, ptr %44, i64 2
389   store <2 x i64> %39, ptr %45, align 8
390   %index.next.1 = add i64 %index, 8
391   %46 = icmp eq i64 %index.next.1, %n.vec
392   br i1 %46, label %middle.block.unr-lcssa, label %vector.body
394 middle.block.unr-lcssa:                           ; preds = %vector.body
395   br label %middle.block
397 middle.block:                                     ; preds = %vector.body.prol.loopexit, %middle.block.unr-lcssa
398   %cmp.n = icmp eq i64 %15, %n.vec
399   br i1 %cmp.n, label %for.cond1.for.inc3_crit_edge, label %for.body2.preheader21
401 for.body2.preheader21:                            ; preds = %middle.block, %vector.memcheck, %min.iters.checked, %for.body2.preheader
402   %indvars.iv.ph = phi i64 [ %11, %vector.memcheck ], [ %11, %min.iters.checked ], [ %11, %for.body2.preheader ], [ %ind.end, %middle.block ]
403   br label %for.body2
405 for.body2:                                        ; preds = %for.body2.preheader21, %for.body2
406   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body2 ], [ %indvars.iv.ph, %for.body2.preheader21 ]
407   %47 = load i64, ptr @x0, align 8
408   %arrayidx = getelementptr inbounds double, ptr %8, i64 %indvars.iv
409   store i64 %47, ptr %arrayidx, align 8
410   %indvars.iv.next = add nsw i64 %indvars.iv, 1
411   %cmp = icmp slt i64 %indvars.iv, -1
412   br i1 %cmp, label %for.body2, label %for.cond1.for.inc3_crit_edge.loopexit
414 for.cond1.for.inc3_crit_edge.loopexit:            ; preds = %for.body2
415   br label %for.cond1.for.inc3_crit_edge
417 for.cond1.for.inc3_crit_edge:                     ; preds = %for.cond1.for.inc3_crit_edge.loopexit, %middle.block
418   %indvars.iv.next.lcssa = phi i64 [ %ind.end, %middle.block ], [ %indvars.iv.next, %for.cond1.for.inc3_crit_edge.loopexit ]
419   %48 = trunc i64 %indvars.iv.next.lcssa to i32
420   store i32 %48, ptr @x2, align 4
421   br label %for.inc3
423 for.inc3:                                         ; preds = %for.cond1.for.inc3_crit_edge, %for.cond1thread-pre-split
424   %.pr611 = phi i32 [ %48, %for.cond1.for.inc3_crit_edge ], [ %.pr6, %for.cond1thread-pre-split ]
425   %inc4 = add nsw i32 %9, 1
426   %add.ptr = getelementptr inbounds double, ptr %8, i64 %idx.ext13
427   %tobool = icmp eq i32 %inc4, 0
428   %indvar.next = add i64 %indvar, 1
429   br i1 %tobool, label %for.cond.for.end5_crit_edge, label %for.cond1thread-pre-split
431 for.cond.for.end5_crit_edge:                      ; preds = %for.inc3
432   store ptr %uglygep, ptr @x5, align 8
433   store i32 0, ptr @x3, align 4
434   br label %for.end5
436 for.end5:                                         ; preds = %for.cond.for.end5_crit_edge, %entry
437   ret void