@@ -146,21 +146,22 @@ llvm.func @invalid_indirect_memset() -> i32 {
146
146
147
147
// CHECK-LABEL: llvm.func @memset_double_use
148
148
llvm.func @memset_double_use () -> i32 {
149
- // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
150
- // CHECK-DAG: %[[ALLOCA_INT:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32
151
- // CHECK-DAG: %[[ALLOCA_FLOAT:.*]] = llvm.alloca %[[ALLOCA_LEN]] x f32
152
- // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8
153
- // After SROA, only one i32 will be actually used, so only 4 bytes will be set.
154
- // CHECK-DAG: %[[MEMSET_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
149
+ // CHECK: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
150
+ // CHECK: %[[ALLOCA_FLOAT:.*]] = llvm.alloca %[[ALLOCA_LEN]] x f32
151
+ // CHECK: %[[ALLOCA_INT:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32
152
+ // CHECK: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8
155
153
%0 = llvm.mlir.constant (1 : i32 ) : i32
156
154
%1 = llvm.alloca %0 x !llvm.struct <" foo" , (i32 , f32 )> {alignment = 8 : i64 } : (i32 ) -> !llvm.ptr
157
155
%memset_value = llvm.mlir.constant (42 : i8 ) : i8
158
156
// 8 bytes means it will span over the two i32 entries.
159
157
%memset_len = llvm.mlir.constant (8 : i32 ) : i32
160
158
// We expect two generated memset, one for each field.
161
159
// CHECK-NOT: "llvm.intr.memset"
162
- // CHECK-DAG: "llvm.intr.memset"(%[[ALLOCA_INT]], %[[MEMSET_VALUE]], %[[MEMSET_LEN]]) <{isVolatile = false}>
163
- // CHECK-DAG: "llvm.intr.memset"(%[[ALLOCA_FLOAT]], %[[MEMSET_VALUE]], %[[MEMSET_LEN]]) <{isVolatile = false}>
160
+ // After SROA, only one i32 will be actually used, so only 4 bytes will be set.
161
+ // CHECK: %[[MEMSET_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
162
+ // CHECK: "llvm.intr.memset"(%[[ALLOCA_INT]], %[[MEMSET_VALUE]], %[[MEMSET_LEN]]) <{isVolatile = false}>
163
+ // CHECK: %[[MEMSET_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
164
+ // CHECK: "llvm.intr.memset"(%[[ALLOCA_FLOAT]], %[[MEMSET_VALUE]], %[[MEMSET_LEN]]) <{isVolatile = false}>
164
165
// CHECK-NOT: "llvm.intr.memset"
165
166
" llvm.intr.memset" (%1 , %memset_value , %memset_len ) <{isVolatile = false }> : (!llvm.ptr , i8 , i32 ) -> ()
166
167
%2 = llvm.getelementptr %1 [0 , 0 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.struct <" foo" , (i32 , f32 )>
@@ -208,21 +209,21 @@ llvm.func @memset_considers_alignment() -> i32 {
208
209
209
210
// CHECK-LABEL: llvm.func @memset_considers_packing
210
211
llvm.func @memset_considers_packing () -> i32 {
211
- // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
212
- // CHECK-DAG: %[[ALLOCA_INT:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32
213
- // CHECK-DAG: %[[ALLOCA_FLOAT:.*]] = llvm.alloca %[[ALLOCA_LEN]] x f32
214
- // CHECK-DAG: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8
215
- // After SROA, only 32-bit values will be actually used, so only 4 bytes will be set.
216
- // CHECK-DAG: %[[MEMSET_LEN_WHOLE:.*]] = llvm.mlir.constant(4 : i32) : i32
217
- // CHECK-DAG: %[[MEMSET_LEN_PARTIAL:.*]] = llvm.mlir.constant(3 : i32) : i32
212
+ // CHECK: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
213
+ // CHECK: %[[ALLOCA_FLOAT:.*]] = llvm.alloca %[[ALLOCA_LEN]] x f32
214
+ // CHECK: %[[ALLOCA_INT:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32
215
+ // CHECK: %[[MEMSET_VALUE:.*]] = llvm.mlir.constant(42 : i8) : i8
218
216
%0 = llvm.mlir.constant (1 : i32 ) : i32
219
217
%1 = llvm.alloca %0 x !llvm.struct <" foo" , packed (i8 , i32 , f32 )> {alignment = 8 : i64 } : (i32 ) -> !llvm.ptr
220
218
%memset_value = llvm.mlir.constant (42 : i8 ) : i8
221
219
// 8 bytes means it will span over all the fields, because there is no padding as the struct is packed.
222
220
%memset_len = llvm.mlir.constant (8 : i32 ) : i32
223
221
// Now all fields are touched by the memset.
224
222
// CHECK-NOT: "llvm.intr.memset"
223
+ // After SROA, only 32-bit values will be actually used, so only 4 bytes will be set.
224
+ // CHECK: %[[MEMSET_LEN_WHOLE:.*]] = llvm.mlir.constant(4 : i32) : i32
225
225
// CHECK: "llvm.intr.memset"(%[[ALLOCA_INT]], %[[MEMSET_VALUE]], %[[MEMSET_LEN_WHOLE]]) <{isVolatile = false}>
226
+ // CHECK: %[[MEMSET_LEN_PARTIAL:.*]] = llvm.mlir.constant(3 : i32) : i32
226
227
// CHECK: "llvm.intr.memset"(%[[ALLOCA_FLOAT]], %[[MEMSET_VALUE]], %[[MEMSET_LEN_PARTIAL]]) <{isVolatile = false}>
227
228
// CHECK-NOT: "llvm.intr.memset"
228
229
" llvm.intr.memset" (%1 , %memset_value , %memset_len ) <{isVolatile = false }> : (!llvm.ptr , i8 , i32 ) -> ()
@@ -241,14 +242,14 @@ llvm.func @memset_considers_packing() -> i32 {
241
242
// CHECK-LABEL: llvm.func @memcpy_dest
242
243
// CHECK-SAME: (%[[OTHER_ARRAY:.*]]: !llvm.ptr)
243
244
llvm.func @memcpy_dest (%other_array: !llvm.ptr ) -> i32 {
244
- // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
245
- // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32
246
- // After SROA, only one i32 will be actually used, so only 4 bytes will be set.
247
- // CHECK-DAG: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
245
+ // CHECK: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
246
+ // CHECK: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32
248
247
%0 = llvm.mlir.constant (1 : i32 ) : i32
249
248
%1 = llvm.alloca %0 x !llvm.array <10 x i32 > : (i32 ) -> !llvm.ptr
250
249
%memcpy_len = llvm.mlir.constant (40 : i32 ) : i32
251
250
// CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<10 x i32>
251
+ // After SROA, only one i32 will be actually used, so only 4 bytes will be set.
252
+ // CHECK: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
252
253
// CHECK: "llvm.intr.memcpy"(%[[ALLOCA]], %[[SLOT_IN_OTHER]], %[[MEMCPY_LEN]]) <{isVolatile = false}>
253
254
" llvm.intr.memcpy" (%1 , %other_array , %memcpy_len ) <{isVolatile = false }> : (!llvm.ptr , !llvm.ptr , i32 ) -> ()
254
255
%2 = llvm.getelementptr %1 [0 , 1 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.array <10 x i32 >
@@ -261,24 +262,27 @@ llvm.func @memcpy_dest(%other_array: !llvm.ptr) -> i32 {
261
262
// CHECK-LABEL: llvm.func @memcpy_src
262
263
// CHECK-SAME: (%[[OTHER_ARRAY:.*]]: !llvm.ptr)
263
264
llvm.func @memcpy_src (%other_array: !llvm.ptr ) -> i32 {
264
- // CHECK-DAG : %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
265
+ // CHECK: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
265
266
// After SROA, only one i32 will be actually used, so only 4 bytes will be set.
266
- // CHECK-DAG: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
267
267
// CHECK-COUNT-4: = llvm.alloca %[[ALLOCA_LEN]] x i32
268
268
%0 = llvm.mlir.constant (1 : i32 ) : i32
269
269
%1 = llvm.alloca %0 x !llvm.array <4 x i32 > : (i32 ) -> !llvm.ptr
270
270
%memcpy_len = llvm.mlir.constant (16 : i32 ) : i32
271
271
// Unfortunately because of FileCheck limitations it is not possible to check which slot gets read from.
272
272
// We can only check that the amount of operations and allocated slots is correct, which should be sufficient
273
273
// as unused slots are not generated.
274
- // CHECK-DAG: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
275
- // CHECK-DAG: "llvm.intr.memcpy"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMCPY_LEN]]) <{isVolatile = false}>
276
- // CHECK-DAG: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
277
- // CHECK-DAG: "llvm.intr.memcpy"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMCPY_LEN]]) <{isVolatile = false}>
278
- // CHECK-DAG: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
279
- // CHECK-DAG: "llvm.intr.memcpy"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMCPY_LEN]]) <{isVolatile = false}>
280
- // CHECK-DAG: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
281
- // CHECK-DAG: "llvm.intr.memcpy"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMCPY_LEN]]) <{isVolatile = false}>
274
+ // CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
275
+ // CHECK: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
276
+ // CHECK: "llvm.intr.memcpy"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMCPY_LEN]]) <{isVolatile = false}>
277
+ // CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
278
+ // CHECK: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
279
+ // CHECK: "llvm.intr.memcpy"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMCPY_LEN]]) <{isVolatile = false}>
280
+ // CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
281
+ // CHECK: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
282
+ // CHECK: "llvm.intr.memcpy"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMCPY_LEN]]) <{isVolatile = false}>
283
+ // CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
284
+ // CHECK: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
285
+ // CHECK: "llvm.intr.memcpy"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMCPY_LEN]]) <{isVolatile = false}>
282
286
" llvm.intr.memcpy" (%other_array , %1 , %memcpy_len ) <{isVolatile = false }> : (!llvm.ptr , !llvm.ptr , i32 ) -> ()
283
287
%2 = llvm.getelementptr %1 [0 , 1 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.array <4 x i32 >
284
288
%3 = llvm.load %2 : !llvm.ptr -> i32
@@ -289,14 +293,19 @@ llvm.func @memcpy_src(%other_array: !llvm.ptr) -> i32 {
289
293
290
294
// CHECK-LABEL: llvm.func @memcpy_double
291
295
llvm.func @memcpy_double () -> i32 {
292
- // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
293
- // CHECK-DAG: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
296
+ // CHECK: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
294
297
%0 = llvm.mlir.constant (1 : i32 ) : i32
295
- // CHECK-COUNT-2: = llvm.alloca %[[ALLOCA_LEN]] x i32
298
+ // CHECK: = llvm.alloca %[[ALLOCA_LEN]] x i32
299
+ // TODO: This should also disappear as a GEP with all zero indices should be
300
+ // ignored.
301
+ // CHECK: = llvm.alloca %[[ALLOCA_LEN]] x !llvm.array<1 x i32>
296
302
%1 = llvm.alloca %0 x !llvm.array <1 x i32 > : (i32 ) -> !llvm.ptr
297
303
%2 = llvm.alloca %0 x !llvm.array <1 x i32 > : (i32 ) -> !llvm.ptr
304
+ // Match the dead constant, to avoid collision with the newly created one.
305
+ // CHECK: llvm.mlir.constant
298
306
%memcpy_len = llvm.mlir.constant (4 : i32 ) : i32
299
307
// CHECK-NOT: "llvm.intr.memcpy"
308
+ // CHECK: %[[MEMCPY_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
300
309
// CHECK: "llvm.intr.memcpy"(%{{.*}}, %{{.*}}, %[[MEMCPY_LEN]]) <{isVolatile = false}>
301
310
// CHECK-NOT: "llvm.intr.memcpy"
302
311
" llvm.intr.memcpy" (%1 , %2 , %memcpy_len ) <{isVolatile = false }> : (!llvm.ptr , !llvm.ptr , i32 ) -> ()
@@ -346,14 +355,14 @@ llvm.func @memcpy_no_volatile(%other_array: !llvm.ptr) -> i32 {
346
355
// CHECK-LABEL: llvm.func @memmove_dest
347
356
// CHECK-SAME: (%[[OTHER_ARRAY:.*]]: !llvm.ptr)
348
357
llvm.func @memmove_dest (%other_array: !llvm.ptr ) -> i32 {
349
- // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
350
- // CHECK-DAG: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32
351
- // After SROA, only one i32 will be actually used, so only 4 bytes will be set.
352
- // CHECK-DAG: %[[MEMMOVE_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
358
+ // CHECK: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
359
+ // CHECK: %[[ALLOCA:.*]] = llvm.alloca %[[ALLOCA_LEN]] x i32
353
360
%0 = llvm.mlir.constant (1 : i32 ) : i32
354
361
%1 = llvm.alloca %0 x !llvm.array <10 x i32 > : (i32 ) -> !llvm.ptr
355
362
%memmove_len = llvm.mlir.constant (40 : i32 ) : i32
356
363
// CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<10 x i32>
364
+ // After SROA, only one i32 will be actually used, so only 4 bytes will be set.
365
+ // CHECK: %[[MEMMOVE_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
357
366
// CHECK: "llvm.intr.memmove"(%[[ALLOCA]], %[[SLOT_IN_OTHER]], %[[MEMMOVE_LEN]]) <{isVolatile = false}>
358
367
" llvm.intr.memmove" (%1 , %other_array , %memmove_len ) <{isVolatile = false }> : (!llvm.ptr , !llvm.ptr , i32 ) -> ()
359
368
%2 = llvm.getelementptr %1 [0 , 1 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.array <10 x i32 >
@@ -366,24 +375,26 @@ llvm.func @memmove_dest(%other_array: !llvm.ptr) -> i32 {
366
375
// CHECK-LABEL: llvm.func @memmove_src
367
376
// CHECK-SAME: (%[[OTHER_ARRAY:.*]]: !llvm.ptr)
368
377
llvm.func @memmove_src (%other_array: !llvm.ptr ) -> i32 {
369
- // CHECK-DAG: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
370
- // After SROA, only one i32 will be actually used, so only 4 bytes will be set.
371
- // CHECK-DAG: %[[MEMMOVE_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
378
+ // CHECK: %[[ALLOCA_LEN:.*]] = llvm.mlir.constant(1 : i32) : i32
372
379
// CHECK-COUNT-4: = llvm.alloca %[[ALLOCA_LEN]] x i32
373
380
%0 = llvm.mlir.constant (1 : i32 ) : i32
374
381
%1 = llvm.alloca %0 x !llvm.array <4 x i32 > : (i32 ) -> !llvm.ptr
375
382
%memmove_len = llvm.mlir.constant (16 : i32 ) : i32
376
383
// Unfortunately because of FileCheck limitations it is not possible to check which slot gets read from.
377
384
// We can only check that the amount of operations and allocated slots is correct, which should be sufficient
378
385
// as unused slots are not generated.
379
- // CHECK-DAG: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
380
- // CHECK-DAG: "llvm.intr.memmove"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMMOVE_LEN]]) <{isVolatile = false}>
381
- // CHECK-DAG: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
382
- // CHECK-DAG: "llvm.intr.memmove"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMMOVE_LEN]]) <{isVolatile = false}>
383
- // CHECK-DAG: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
384
- // CHECK-DAG: "llvm.intr.memmove"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMMOVE_LEN]]) <{isVolatile = false}>
385
- // CHECK-DAG: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
386
- // CHECK-DAG: "llvm.intr.memmove"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMMOVE_LEN]]) <{isVolatile = false}>
386
+ // CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
387
+ // CHECK: %[[MEMMOVE_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
388
+ // CHECK: "llvm.intr.memmove"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMMOVE_LEN]]) <{isVolatile = false}>
389
+ // CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
390
+ // CHECK: %[[MEMMOVE_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
391
+ // CHECK: "llvm.intr.memmove"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMMOVE_LEN]]) <{isVolatile = false}>
392
+ // CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
393
+ // CHECK: %[[MEMMOVE_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
394
+ // CHECK: "llvm.intr.memmove"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMMOVE_LEN]]) <{isVolatile = false}>
395
+ // CHECK: %[[SLOT_IN_OTHER:.*]] = llvm.getelementptr %[[OTHER_ARRAY]][0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<4 x i32>
396
+ // CHECK: %[[MEMMOVE_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32
397
+ // CHECK: "llvm.intr.memmove"(%[[SLOT_IN_OTHER]], %{{.*}}, %[[MEMMOVE_LEN]]) <{isVolatile = false}>
387
398
" llvm.intr.memmove" (%other_array , %1 , %memmove_len ) <{isVolatile = false }> : (!llvm.ptr , !llvm.ptr , i32 ) -> ()
388
399
%2 = llvm.getelementptr %1 [0 , 1 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.array <4 x i32 >
389
400
%3 = llvm.load %2 : !llvm.ptr -> i32
0 commit comments