xref: /llvm-project/mlir/test/Conversion/MemRefToLLVM/convert-static-memref-ops.mlir (revision 6937dbbe51391471f3cf50fe2b8fa2cd14080a3b)
1b28a296cSChristian Ulmann// RUN: mlir-opt -finalize-memref-to-llvm -split-input-file %s | FileCheck %s
275e5f0aaSAlex Zinenko
375e5f0aaSAlex Zinenko// CHECK-LABEL: func @zero_d_alloc()
43028bf74SRiver Riddlefunc.func @zero_d_alloc() -> memref<f32> {
575e5f0aaSAlex Zinenko// CHECK: %[[one:.*]] = llvm.mlir.constant(1 : index) : i64
685175eddSTobias Gysi// CHECK: %[[null:.*]] = llvm.mlir.zero : !llvm.ptr
750ea17b8SMarkus Böck// CHECK: %[[gep:.*]] = llvm.getelementptr %[[null]][%[[one]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
850ea17b8SMarkus Böck// CHECK: %[[size_bytes:.*]] = llvm.ptrtoint %[[gep]] : !llvm.ptr to i64
950ea17b8SMarkus Böck// CHECK: %[[ptr:.*]] = llvm.call @malloc(%[[size_bytes]]) : (i64) -> !llvm.ptr
1050ea17b8SMarkus Böck// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64)>
1150ea17b8SMarkus Böck// CHECK: llvm.insertvalue %[[ptr]], %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64)>
1250ea17b8SMarkus Böck// CHECK: llvm.insertvalue %[[ptr]], %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64)>
1375e5f0aaSAlex Zinenko// CHECK: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
1450ea17b8SMarkus Böck// CHECK: llvm.insertvalue %[[c0]], %{{.*}}[2] : !llvm.struct<(ptr, ptr, i64)>
15881dc34fSAlex Zinenko// CHECK: unrealized_conversion_cast %{{.*}}
1675e5f0aaSAlex Zinenko
1775e5f0aaSAlex Zinenko  %0 = memref.alloc() : memref<f32>
1875e5f0aaSAlex Zinenko  return %0 : memref<f32>
1975e5f0aaSAlex Zinenko}
2075e5f0aaSAlex Zinenko
2175e5f0aaSAlex Zinenko// -----
2275e5f0aaSAlex Zinenko
2375e5f0aaSAlex Zinenko// CHECK-LABEL: func @zero_d_dealloc
243028bf74SRiver Riddlefunc.func @zero_d_dealloc(%arg0: memref<f32>) {
25881dc34fSAlex Zinenko// CHECK: unrealized_conversion_cast
2650ea17b8SMarkus Böck// CHECK: %[[ptr:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64)>
2750ea17b8SMarkus Böck// CHECK: llvm.call @free(%[[ptr]]) : (!llvm.ptr) -> ()
2875e5f0aaSAlex Zinenko
2975e5f0aaSAlex Zinenko  memref.dealloc %arg0 : memref<f32>
3075e5f0aaSAlex Zinenko  return
3175e5f0aaSAlex Zinenko}
3275e5f0aaSAlex Zinenko
3375e5f0aaSAlex Zinenko// -----
3475e5f0aaSAlex Zinenko
3575e5f0aaSAlex Zinenko// CHECK-LABEL: func @aligned_1d_alloc(
363028bf74SRiver Riddlefunc.func @aligned_1d_alloc() -> memref<42xf32> {
3775e5f0aaSAlex Zinenko// CHECK: %[[sz1:.*]] = llvm.mlir.constant(42 : index) : i64
3875e5f0aaSAlex Zinenko// CHECK: %[[st1:.*]] = llvm.mlir.constant(1 : index) : i64
3985175eddSTobias Gysi// CHECK: %[[null:.*]] = llvm.mlir.zero : !llvm.ptr
4050ea17b8SMarkus Böck// CHECK: %[[gep:.*]] = llvm.getelementptr %[[null]][%[[sz1]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
4150ea17b8SMarkus Böck// CHECK: %[[size_bytes:.*]] = llvm.ptrtoint %[[gep]] : !llvm.ptr to i64
4275e5f0aaSAlex Zinenko// CHECK: %[[alignment:.*]] = llvm.mlir.constant(8 : index) : i64
4375e5f0aaSAlex Zinenko// CHECK: %[[allocsize:.*]] = llvm.add %[[size_bytes]], %[[alignment]] : i64
4450ea17b8SMarkus Böck// CHECK: %[[ptr:.*]] = llvm.call @malloc(%[[allocsize]]) : (i64) -> !llvm.ptr
4550ea17b8SMarkus Böck// CHECK: %[[allocatedAsInt:.*]] = llvm.ptrtoint %[[ptr]] : !llvm.ptr to i64
4675e5f0aaSAlex Zinenko// CHECK: %[[one_1:.*]] = llvm.mlir.constant(1 : index) : i64
4775e5f0aaSAlex Zinenko// CHECK: %[[bump:.*]] = llvm.sub %[[alignment]], %[[one_1]] : i64
4875e5f0aaSAlex Zinenko// CHECK: %[[bumped:.*]] = llvm.add %[[allocatedAsInt]], %[[bump]] : i64
4975e5f0aaSAlex Zinenko// CHECK: %[[mod:.*]] = llvm.urem %[[bumped]], %[[alignment]] : i64
5075e5f0aaSAlex Zinenko// CHECK: %[[aligned:.*]] = llvm.sub %[[bumped]], %[[mod]] : i64
5150ea17b8SMarkus Böck// CHECK: %[[alignedBitCast:.*]] = llvm.inttoptr %[[aligned]] : i64 to !llvm.ptr
5250ea17b8SMarkus Böck// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
5350ea17b8SMarkus Böck// CHECK: llvm.insertvalue %[[ptr]], %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
5450ea17b8SMarkus Böck// CHECK: llvm.insertvalue %[[alignedBitCast]], %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
5575e5f0aaSAlex Zinenko// CHECK: %[[c0:.*]] = llvm.mlir.constant(0 : index) : i64
5650ea17b8SMarkus Böck// CHECK: llvm.insertvalue %[[c0]], %{{.*}}[2] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
5775e5f0aaSAlex Zinenko  %0 = memref.alloc() {alignment = 8} : memref<42xf32>
5875e5f0aaSAlex Zinenko  return %0 : memref<42xf32>
5975e5f0aaSAlex Zinenko}
6075e5f0aaSAlex Zinenko
6175e5f0aaSAlex Zinenko// -----
6275e5f0aaSAlex Zinenko
6375e5f0aaSAlex Zinenko// CHECK-LABEL: func @static_alloc()
643028bf74SRiver Riddlefunc.func @static_alloc() -> memref<32x18xf32> {
6575e5f0aaSAlex Zinenko// CHECK: %[[num_elems:.*]] = llvm.mlir.constant(576 : index) : i64
6685175eddSTobias Gysi// CHECK: %[[null:.*]] = llvm.mlir.zero : !llvm.ptr
6750ea17b8SMarkus Böck// CHECK: %[[gep:.*]] = llvm.getelementptr %[[null]][%[[num_elems]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
6850ea17b8SMarkus Böck// CHECK: %[[size_bytes:.*]] = llvm.ptrtoint %[[gep]] : !llvm.ptr to i64
6950ea17b8SMarkus Böck// CHECK: llvm.call @malloc(%[[size_bytes]]) : (i64) -> !llvm.ptr
7075e5f0aaSAlex Zinenko %0 = memref.alloc() : memref<32x18xf32>
7175e5f0aaSAlex Zinenko return %0 : memref<32x18xf32>
7275e5f0aaSAlex Zinenko}
7375e5f0aaSAlex Zinenko
7475e5f0aaSAlex Zinenko// -----
7575e5f0aaSAlex Zinenko
7675e5f0aaSAlex Zinenko// CHECK-LABEL: func @static_alloca()
773028bf74SRiver Riddlefunc.func @static_alloca() -> memref<32x18xf32> {
7875e5f0aaSAlex Zinenko// CHECK: %[[sz1:.*]] = llvm.mlir.constant(32 : index) : i64
7975e5f0aaSAlex Zinenko// CHECK: %[[sz2:.*]] = llvm.mlir.constant(18 : index) : i64
8075e5f0aaSAlex Zinenko// CHECK: %[[st2:.*]] = llvm.mlir.constant(1 : index) : i64
8175e5f0aaSAlex Zinenko// CHECK: %[[num_elems:.*]] = llvm.mlir.constant(576 : index) : i64
82041f1abeSFabian Mora// CHECK: %[[allocated:.*]] = llvm.alloca %[[num_elems]] x f32 : (i64) -> !llvm.ptr
8375e5f0aaSAlex Zinenko %0 = memref.alloca() : memref<32x18xf32>
8475e5f0aaSAlex Zinenko
8575e5f0aaSAlex Zinenko // Test with explicitly specified alignment. llvm.alloca takes care of the
8675e5f0aaSAlex Zinenko // alignment. The same pointer is thus used for allocation and aligned
8775e5f0aaSAlex Zinenko // accesses.
8850ea17b8SMarkus Böck // CHECK: %[[alloca_aligned:.*]] = llvm.alloca %{{.*}} x f32 {alignment = 32 : i64} : (i64) -> !llvm.ptr
8950ea17b8SMarkus Böck // CHECK: %[[desc:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
9050ea17b8SMarkus Böck // CHECK: %[[desc1:.*]] = llvm.insertvalue %[[alloca_aligned]], %[[desc]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
9150ea17b8SMarkus Böck // CHECK: llvm.insertvalue %[[alloca_aligned]], %[[desc1]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
9275e5f0aaSAlex Zinenko memref.alloca() {alignment = 32} : memref<32x18xf32>
9375e5f0aaSAlex Zinenko return %0 : memref<32x18xf32>
9475e5f0aaSAlex Zinenko}
9575e5f0aaSAlex Zinenko
9675e5f0aaSAlex Zinenko// -----
9775e5f0aaSAlex Zinenko
98*6937dbbeSMatthias Springer// CHECK-LABEL: func @static_alloca_zero()
99*6937dbbeSMatthias Springerfunc.func @static_alloca_zero() -> memref<32x0x18xf32> {
100*6937dbbeSMatthias Springer// CHECK: %[[sz1:.*]] = llvm.mlir.constant(32 : index) : i64
101*6937dbbeSMatthias Springer// CHECK: %[[sz2:.*]] = llvm.mlir.constant(0 : index) : i64
102*6937dbbeSMatthias Springer// CHECK: %[[sz3:.*]] = llvm.mlir.constant(18 : index) : i64
103*6937dbbeSMatthias Springer// CHECK: %[[st1:.*]] = llvm.mlir.constant(1 : index) : i64
104*6937dbbeSMatthias Springer// CHECK: %[[st2:.*]] = llvm.mlir.constant(0 : index) : i64
105*6937dbbeSMatthias Springer// CHECK: %[[num_elems:.*]] = llvm.mlir.constant(0 : index) : i64
106*6937dbbeSMatthias Springer// CHECK: %[[allocated:.*]] = llvm.alloca %[[num_elems]] x f32 : (i64) -> !llvm.ptr
107*6937dbbeSMatthias Springer %0 = memref.alloca() : memref<32x0x18xf32>
108*6937dbbeSMatthias Springer
109*6937dbbeSMatthias Springer return %0 : memref<32x0x18xf32>
110*6937dbbeSMatthias Springer}
111*6937dbbeSMatthias Springer
112*6937dbbeSMatthias Springer// -----
113*6937dbbeSMatthias Springer
11475e5f0aaSAlex Zinenko// CHECK-LABEL: func @static_dealloc
1153028bf74SRiver Riddlefunc.func @static_dealloc(%static: memref<10x8xf32>) {
11650ea17b8SMarkus Böck// CHECK: %[[ptr:.*]] = llvm.extractvalue %{{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
11750ea17b8SMarkus Böck// CHECK: llvm.call @free(%[[ptr]]) : (!llvm.ptr) -> ()
11875e5f0aaSAlex Zinenko  memref.dealloc %static : memref<10x8xf32>
11975e5f0aaSAlex Zinenko  return
12075e5f0aaSAlex Zinenko}
12175e5f0aaSAlex Zinenko
12275e5f0aaSAlex Zinenko// -----
12375e5f0aaSAlex Zinenko
12475e5f0aaSAlex Zinenko// CHECK-LABEL: func @zero_d_load
1253028bf74SRiver Riddlefunc.func @zero_d_load(%arg0: memref<f32>) -> f32 {
12650ea17b8SMarkus Böck// CHECK: %[[ptr:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64)>
12750ea17b8SMarkus Böck// CHECK: %{{.*}} = llvm.load %[[ptr]] : !llvm.ptr -> f32
12875e5f0aaSAlex Zinenko  %0 = memref.load %arg0[] : memref<f32>
12975e5f0aaSAlex Zinenko  return %0 : f32
13075e5f0aaSAlex Zinenko}
13175e5f0aaSAlex Zinenko
13275e5f0aaSAlex Zinenko// -----
13375e5f0aaSAlex Zinenko
13413d983e7SMatthias Springer// CHECK-LABEL: func @static_load(
13513d983e7SMatthias Springer// CHECK-SAME:    %[[MEMREF:.*]]: memref<10x42xf32>, %[[I:.*]]: index, %[[J:.*]]: index)
1363028bf74SRiver Riddlefunc.func @static_load(%static : memref<10x42xf32>, %i : index, %j : index) {
13713d983e7SMatthias Springer// CHECK-DAG:  %[[II:.*]] = builtin.unrealized_conversion_cast %[[I]]
13813d983e7SMatthias Springer// CHECK-DAG:  %[[JJ:.*]] = builtin.unrealized_conversion_cast %[[J]]
13950ea17b8SMarkus Böck// CHECK:  %[[ptr:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
14075e5f0aaSAlex Zinenko// CHECK:  %[[st0:.*]] = llvm.mlir.constant(42 : index) : i64
14175e5f0aaSAlex Zinenko// CHECK:  %[[offI:.*]] = llvm.mul %[[II]], %[[st0]] : i64
14275e5f0aaSAlex Zinenko// CHECK:  %[[off1:.*]] = llvm.add %[[offI]], %[[JJ]] : i64
14350ea17b8SMarkus Böck// CHECK:  %[[addr:.*]] = llvm.getelementptr %[[ptr]][%[[off1]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
14450ea17b8SMarkus Böck// CHECK:  llvm.load %[[addr]] : !llvm.ptr -> f32
14575e5f0aaSAlex Zinenko  %0 = memref.load %static[%i, %j] : memref<10x42xf32>
14675e5f0aaSAlex Zinenko  return
14775e5f0aaSAlex Zinenko}
14875e5f0aaSAlex Zinenko
14975e5f0aaSAlex Zinenko// -----
15075e5f0aaSAlex Zinenko
15175e5f0aaSAlex Zinenko// CHECK-LABEL: func @zero_d_store
1523028bf74SRiver Riddlefunc.func @zero_d_store(%arg0: memref<f32>, %arg1: f32) {
15350ea17b8SMarkus Böck// CHECK: %[[ptr:.*]] = llvm.extractvalue %[[ld:.*]][1] : !llvm.struct<(ptr, ptr, i64)>
15450ea17b8SMarkus Böck// CHECK: llvm.store %{{.*}}, %[[ptr]] : f32, !llvm.ptr
15575e5f0aaSAlex Zinenko  memref.store %arg1, %arg0[] : memref<f32>
15675e5f0aaSAlex Zinenko  return
15775e5f0aaSAlex Zinenko}
15875e5f0aaSAlex Zinenko
15975e5f0aaSAlex Zinenko// -----
16075e5f0aaSAlex Zinenko
16175e5f0aaSAlex Zinenko// CHECK-LABEL: func @static_store
16275e5f0aaSAlex Zinenko// CHECK:         %[[MEMREF:.*]]: memref<10x42xf32>,
16375e5f0aaSAlex Zinenko// CHECK-SAME:    %[[I:.*]]: index, %[[J:.*]]: index,
1643028bf74SRiver Riddlefunc.func @static_store(%static : memref<10x42xf32>, %i : index, %j : index, %val : f32) {
16513d983e7SMatthias Springer// CHECK-DAG: %[[II:.*]] = builtin.unrealized_conversion_cast %[[I]]
16613d983e7SMatthias Springer// CHECK-DAG: %[[JJ:.*]] = builtin.unrealized_conversion_cast %[[J]]
16750ea17b8SMarkus Böck// CHECK: %[[ptr:.*]] = llvm.extractvalue %{{.*}}[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
16875e5f0aaSAlex Zinenko// CHECK: %[[st0:.*]] = llvm.mlir.constant(42 : index) : i64
16975e5f0aaSAlex Zinenko// CHECK: %[[offI:.*]] = llvm.mul %[[II]], %[[st0]] : i64
17075e5f0aaSAlex Zinenko// CHECK: %[[off1:.*]] = llvm.add %[[offI]], %[[JJ]] : i64
17150ea17b8SMarkus Böck// CHECK: %[[addr:.*]] = llvm.getelementptr %[[ptr]][%[[off1]]] : (!llvm.ptr, i64) -> !llvm.ptr, f32
17250ea17b8SMarkus Böck// CHECK: llvm.store %{{.*}}, %[[addr]] : f32, !llvm.ptr
17375e5f0aaSAlex Zinenko
17475e5f0aaSAlex Zinenko  memref.store %val, %static[%i, %j] : memref<10x42xf32>
17575e5f0aaSAlex Zinenko  return
17675e5f0aaSAlex Zinenko}
17775e5f0aaSAlex Zinenko
17875e5f0aaSAlex Zinenko// -----
17975e5f0aaSAlex Zinenko
18075e5f0aaSAlex Zinenko// CHECK-LABEL: func @static_memref_dim
1813028bf74SRiver Riddlefunc.func @static_memref_dim(%static : memref<42x32x15x13x27xf32>) {
18275e5f0aaSAlex Zinenko// CHECK:  llvm.mlir.constant(42 : index) : i64
183a54f4eaeSMogball  %c0 = arith.constant 0 : index
18475e5f0aaSAlex Zinenko  %0 = memref.dim %static, %c0 : memref<42x32x15x13x27xf32>
18575e5f0aaSAlex Zinenko// CHECK:  llvm.mlir.constant(32 : index) : i64
186a54f4eaeSMogball  %c1 = arith.constant 1 : index
18775e5f0aaSAlex Zinenko  %1 = memref.dim %static, %c1 : memref<42x32x15x13x27xf32>
18875e5f0aaSAlex Zinenko// CHECK:  llvm.mlir.constant(15 : index) : i64
189a54f4eaeSMogball  %c2 = arith.constant 2 : index
19075e5f0aaSAlex Zinenko  %2 = memref.dim %static, %c2 : memref<42x32x15x13x27xf32>
19175e5f0aaSAlex Zinenko// CHECK:  llvm.mlir.constant(13 : index) : i64
192a54f4eaeSMogball  %c3 = arith.constant 3 : index
19375e5f0aaSAlex Zinenko  %3 = memref.dim %static, %c3 : memref<42x32x15x13x27xf32>
19475e5f0aaSAlex Zinenko// CHECK:  llvm.mlir.constant(27 : index) : i64
195a54f4eaeSMogball  %c4 = arith.constant 4 : index
19675e5f0aaSAlex Zinenko  %4 = memref.dim %static, %c4 : memref<42x32x15x13x27xf32>
19775e5f0aaSAlex Zinenko  return
19875e5f0aaSAlex Zinenko}
19975e5f0aaSAlex Zinenko
20075e5f0aaSAlex Zinenko// -----
20175e5f0aaSAlex Zinenko
2024bc2357cSQuentin Colombet// CHECK-LABEL: func @static_out_of_bound_memref_dim
2034bc2357cSQuentin Colombetfunc.func @static_out_of_bound_memref_dim(%static : memref<42x32x15x13x27xf32>) -> index {
2044bc2357cSQuentin Colombet// CHECK: %[[C_MINUS_7:.*]] = arith.constant -7 : index
2054bc2357cSQuentin Colombet// CHECK: %[[C_MINUS_7_I64:.*]] = builtin.unrealized_conversion_cast %[[C_MINUS_7]] : index to i64
2064bc2357cSQuentin Colombet// CHECK: %[[UB_IDX:.*]] = llvm.getelementptr %{{.*}}[0, %[[C_MINUS_7_I64]]] : (!llvm.ptr, i64) -> !llvm.ptr
2074bc2357cSQuentin Colombet// CHECK: %[[UB_DIM_I64:.*]] = llvm.load %[[UB_IDX]] : !llvm.ptr
2084bc2357cSQuentin Colombet// CHECK: %[[UB_DIM:.*]] = builtin.unrealized_conversion_cast %[[UB_DIM_I64]] : i64 to index
2094bc2357cSQuentin Colombet// CHECK: return %[[UB_DIM]] : index
2104bc2357cSQuentin Colombet  %c-7 = arith.constant -7 : index
2114bc2357cSQuentin Colombet  %1 = memref.dim %static, %c-7 : memref<42x32x15x13x27xf32>
2124bc2357cSQuentin Colombet  return %1 : index
2134bc2357cSQuentin Colombet}
2144bc2357cSQuentin Colombet// -----
2154bc2357cSQuentin Colombet
21675e5f0aaSAlex Zinenko// Check that consistent types are emitted in address arithemic in presence of
21775e5f0aaSAlex Zinenko// a data layout specification.
21875e5f0aaSAlex Zinenkomodule attributes { dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<index, 32>> } {
2193028bf74SRiver Riddle  func.func @address() {
220a54f4eaeSMogball    %c1 = arith.constant 1 : index
22175e5f0aaSAlex Zinenko    %0 = memref.alloc(%c1) : memref<? x vector<2xf32>>
22213d983e7SMatthias Springer    // CHECK-DAG: %[[CST_S:.*]] = arith.constant 1 : index
223f8479d9dSRiver Riddle    // CHECK: %[[CST:.*]] = builtin.unrealized_conversion_cast
22485175eddSTobias Gysi    // CHECK: llvm.mlir.zero
22575e5f0aaSAlex Zinenko    // CHECK: llvm.getelementptr %{{.*}}[[CST]]
22650ea17b8SMarkus Böck    // CHECK: llvm.ptrtoint %{{.*}} : !llvm.ptr to i32
22750ea17b8SMarkus Böck    // CHECK: llvm.ptrtoint %{{.*}} : !llvm.ptr to i32
22875e5f0aaSAlex Zinenko    // CHECK: llvm.add %{{.*}} : i32
229d04c2b2fSMehdi Amini    // CHECK: llvm.call @malloc(%{{.*}}) : (i32) -> !llvm.ptr
23050ea17b8SMarkus Böck    // CHECK: llvm.ptrtoint %{{.*}} : !llvm.ptr to i32
23175e5f0aaSAlex Zinenko    // CHECK: llvm.sub {{.*}} : i32
23275e5f0aaSAlex Zinenko    // CHECK: llvm.add {{.*}} : i32
23375e5f0aaSAlex Zinenko    // CHECK: llvm.urem {{.*}} : i32
23475e5f0aaSAlex Zinenko    // CHECK: llvm.sub {{.*}} : i32
23575e5f0aaSAlex Zinenko    // CHECK: llvm.inttoptr %{{.*}} : i32 to !llvm.ptr
23675e5f0aaSAlex Zinenko    return
23775e5f0aaSAlex Zinenko  }
23875e5f0aaSAlex Zinenko}
23975e5f0aaSAlex Zinenko
2405380e30eSAshay Rane// -----
2415380e30eSAshay Rane
2425380e30eSAshay Ranememref.global "private" constant @__constant_3xi64 : memref<3xi64> = dense<[2, 6, 20]>
2435380e30eSAshay Rane
2445380e30eSAshay Rane// CHECK-LABEL: func @memref.reshape
2455380e30eSAshay Rane// CHECK-SAME:    %[[arg0:.*]]: memref<4x5x6xf32>) -> memref<2x6x20xf32>
2465380e30eSAshay Ranefunc.func @memref.reshape(%arg0: memref<4x5x6xf32>) -> memref<2x6x20xf32> {
24750ea17b8SMarkus Böck  // CHECK: %[[cast0:.*]] = builtin.unrealized_conversion_cast %arg0 : memref<4x5x6xf32> to !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
2485380e30eSAshay Rane  %0 = memref.get_global @__constant_3xi64 : memref<3xi64>
2495380e30eSAshay Rane
25050ea17b8SMarkus Böck  // CHECK: %[[undef:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
25150ea17b8SMarkus Böck  // CHECK: %[[elem0:.*]] = llvm.extractvalue %[[cast0]][0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
25250ea17b8SMarkus Böck  // CHECK: %[[elem1:.*]] = llvm.extractvalue %[[cast0]][1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
25350ea17b8SMarkus Böck  // CHECK: %[[insert0:.*]] = llvm.insertvalue %[[elem0]], %[[undef]][0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
25450ea17b8SMarkus Böck  // CHECK: %[[insert1:.*]] = llvm.insertvalue %[[elem1]], %[[insert0:.*]][1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
2555fee1799SAshay Rane
2565380e30eSAshay Rane  // CHECK: %[[zero:.*]] = llvm.mlir.constant(0 : index) : i64
25750ea17b8SMarkus Böck  // CHECK: %[[insert2:.*]] = llvm.insertvalue %[[zero]], %[[insert1]][2] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
2585fee1799SAshay Rane
2595fee1799SAshay Rane  // CHECK: %[[one:.*]] = llvm.mlir.constant(1 : index) : i64
2605fee1799SAshay Rane  // CHECK: %[[twenty0:.*]] = llvm.mlir.constant(20 : index) : i64
26150ea17b8SMarkus Böck  // CHECK: %[[insert3:.*]] = llvm.insertvalue %[[twenty0]], %[[insert2]][3, 2] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
26250ea17b8SMarkus Böck  // CHECK: %[[insert4:.*]] = llvm.insertvalue %[[one]], %[[insert3]][4, 2] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
2635fee1799SAshay Rane
2645fee1799SAshay Rane  // CHECK: %[[twenty1:.*]] = llvm.mlir.constant(20 : index) : i64
2655380e30eSAshay Rane  // CHECK: %[[six:.*]] = llvm.mlir.constant(6 : index) : i64
26650ea17b8SMarkus Böck  // CHECK: %[[insert5:.*]] = llvm.insertvalue %[[six]], %[[insert4]][3, 1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
26750ea17b8SMarkus Böck  // CHECK: %[[insert6:.*]] = llvm.insertvalue %[[twenty1]], %[[insert5]][4, 1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
2685fee1799SAshay Rane
2695fee1799SAshay Rane  // CHECK: %[[hundred_and_twenty:.*]] = llvm.mlir.constant(120 : index) : i64
2705fee1799SAshay Rane  // CHECK: %[[two:.*]] = llvm.mlir.constant(2 : index) : i64
27150ea17b8SMarkus Böck  // CHECK: %[[insert7:.*]] = llvm.insertvalue %[[two]], %[[insert6]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
27250ea17b8SMarkus Böck  // CHECK: %[[insert8:.*]] = llvm.insertvalue %[[hundred_and_twenty]], %[[insert7]][4, 0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
2735fee1799SAshay Rane
27450ea17b8SMarkus Böck  // CHECK: %[[cast1:.*]] = builtin.unrealized_conversion_cast %[[insert8]] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)> to memref<2x6x20xf32>
2755380e30eSAshay Rane  %1 = memref.reshape %arg0(%0) : (memref<4x5x6xf32>, memref<3xi64>) -> memref<2x6x20xf32>
2765380e30eSAshay Rane
2775380e30eSAshay Rane  // CHECK: return %[[cast1]] : memref<2x6x20xf32>
2785380e30eSAshay Rane  return %1 : memref<2x6x20xf32>
2795380e30eSAshay Rane}
2805fee1799SAshay Rane
2815fee1799SAshay Rane// -----
2825fee1799SAshay Rane
2835fee1799SAshay Rane// CHECK-LABEL: func @memref.reshape.dynamic.dim
2845fee1799SAshay Rane// CHECK-SAME:    %[[arg:.*]]: memref<?x?x?xf32>, %[[shape:.*]]: memref<4xi64>) -> memref<?x?x12x32xf32>
2855fee1799SAshay Ranefunc.func @memref.reshape.dynamic.dim(%arg: memref<?x?x?xf32>, %shape: memref<4xi64>) -> memref<?x?x12x32xf32> {
28613d983e7SMatthias Springer  // CHECK-DAG: %[[arg_cast:.*]] = builtin.unrealized_conversion_cast %[[arg]] : memref<?x?x?xf32> to !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
28713d983e7SMatthias Springer  // CHECK-DAG: %[[shape_cast:.*]] = builtin.unrealized_conversion_cast %[[shape]] : memref<4xi64> to !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
28850ea17b8SMarkus Böck  // CHECK: %[[undef:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
28950ea17b8SMarkus Böck  // CHECK: %[[alloc_ptr:.*]] = llvm.extractvalue %[[arg_cast]][0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
29050ea17b8SMarkus Böck  // CHECK: %[[align_ptr:.*]] = llvm.extractvalue %[[arg_cast]][1] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
29150ea17b8SMarkus Böck  // CHECK: %[[insert0:.*]] = llvm.insertvalue %[[alloc_ptr]], %[[undef]][0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
29250ea17b8SMarkus Böck  // CHECK: %[[insert1:.*]] = llvm.insertvalue %[[align_ptr]], %[[insert0]][1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
2935fee1799SAshay Rane
2945fee1799SAshay Rane  // CHECK: %[[zero0:.*]] = llvm.mlir.constant(0 : index) : i64
29550ea17b8SMarkus Böck  // CHECK: %[[insert2:.*]] = llvm.insertvalue %[[zero0]], %[[insert1]][2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
2965fee1799SAshay Rane
2975fee1799SAshay Rane  // CHECK: %[[one0:.*]] = llvm.mlir.constant(1 : index) : i64
2985fee1799SAshay Rane  // CHECK: %[[thirty_two0:.*]] = llvm.mlir.constant(32 : index) : i64
29950ea17b8SMarkus Böck  // CHECK: %[[insert3:.*]] = llvm.insertvalue %[[thirty_two0]], %[[insert2]][3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
30050ea17b8SMarkus Böck  // CHECK: %[[insert4:.*]] = llvm.insertvalue %[[one0]], %[[insert3]][4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
3015fee1799SAshay Rane
3025fee1799SAshay Rane  // CHECK: %[[thirty_two1:.*]] = llvm.mlir.constant(32 : index) : i64
3035fee1799SAshay Rane  // CHECK: %[[twelve:.*]] = llvm.mlir.constant(12 : index) : i64
30450ea17b8SMarkus Böck  // CHECK: %[[insert5:.*]] = llvm.insertvalue %[[twelve]], %[[insert4]][3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
30550ea17b8SMarkus Böck  // CHECK: %[[insert6:.*]] = llvm.insertvalue %[[thirty_two1]], %[[insert5]][4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
3065fee1799SAshay Rane
3075fee1799SAshay Rane  // CHECK: %[[three_hundred_and_eighty_four:.*]] = llvm.mlir.constant(384 : index) : i64
3085fee1799SAshay Rane  // CHECK: %[[one1:.*]] = llvm.mlir.constant(1 : index) : i64
30950ea17b8SMarkus Böck  // CHECK: %[[shape_ptr0:.*]] = llvm.extractvalue %[[shape_cast]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
31050ea17b8SMarkus Böck  // CHECK: %[[shape_gep0:.*]] = llvm.getelementptr %[[shape_ptr0]][%[[one1]]] : (!llvm.ptr, i64) -> !llvm.ptr, i64
31150ea17b8SMarkus Böck  // CHECK: %[[shape_load0:.*]] = llvm.load %[[shape_gep0]] : !llvm.ptr -> i64
31250ea17b8SMarkus Böck  // CHECK: %[[insert7:.*]] = llvm.insertvalue %[[shape_load0]], %[[insert6]][3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
31350ea17b8SMarkus Böck  // CHECK: %[[insert8:.*]] = llvm.insertvalue %[[three_hundred_and_eighty_four]], %[[insert7]][4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
3145fee1799SAshay Rane
3155fee1799SAshay Rane  // CHECK: %[[mul:.*]] = llvm.mul %19, %23  : i64
3165fee1799SAshay Rane  // CHECK: %[[zero1:.*]] = llvm.mlir.constant(0 : index) : i64
31750ea17b8SMarkus Böck  // CHECK: %[[shape_ptr1:.*]] = llvm.extractvalue %[[shape_cast]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
31850ea17b8SMarkus Böck  // CHECK: %[[shape_gep1:.*]] = llvm.getelementptr %[[shape_ptr1]][%[[zero1]]] : (!llvm.ptr, i64) -> !llvm.ptr, i64
31950ea17b8SMarkus Böck  // CHECK: %[[shape_load1:.*]] = llvm.load %[[shape_gep1]] : !llvm.ptr -> i64
32050ea17b8SMarkus Böck  // CHECK: %[[insert9:.*]] = llvm.insertvalue %[[shape_load1]], %[[insert8]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
32150ea17b8SMarkus Böck  // CHECK: %[[insert10:.*]] = llvm.insertvalue %[[mul]], %[[insert9]][4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>
3225fee1799SAshay Rane
32350ea17b8SMarkus Böck  // CHECK: %[[result_cast:.*]] = builtin.unrealized_conversion_cast %[[insert10]] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> to memref<?x?x12x32xf32>
3245fee1799SAshay Rane  %0 = memref.reshape %arg(%shape) : (memref<?x?x?xf32>, memref<4xi64>) -> memref<?x?x12x32xf32>
3255fee1799SAshay Rane
3265fee1799SAshay Rane  return %0 : memref<?x?x12x32xf32>
3275fee1799SAshay Rane  // CHECK: return %[[result_cast]] : memref<?x?x12x32xf32>
3285fee1799SAshay Rane}
329d4217e6cSIvan Butygin
330d4217e6cSIvan Butygin// -----
331d4217e6cSIvan Butygin
332d4217e6cSIvan Butygin// CHECK-LABEL: func @memref.reshape_index
333d4217e6cSIvan Butygin// CHECK-SAME:    %[[arg:.*]]: memref<?x?xi32>, %[[shape:.*]]: memref<1xindex>
334d4217e6cSIvan Butyginfunc.func @memref.reshape_index(%arg0: memref<?x?xi32>, %shape: memref<1xindex>) ->  memref<?xi32> {
33513d983e7SMatthias Springer  // CHECK-DAG: %[[arg_cast:.*]] = builtin.unrealized_conversion_cast %[[arg]] : memref<?x?xi32> to !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
33613d983e7SMatthias Springer  // CHECK-DAG: %[[shape_cast:.*]] = builtin.unrealized_conversion_cast %[[shape]] : memref<1xindex> to !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
33750ea17b8SMarkus Böck  // CHECK: %[[undef:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
33850ea17b8SMarkus Böck  // CHECK: %[[alloc_ptr:.*]] = llvm.extractvalue %[[arg_cast]][0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
33950ea17b8SMarkus Böck  // CHECK: %[[align_ptr:.*]] = llvm.extractvalue %[[arg_cast]][1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
34050ea17b8SMarkus Böck  // CHECK: %[[insert0:.*]] = llvm.insertvalue %[[alloc_ptr]], %[[undef:.*]][0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
34150ea17b8SMarkus Böck  // CHECK: %[[insert1:.*]] = llvm.insertvalue %[[align_ptr]], %[[insert0:.*]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
342d4217e6cSIvan Butygin
343d4217e6cSIvan Butygin  // CHECK: %[[zero0:.*]] = llvm.mlir.constant(0 : index) : i64
34450ea17b8SMarkus Böck  // CHECK: %[[insert2:.*]] = llvm.insertvalue %[[zero0]], %[[insert1:.*]][2] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
345d4217e6cSIvan Butygin
346d4217e6cSIvan Butygin  // CHECK: %[[one0:.*]] = llvm.mlir.constant(1 : index) : i64
347d4217e6cSIvan Butygin  // CHECK: %[[zero1:.*]] = llvm.mlir.constant(0 : index) : i64
348d4217e6cSIvan Butygin
34950ea17b8SMarkus Böck  // CHECK: %[[shape_ptr0:.*]] = llvm.extractvalue %[[shape_cast:.*]][1] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
35050ea17b8SMarkus Böck  // CHECK: %[[shape_gep0:.*]] = llvm.getelementptr %[[shape_ptr0:.*]][%[[zero1:.*]]] : (!llvm.ptr, i64) -> !llvm.ptr, i64
35150ea17b8SMarkus Böck  // CHECK: %[[shape_load0:.*]] = llvm.load %[[shape_gep0:.*]] : !llvm.ptr -> i64
35250ea17b8SMarkus Böck  // CHECK: %[[insert3:.*]] = llvm.insertvalue %[[shape_load0:.*]], %[[insert2:.*]][3, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
35350ea17b8SMarkus Böck  // CHECK: %[[insert4:.*]] = llvm.insertvalue %[[one0:.*]], %[[insert3:.*]][4, 0] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)>
354d4217e6cSIvan Butygin
35550ea17b8SMarkus Böck  // CHECK: %[[result_cast:.*]] = builtin.unrealized_conversion_cast %[[insert4:.*]] : !llvm.struct<(ptr, ptr, i64, array<1 x i64>, array<1 x i64>)> to memref<?xi32>
356d4217e6cSIvan Butygin  // CHECK: return %[[result_cast:.*]] : memref<?xi32>
357d4217e6cSIvan Butygin
358d4217e6cSIvan Butygin  %1 = memref.reshape %arg0(%shape) : (memref<?x?xi32>, memref<1xindex>) -> memref<?xi32>
359d4217e6cSIvan Butygin  return %1 : memref<?xi32>
360d4217e6cSIvan Butygin}
3619f13b934Sbixia1
3627fb9bbe5SKrzysztof Drewniak// CHECK-LABEL: @memref_memory_space_cast
3637fb9bbe5SKrzysztof Drewniakfunc.func @memref_memory_space_cast(%input : memref<?xf32>) -> memref<?xf32, 1> {
3647fb9bbe5SKrzysztof Drewniak  %cast = memref.memory_space_cast %input : memref<?xf32> to memref<?xf32, 1>
3657fb9bbe5SKrzysztof Drewniak  return %cast : memref<?xf32, 1>
3667fb9bbe5SKrzysztof Drewniak}
3677fb9bbe5SKrzysztof Drewniak// CHECK: [[INPUT:%.*]] = builtin.unrealized_conversion_cast %{{.*}}
3687fb9bbe5SKrzysztof Drewniak//  CHECK: [[ALLOC:%.*]] = llvm.extractvalue [[INPUT]][0]
3697fb9bbe5SKrzysztof Drewniak//  CHECK: [[ALIGN:%.*]] = llvm.extractvalue [[INPUT]][1]
3707fb9bbe5SKrzysztof Drewniak// CHECK: [[OFFSET:%.*]] = llvm.extractvalue [[INPUT]][2]
3717fb9bbe5SKrzysztof Drewniak//   CHECK: [[SIZE:%.*]] = llvm.extractvalue [[INPUT]][3, 0]
3727fb9bbe5SKrzysztof Drewniak// CHECK: [[STRIDE:%.*]] = llvm.extractvalue [[INPUT]][4, 0]
3737fb9bbe5SKrzysztof Drewniak// CHECK: [[CAST_ALLOC:%.*]] = llvm.addrspacecast [[ALLOC]] : !llvm.ptr to !llvm.ptr<1>
3747fb9bbe5SKrzysztof Drewniak// CHECK: [[CAST_ALIGN:%.*]] = llvm.addrspacecast [[ALIGN]] : !llvm.ptr to !llvm.ptr<1>
3757fb9bbe5SKrzysztof Drewniak// CHECK: [[RESULT_0:%.*]] = llvm.mlir.undef
3767fb9bbe5SKrzysztof Drewniak// CHECK: [[RESULT_1:%.*]] = llvm.insertvalue [[CAST_ALLOC]], [[RESULT_0]][0]
3777fb9bbe5SKrzysztof Drewniak// CHECK: [[RESULT_2:%.*]] = llvm.insertvalue [[CAST_ALIGN]], [[RESULT_1]][1]
3787fb9bbe5SKrzysztof Drewniak// CHECK: [[RESULT_3:%.*]] = llvm.insertvalue [[OFFSET]], [[RESULT_2]][2]
3797fb9bbe5SKrzysztof Drewniak// CHECK: [[RESULT_4:%.*]] = llvm.insertvalue [[SIZE]], [[RESULT_3]][3, 0]
3807fb9bbe5SKrzysztof Drewniak// CHECK: [[RESULT_5:%.*]] = llvm.insertvalue [[STRIDE]], [[RESULT_4]][4, 0]
3817fb9bbe5SKrzysztof Drewniak// CHECK: [[RESULT:%.*]] = builtin.unrealized_conversion_cast [[RESULT_5]] : {{.*}} to memref<?xf32, 1>
3827fb9bbe5SKrzysztof Drewniak// CHECK: return [[RESULT]]
383