[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / memcpy-crash-issue63986.ll
blob0e6c1aecb6774a322e3fbe4449346171cb94164a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -O3 -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck %s
4 %"struct.__llvm_libc::rpc::Buffer" = type { [8 x i64] }
6 define void @issue63986(i64 %0, i64 %idxprom) {
7 ; CHECK-LABEL: issue63986:
8 ; CHECK:       ; %bb.0: ; %entry
9 ; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
10 ; CHECK-NEXT:    v_lshlrev_b64 v[4:5], 6, v[2:3]
11 ; CHECK-NEXT:    s_mov_b64 s[4:5], 0
12 ; CHECK-NEXT:  ; %bb.1: ; %loop-memcpy-expansion.preheader
13 ; CHECK-NEXT:    v_lshlrev_b64 v[6:7], 6, v[2:3]
14 ; CHECK-NEXT:    s_mov_b64 s[6:7], 0
15 ; CHECK-NEXT:  .LBB0_2: ; %loop-memcpy-expansion
16 ; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
17 ; CHECK-NEXT:    v_mov_b32_e32 v9, s7
18 ; CHECK-NEXT:    v_mov_b32_e32 v8, s6
19 ; CHECK-NEXT:    flat_load_ubyte v10, v[8:9] offset:5
20 ; CHECK-NEXT:    flat_load_ubyte v11, v[8:9] offset:6
21 ; CHECK-NEXT:    flat_load_ubyte v12, v[8:9] offset:7
22 ; CHECK-NEXT:    flat_load_ubyte v13, v[8:9] offset:3
23 ; CHECK-NEXT:    flat_load_ubyte v14, v[8:9] offset:2
24 ; CHECK-NEXT:    flat_load_ubyte v15, v[8:9] offset:1
25 ; CHECK-NEXT:    flat_load_ubyte v16, v[8:9]
26 ; CHECK-NEXT:    flat_load_ubyte v17, v[8:9] offset:4
27 ; CHECK-NEXT:    flat_load_ubyte v18, v[8:9] offset:13
28 ; CHECK-NEXT:    flat_load_ubyte v19, v[8:9] offset:14
29 ; CHECK-NEXT:    flat_load_ubyte v20, v[8:9] offset:15
30 ; CHECK-NEXT:    flat_load_ubyte v21, v[8:9] offset:11
31 ; CHECK-NEXT:    flat_load_ubyte v22, v[8:9] offset:10
32 ; CHECK-NEXT:    flat_load_ubyte v23, v[8:9] offset:9
33 ; CHECK-NEXT:    flat_load_ubyte v24, v[8:9] offset:8
34 ; CHECK-NEXT:    flat_load_ubyte v25, v[8:9] offset:12
35 ; CHECK-NEXT:    s_add_u32 s4, s4, 1
36 ; CHECK-NEXT:    s_addc_u32 s5, s5, 0
37 ; CHECK-NEXT:    v_add_co_u32_e32 v8, vcc, s6, v6
38 ; CHECK-NEXT:    v_cmp_ge_u64_e64 s[8:9], s[4:5], 2
39 ; CHECK-NEXT:    v_addc_co_u32_e32 v9, vcc, v9, v7, vcc
40 ; CHECK-NEXT:    s_add_u32 s6, s6, 16
41 ; CHECK-NEXT:    s_addc_u32 s7, s7, 0
42 ; CHECK-NEXT:    s_and_b64 vcc, exec, s[8:9]
43 ; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
44 ; CHECK-NEXT:    flat_store_byte v[8:9], v13 offset:3
45 ; CHECK-NEXT:    flat_store_byte v[8:9], v14 offset:2
46 ; CHECK-NEXT:    flat_store_byte v[8:9], v15 offset:1
47 ; CHECK-NEXT:    flat_store_byte v[8:9], v16
48 ; CHECK-NEXT:    flat_store_byte v[8:9], v12 offset:7
49 ; CHECK-NEXT:    flat_store_byte v[8:9], v11 offset:6
50 ; CHECK-NEXT:    flat_store_byte v[8:9], v10 offset:5
51 ; CHECK-NEXT:    flat_store_byte v[8:9], v17 offset:4
52 ; CHECK-NEXT:    flat_store_byte v[8:9], v21 offset:11
53 ; CHECK-NEXT:    flat_store_byte v[8:9], v22 offset:10
54 ; CHECK-NEXT:    flat_store_byte v[8:9], v23 offset:9
55 ; CHECK-NEXT:    flat_store_byte v[8:9], v24 offset:8
56 ; CHECK-NEXT:    flat_store_byte v[8:9], v20 offset:15
57 ; CHECK-NEXT:    flat_store_byte v[8:9], v19 offset:14
58 ; CHECK-NEXT:    flat_store_byte v[8:9], v18 offset:13
59 ; CHECK-NEXT:    flat_store_byte v[8:9], v25 offset:12
60 ; CHECK-NEXT:    s_cbranch_vccz .LBB0_2
61 ; CHECK-NEXT:  ; %bb.3: ; %loop-memcpy-residual-header
62 ; CHECK-NEXT:    s_and_b32 s4, 32, 15
63 ; CHECK-NEXT:    s_mov_b32 s5, 0
64 ; CHECK-NEXT:    s_cbranch_scc0 .LBB0_5
65 ; CHECK-NEXT:  ; %bb.4:
66 ; CHECK-NEXT:    ; implicit-def: $vgpr2_vgpr3
67 ; CHECK-NEXT:    s_branch .LBB0_6
68 ; CHECK-NEXT:  .LBB0_5: ; %loop-memcpy-residual-header.post-loop-memcpy-expansion_crit_edge
69 ; CHECK-NEXT:    v_lshlrev_b64 v[2:3], 6, v[2:3]
70 ; CHECK-NEXT:    s_cbranch_execnz .LBB0_9
71 ; CHECK-NEXT:  .LBB0_6: ; %loop-memcpy-residual.preheader
72 ; CHECK-NEXT:    v_or_b32_e32 v2, 32, v4
73 ; CHECK-NEXT:    v_mov_b32_e32 v3, v5
74 ; CHECK-NEXT:    s_mov_b64 s[6:7], 0
75 ; CHECK-NEXT:  .LBB0_7: ; %loop-memcpy-residual
76 ; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
77 ; CHECK-NEXT:    s_add_u32 s8, 32, s6
78 ; CHECK-NEXT:    s_addc_u32 s9, 0, s7
79 ; CHECK-NEXT:    v_mov_b32_e32 v6, s8
80 ; CHECK-NEXT:    v_mov_b32_e32 v7, s9
81 ; CHECK-NEXT:    flat_load_ubyte v10, v[6:7]
82 ; CHECK-NEXT:    v_mov_b32_e32 v9, s7
83 ; CHECK-NEXT:    v_mov_b32_e32 v7, s5
84 ; CHECK-NEXT:    v_add_co_u32_e32 v8, vcc, s6, v2
85 ; CHECK-NEXT:    s_add_u32 s6, s6, 1
86 ; CHECK-NEXT:    v_mov_b32_e32 v6, s4
87 ; CHECK-NEXT:    v_addc_co_u32_e32 v9, vcc, v3, v9, vcc
88 ; CHECK-NEXT:    s_addc_u32 s7, s7, 0
89 ; CHECK-NEXT:    v_cmp_lt_u64_e32 vcc, s[6:7], v[6:7]
90 ; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
91 ; CHECK-NEXT:    flat_store_byte v[8:9], v10
92 ; CHECK-NEXT:    s_cbranch_vccnz .LBB0_7
93 ; CHECK-NEXT:  ; %bb.8:
94 ; CHECK-NEXT:    v_mov_b32_e32 v2, v4
95 ; CHECK-NEXT:    v_mov_b32_e32 v3, v5
96 ; CHECK-NEXT:  .LBB0_9: ; %post-loop-memcpy-expansion
97 ; CHECK-NEXT:    v_lshrrev_b64 v[4:5], 4, v[0:1]
98 ; CHECK-NEXT:    v_and_b32_e32 v6, 15, v0
99 ; CHECK-NEXT:    v_mov_b32_e32 v7, 0
100 ; CHECK-NEXT:    v_and_b32_e32 v0, -16, v0
101 ; CHECK-NEXT:    v_cmp_ne_u64_e64 s[4:5], 0, v[4:5]
102 ; CHECK-NEXT:    v_cmp_ne_u64_e64 s[6:7], 0, v[6:7]
103 ; CHECK-NEXT:    v_add_co_u32_e32 v8, vcc, v2, v0
104 ; CHECK-NEXT:    v_addc_co_u32_e32 v9, vcc, v3, v1, vcc
105 ; CHECK-NEXT:    s_branch .LBB0_12
106 ; CHECK-NEXT:  .LBB0_10: ; %Flow19
107 ; CHECK-NEXT:    ; in Loop: Header=BB0_12 Depth=1
108 ; CHECK-NEXT:    s_or_b64 exec, exec, s[10:11]
109 ; CHECK-NEXT:    s_mov_b64 s[8:9], 0
110 ; CHECK-NEXT:  .LBB0_11: ; %Flow21
111 ; CHECK-NEXT:    ; in Loop: Header=BB0_12 Depth=1
112 ; CHECK-NEXT:    s_andn2_b64 vcc, exec, s[8:9]
113 ; CHECK-NEXT:    s_cbranch_vccz .LBB0_20
114 ; CHECK-NEXT:  .LBB0_12: ; %while.cond
115 ; CHECK-NEXT:    ; =>This Loop Header: Depth=1
116 ; CHECK-NEXT:    ; Child Loop BB0_14 Depth 2
117 ; CHECK-NEXT:    ; Child Loop BB0_18 Depth 2
118 ; CHECK-NEXT:    s_and_saveexec_b64 s[8:9], s[4:5]
119 ; CHECK-NEXT:    s_cbranch_execz .LBB0_15
120 ; CHECK-NEXT:  ; %bb.13: ; %loop-memcpy-expansion2.preheader
121 ; CHECK-NEXT:    ; in Loop: Header=BB0_12 Depth=1
122 ; CHECK-NEXT:    s_mov_b64 s[10:11], 0
123 ; CHECK-NEXT:    s_mov_b64 s[12:13], 0
124 ; CHECK-NEXT:    s_mov_b64 s[14:15], 0
125 ; CHECK-NEXT:  .LBB0_14: ; %loop-memcpy-expansion2
126 ; CHECK-NEXT:    ; Parent Loop BB0_12 Depth=1
127 ; CHECK-NEXT:    ; => This Inner Loop Header: Depth=2
128 ; CHECK-NEXT:    v_mov_b32_e32 v10, s10
129 ; CHECK-NEXT:    v_mov_b32_e32 v11, s11
130 ; CHECK-NEXT:    flat_load_ubyte v12, v[10:11] offset:5
131 ; CHECK-NEXT:    flat_load_ubyte v13, v[10:11] offset:6
132 ; CHECK-NEXT:    flat_load_ubyte v14, v[10:11] offset:7
133 ; CHECK-NEXT:    flat_load_ubyte v15, v[10:11] offset:3
134 ; CHECK-NEXT:    flat_load_ubyte v16, v[10:11] offset:2
135 ; CHECK-NEXT:    flat_load_ubyte v17, v[10:11] offset:1
136 ; CHECK-NEXT:    flat_load_ubyte v18, v[10:11]
137 ; CHECK-NEXT:    flat_load_ubyte v19, v[10:11] offset:4
138 ; CHECK-NEXT:    flat_load_ubyte v20, v[10:11] offset:13
139 ; CHECK-NEXT:    flat_load_ubyte v21, v[10:11] offset:14
140 ; CHECK-NEXT:    flat_load_ubyte v22, v[10:11] offset:15
141 ; CHECK-NEXT:    flat_load_ubyte v23, v[10:11] offset:11
142 ; CHECK-NEXT:    flat_load_ubyte v24, v[10:11] offset:10
143 ; CHECK-NEXT:    flat_load_ubyte v25, v[10:11] offset:9
144 ; CHECK-NEXT:    flat_load_ubyte v26, v[10:11] offset:8
145 ; CHECK-NEXT:    flat_load_ubyte v27, v[10:11] offset:12
146 ; CHECK-NEXT:    s_add_u32 s14, s14, 1
147 ; CHECK-NEXT:    v_add_co_u32_e32 v10, vcc, s10, v2
148 ; CHECK-NEXT:    v_addc_co_u32_e32 v11, vcc, v11, v3, vcc
149 ; CHECK-NEXT:    s_addc_u32 s15, s15, 0
150 ; CHECK-NEXT:    s_add_u32 s10, s10, 16
151 ; CHECK-NEXT:    v_cmp_ge_u64_e32 vcc, s[14:15], v[4:5]
152 ; CHECK-NEXT:    s_addc_u32 s11, s11, 0
153 ; CHECK-NEXT:    s_or_b64 s[12:13], vcc, s[12:13]
154 ; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
155 ; CHECK-NEXT:    flat_store_byte v[10:11], v15 offset:3
156 ; CHECK-NEXT:    flat_store_byte v[10:11], v16 offset:2
157 ; CHECK-NEXT:    flat_store_byte v[10:11], v17 offset:1
158 ; CHECK-NEXT:    flat_store_byte v[10:11], v18
159 ; CHECK-NEXT:    flat_store_byte v[10:11], v14 offset:7
160 ; CHECK-NEXT:    flat_store_byte v[10:11], v13 offset:6
161 ; CHECK-NEXT:    flat_store_byte v[10:11], v12 offset:5
162 ; CHECK-NEXT:    flat_store_byte v[10:11], v19 offset:4
163 ; CHECK-NEXT:    flat_store_byte v[10:11], v23 offset:11
164 ; CHECK-NEXT:    flat_store_byte v[10:11], v24 offset:10
165 ; CHECK-NEXT:    flat_store_byte v[10:11], v25 offset:9
166 ; CHECK-NEXT:    flat_store_byte v[10:11], v26 offset:8
167 ; CHECK-NEXT:    flat_store_byte v[10:11], v22 offset:15
168 ; CHECK-NEXT:    flat_store_byte v[10:11], v21 offset:14
169 ; CHECK-NEXT:    flat_store_byte v[10:11], v20 offset:13
170 ; CHECK-NEXT:    flat_store_byte v[10:11], v27 offset:12
171 ; CHECK-NEXT:    s_andn2_b64 exec, exec, s[12:13]
172 ; CHECK-NEXT:    s_cbranch_execnz .LBB0_14
173 ; CHECK-NEXT:  .LBB0_15: ; %Flow20
174 ; CHECK-NEXT:    ; in Loop: Header=BB0_12 Depth=1
175 ; CHECK-NEXT:    s_or_b64 exec, exec, s[8:9]
176 ; CHECK-NEXT:    s_mov_b64 s[8:9], -1
177 ; CHECK-NEXT:    s_cbranch_execz .LBB0_11
178 ; CHECK-NEXT:  ; %bb.16: ; %loop-memcpy-residual-header5
179 ; CHECK-NEXT:    ; in Loop: Header=BB0_12 Depth=1
180 ; CHECK-NEXT:    s_and_saveexec_b64 s[8:9], s[6:7]
181 ; CHECK-NEXT:    s_xor_b64 s[10:11], exec, s[8:9]
182 ; CHECK-NEXT:    s_cbranch_execz .LBB0_10
183 ; CHECK-NEXT:  ; %bb.17: ; %loop-memcpy-residual4.preheader
184 ; CHECK-NEXT:    ; in Loop: Header=BB0_12 Depth=1
185 ; CHECK-NEXT:    s_mov_b64 s[12:13], 0
186 ; CHECK-NEXT:    s_mov_b64 s[14:15], 0
187 ; CHECK-NEXT:  .LBB0_18: ; %loop-memcpy-residual4
188 ; CHECK-NEXT:    ; Parent Loop BB0_12 Depth=1
189 ; CHECK-NEXT:    ; => This Inner Loop Header: Depth=2
190 ; CHECK-NEXT:    v_mov_b32_e32 v12, s15
191 ; CHECK-NEXT:    v_add_co_u32_e32 v10, vcc, s14, v0
192 ; CHECK-NEXT:    v_addc_co_u32_e32 v11, vcc, v1, v12, vcc
193 ; CHECK-NEXT:    flat_load_ubyte v13, v[10:11]
194 ; CHECK-NEXT:    v_add_co_u32_e32 v10, vcc, s14, v8
195 ; CHECK-NEXT:    s_add_u32 s14, s14, 1
196 ; CHECK-NEXT:    s_addc_u32 s15, s15, 0
197 ; CHECK-NEXT:    v_cmp_ge_u64_e64 s[8:9], s[14:15], v[6:7]
198 ; CHECK-NEXT:    v_addc_co_u32_e32 v11, vcc, v9, v12, vcc
199 ; CHECK-NEXT:    s_or_b64 s[12:13], s[8:9], s[12:13]
200 ; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
201 ; CHECK-NEXT:    flat_store_byte v[10:11], v13
202 ; CHECK-NEXT:    s_andn2_b64 exec, exec, s[12:13]
203 ; CHECK-NEXT:    s_cbranch_execnz .LBB0_18
204 ; CHECK-NEXT:  ; %bb.19: ; %Flow
205 ; CHECK-NEXT:    ; in Loop: Header=BB0_12 Depth=1
206 ; CHECK-NEXT:    s_or_b64 exec, exec, s[12:13]
207 ; CHECK-NEXT:    s_branch .LBB0_10
208 ; CHECK-NEXT:  .LBB0_20: ; %DummyReturnBlock
209 ; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
210 ; CHECK-NEXT:    s_setpc_b64 s[30:31]
211 entry:
212   %arrayidx = getelementptr [32 x %"struct.__llvm_libc::rpc::Buffer"], ptr null, i64 0, i64 %idxprom
213   %spec.select = tail call i64 @llvm.umin.i64(i64 sub (i64 ptrtoint (ptr addrspacecast (ptr addrspace(4) inttoptr (i64 32 to ptr addrspace(4)) to ptr) to i64), i64 ptrtoint (ptr addrspacecast (ptr addrspace(4) null to ptr) to i64)), i64 56)
214   tail call void @llvm.memcpy.p0.p0.i64(ptr %arrayidx, ptr null, i64 %spec.select, i1 false)
215   br label %while.cond
217 while.cond:                         ; preds = %while.cond
218   tail call void @llvm.memcpy.p0.p0.i64(ptr %arrayidx, ptr null, i64 %0, i1 false)
219   br label %while.cond
222 define void @issue63986_reduced_expanded(i64 %idxprom) {
223 ; CHECK-LABEL: issue63986_reduced_expanded:
224 ; CHECK:       ; %bb.0: ; %entry
225 ; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
226 ; CHECK-NEXT:  ; %bb.1: ; %loop-memcpy-expansion.preheader
227 ; CHECK-NEXT:    s_setpc_b64 s[30:31]
228 ; CHECK-NEXT:  ; %bb.2: ; %loop-memcpy-residual-header
229 ; CHECK-NEXT:    s_and_b32 s4, 32, 15
230 ; CHECK-NEXT:    s_mov_b32 s5, 0
231 ; CHECK-NEXT:    s_cbranch_scc0 .LBB1_4
232 ; CHECK-NEXT:  ; %bb.3:
233 ; CHECK-NEXT:    ; implicit-def: $vgpr0_vgpr1
234 ; CHECK-NEXT:    s_branch .LBB1_5
235 ; CHECK-NEXT:  .LBB1_4: ; %loop-memcpy-residual-header.post-loop-memcpy-expansion_crit_edge
236 ; CHECK-NEXT:    v_lshlrev_b64 v[0:1], 1, v[0:1]
237 ; CHECK-NEXT:    s_cbranch_execnz .LBB1_8
238 ; CHECK-NEXT:  .LBB1_5: ; %loop-memcpy-residual.preheader
239 ; CHECK-NEXT:    s_mov_b64 s[6:7], 0
240 ; CHECK-NEXT:  .LBB1_6: ; %loop-memcpy-residual
241 ; CHECK-NEXT:    s_add_u32 s6, s6, 1
242 ; CHECK-NEXT:    v_mov_b32_e32 v0, s4
243 ; CHECK-NEXT:    v_mov_b32_e32 v1, s5
244 ; CHECK-NEXT:    s_addc_u32 s7, s7, 0
245 ; CHECK-NEXT:    v_cmp_lt_u64_e32 vcc, s[6:7], v[0:1]
246 ; CHECK-NEXT:    s_mov_b64 s[6:7], 1
247 ; CHECK-NEXT:    s_cbranch_vccnz .LBB1_6
248 ; CHECK-NEXT:  ; %bb.7: ; %Flow
249 ; CHECK-NEXT:    v_mov_b32_e32 v0, 0
250 ; CHECK-NEXT:    v_mov_b32_e32 v1, 0
251 ; CHECK-NEXT:  .LBB1_8: ; %post-loop-memcpy-expansion
252 ; CHECK-NEXT:    v_mov_b32_e32 v2, 0
253 ; CHECK-NEXT:    s_and_b64 vcc, exec, 0
254 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:3
255 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:2
256 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:1
257 ; CHECK-NEXT:    flat_store_byte v[0:1], v2
258 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:7
259 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:6
260 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:5
261 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:4
262 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:11
263 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:10
264 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:9
265 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:8
266 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:15
267 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:14
268 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:13
269 ; CHECK-NEXT:    flat_store_byte v[0:1], v2 offset:12
270 ; CHECK-NEXT:  .LBB1_9: ; %loop-memcpy-expansion2
271 ; CHECK-NEXT:    s_mov_b64 vcc, vcc
272 ; CHECK-NEXT:    s_cbranch_vccz .LBB1_9
273 ; CHECK-NEXT:  ; %bb.10: ; %DummyReturnBlock
274 ; CHECK-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
275 ; CHECK-NEXT:    s_setpc_b64 s[30:31]
276 entry:
277   %spec.select = tail call i64 @llvm.umin.i64(i64 sub (i64 ptrtoint (ptr addrspacecast (ptr addrspace(4) inttoptr (i64 32 to ptr addrspace(4)) to ptr) to i64), i64 ptrtoint (ptr addrspacecast (ptr addrspace(4) null to ptr) to i64)), i64 56)
278   %i = trunc i64 %spec.select to i32
279   %i1 = urem i32 %i, 16
280   %i2 = zext i32 %i to i64
281   %i3 = zext i32 %i1 to i64
282   %i4 = icmp ne i64 %i2, 0
283   br i1 %i4, label %loop-memcpy-expansion.preheader, label %loop-memcpy-residual-header
285 loop-memcpy-expansion.preheader:                  ; preds = %entry
286   ret void
288 loop-memcpy-residual:                             ; preds = %loop-memcpy-residual.preheader, %loop-memcpy-residual
289   %residual-loop-index1 = phi i64 [ 1, %loop-memcpy-residual ], [ 0, %loop-memcpy-residual.preheader ]
290   %i5 = add i64 %residual-loop-index1, 1
291   %i6 = icmp ult i64 %i5, %i3
292   br i1 %i6, label %loop-memcpy-residual, label %post-loop-memcpy-expansion
294 post-loop-memcpy-expansion:                       ; preds = %loop-memcpy-residual-header.post-loop-memcpy-expansion_crit_edge, %loop-memcpy-residual
295   %.pre-phi = phi i64 [ %.pre, %loop-memcpy-residual-header.post-loop-memcpy-expansion_crit_edge ], [ 0, %loop-memcpy-residual ]
296   br label %loop-memcpy-expansion2
298 loop-memcpy-expansion2:                           ; preds = %loop-memcpy-expansion2, %post-loop-memcpy-expansion
299   %scevgep7 = getelementptr i8, ptr null, i64 %.pre-phi
300   store <4 x i32> zeroinitializer, ptr %scevgep7, align 1
301   br label %loop-memcpy-expansion2
303 loop-memcpy-residual-header:                      ; preds = %entry
304   %i7 = icmp ne i64 %i3, 0
305   br i1 %i7, label %loop-memcpy-residual.preheader, label %loop-memcpy-residual-header.post-loop-memcpy-expansion_crit_edge
307 loop-memcpy-residual-header.post-loop-memcpy-expansion_crit_edge: ; preds = %loop-memcpy-residual-header
308   %.pre = shl i64 %idxprom, 1
309   br label %post-loop-memcpy-expansion
311 loop-memcpy-residual.preheader:                   ; preds = %loop-memcpy-residual-header
312   br label %loop-memcpy-residual
315 declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #0
316 declare i64 @llvm.umin.i64(i64, i64) #1
318 attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
319 attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }