2019-10-01 20:22:54 +08:00
|
|
|
// RUN: mlir-opt %s -linalg-convert-to-llvm
|
|
|
|
// RUN: mlir-opt %s -linalg-convert-to-llvm | FileCheck %s
|
|
|
|
|
|
|
|
#strided1D = (d0)[s0] -> (d0 + s0)
|
|
|
|
#strided2D = (d0, d1)[s0, s1] -> (d0 * s1 + s0 + d1)
|
|
|
|
#strided3D = (d0, d1, d2)[s0, s1, s2] -> (d0 * s1 + s0 + d1 * s2 + d2)
|
2019-05-03 02:36:52 +08:00
|
|
|
|
2019-06-29 00:59:22 +08:00
|
|
|
func @buffer_size(%arg0: !linalg.buffer<?xf32>) {
|
2019-07-11 02:42:56 +08:00
|
|
|
%c1 = constant 1 : index
|
2019-06-29 00:59:22 +08:00
|
|
|
%s = linalg.buffer_size %arg0 : !linalg.buffer<?xf32>
|
2019-07-11 02:42:56 +08:00
|
|
|
%t = addi %s, %c1 : index
|
2019-05-03 02:36:52 +08:00
|
|
|
return
|
|
|
|
}
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-LABEL: func @buffer_size
|
2019-08-20 05:36:49 +08:00
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[2] : !llvm<"{ i8*, float*, i64 }">
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.add {{.*}}, {{.*}} : !llvm.i64
|
2019-05-03 02:36:52 +08:00
|
|
|
|
2019-08-20 05:36:49 +08:00
|
|
|
func @buffer_alloc_aligned(%arg0: index) {
|
|
|
|
%s = linalg.buffer_alloc %arg0 {alignment=16} : !linalg.buffer<?xf32>
|
|
|
|
return
|
|
|
|
}
|
|
|
|
// CHECK-LABEL: func @buffer_alloc_aligned
|
2019-09-04 00:10:24 +08:00
|
|
|
// CHECK: %[[c4:.*]] = llvm.mlir.constant(4 : index) : !llvm.i64
|
2019-08-20 05:36:49 +08:00
|
|
|
// CHECK: %[[m:.*]] = llvm.mul %arg0, %[[c4]] : !llvm.i64
|
2019-09-04 00:10:24 +08:00
|
|
|
// CHECK: %[[c1:.*]] = llvm.mlir.constant(1 : index) : !llvm.i64
|
|
|
|
// CHECK: %[[c16:.*]] = llvm.mlir.constant(16 : index) : !llvm.i64
|
2019-08-20 05:36:49 +08:00
|
|
|
// CHECK: %[[a:.*]] = llvm.add %[[m]], %[[c16]] : !llvm.i64
|
|
|
|
// CHECK: %[[s:.*]] = llvm.sub %[[a]], %[[c1]] : !llvm.i64
|
|
|
|
// CHECK: %[[alloc:.*]] = llvm.call @malloc(%[[s]]) : (!llvm.i64) -> !llvm<"i8*">
|
|
|
|
// aligning `ptr` on `align` is done computing the address `ptr + (align - ptr % align) % align`.
|
|
|
|
// CHECK: %[[cast:.*]] = llvm.ptrtoint %[[alloc]] : !llvm<"i8*"> to !llvm.i64
|
|
|
|
// CHECK: %[[rem:.*]] = llvm.urem %[[cast]], %[[c16]] : !llvm.i64
|
|
|
|
// CHECK: %[[drem:.*]] = llvm.sub %[[c16]], %[[rem]] : !llvm.i64
|
|
|
|
// CHECK: %[[off:.*]] = llvm.urem %[[drem]], %[[c16]] : !llvm.i64
|
|
|
|
// CHECK: llvm.getelementptr %{{.*}}[%[[off]]] : (!llvm<"i8*">, !llvm.i64) -> !llvm<"i8*">
|
|
|
|
|
2019-05-03 02:36:52 +08:00
|
|
|
func @range(%arg0: index) {
|
|
|
|
%c0 = constant 0 : index
|
|
|
|
%c1 = constant 1 : index
|
|
|
|
%R = linalg.range %c0:%arg0:%c1 : !linalg.range
|
|
|
|
return
|
|
|
|
}
|
2019-07-10 01:40:29 +08:00
|
|
|
// CHECK-LABEL: func @range(%{{.*}}: !llvm.i64) {
|
2019-09-04 00:10:24 +08:00
|
|
|
// CHECK: llvm.mlir.constant(0 : index) : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.mlir.constant(1 : index) : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.mlir.undef : !llvm<"{ i64, i64, i64 }">
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[0] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[1] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[2] : !llvm<"{ i64, i64, i64 }">
|
2019-05-03 02:36:52 +08:00
|
|
|
|
2019-06-29 00:59:22 +08:00
|
|
|
func @view(%arg0: !linalg.buffer<?xf32>, %arg1: !linalg.range) {
|
2019-10-01 20:22:54 +08:00
|
|
|
%0 = linalg.view %arg0[%arg1] : !linalg.buffer<?xf32> -> memref<?xf32, #strided1D>
|
2019-05-03 02:36:52 +08:00
|
|
|
return
|
|
|
|
}
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-LABEL: func @view
|
2019-09-06 23:30:54 +08:00
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[1] : !llvm<"{ i8*, float*, i64 }">
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.bitcast {{.*}} : !llvm<"float*"> to !llvm<"float*">
|
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[0] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
2019-09-04 00:10:24 +08:00
|
|
|
// CHECK-NEXT: llvm.mlir.constant(0 : index) : !llvm.i64
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[1] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
2019-09-04 00:10:24 +08:00
|
|
|
// CHECK-NEXT: llvm.mlir.constant(1 : index) : !llvm.i64
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[2] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[3, 0] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[0] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[1] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.sub %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[2, 0] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
|
|
|
// CHECK-NEXT: llvm.return
|
2019-05-03 02:36:52 +08:00
|
|
|
|
2019-06-29 00:59:22 +08:00
|
|
|
func @view3d(%arg0: !linalg.buffer<?xf32>, %arg1: !linalg.range, %arg2: !linalg.range, %arg3: !linalg.range) {
|
2019-10-01 20:22:54 +08:00
|
|
|
%0 = linalg.view %arg0[%arg1, %arg2, %arg3] : !linalg.buffer<?xf32> -> memref<?x?x?xf32, #strided3D>
|
2019-05-20 23:26:11 +08:00
|
|
|
return
|
|
|
|
}
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-LABEL: func @view3d
|
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[2] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[3, 2] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[1] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[2] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[3, 1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
2019-05-20 23:26:11 +08:00
|
|
|
|
2019-06-29 00:59:22 +08:00
|
|
|
func @slice(%arg0: !linalg.buffer<?xf32>, %arg1: !linalg.range) {
|
2019-10-01 20:22:54 +08:00
|
|
|
%0 = linalg.view %arg0[%arg1] : !linalg.buffer<?xf32> -> memref<?xf32, #strided1D>
|
|
|
|
%1 = linalg.slice %0[%arg1] : memref<?xf32, #strided1D>, !linalg.range, memref<?xf32, #strided1D>
|
2019-05-03 02:36:52 +08:00
|
|
|
return
|
|
|
|
}
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-LABEL: func @slice
|
2019-09-06 23:30:54 +08:00
|
|
|
// insert ptr for view op
|
|
|
|
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
|
|
|
// insert data ptr for slice op
|
2019-10-01 20:22:54 +08:00
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[3, 0] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[1] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[0] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.add %{{.*}}, %{{.*}} : !llvm.i64
|
2019-08-23 03:46:30 +08:00
|
|
|
// insert offset
|
2019-10-01 20:22:54 +08:00
|
|
|
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[1] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
2019-10-01 20:22:54 +08:00
|
|
|
// CHECK-NEXT: llvm.mlir.constant(0 : index)
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[0] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[1] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[2] : !llvm<"{ i64, i64, i64 }">
|
2019-08-23 03:46:30 +08:00
|
|
|
// get size[0] from parent view
|
|
|
|
// CHECK-NEXT: llvm.extractvalue %{{.*}}[2, 0] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
|
|
|
// CHECK-NEXT: llvm.icmp "slt" %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.select %{{.*}}, %{{.*}}, %{{.*}} : !llvm.i1, !llvm.i64
|
|
|
|
// compute size[0] bounded by parent view's size[0]
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.sub %{{.*}}, %{{.*}} : !llvm.i64
|
2019-08-23 03:46:30 +08:00
|
|
|
// bound below by 0
|
|
|
|
// CHECK-NEXT: llvm.icmp "slt" %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.select %{{.*}}, %{{.*}}, %{{.*}} : !llvm.i1, !llvm.i64
|
|
|
|
// compute stride[0] using bounded size
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64
|
2019-08-23 03:46:30 +08:00
|
|
|
// insert size and stride
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[2, 0] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
|
|
|
// CHECK-NEXT: llvm.insertvalue %{{.*}}, %{{.*}}[3, 0] : !llvm<"{ float*, i64, [1 x i64], [1 x i64] }">
|
2019-05-03 02:36:52 +08:00
|
|
|
|
2019-10-01 20:22:54 +08:00
|
|
|
func @dot(%arg0: memref<?xf32, #strided1D>, %arg1: memref<?xf32, #strided1D>, %arg2: memref<f32>) {
|
|
|
|
linalg.dot(%arg0, %arg1, %arg2) : memref<?xf32, #strided1D>, memref<?xf32, #strided1D>, memref<f32>
|
2019-05-03 02:36:52 +08:00
|
|
|
return
|
|
|
|
}
|
2019-10-01 20:22:54 +08:00
|
|
|
// CHECK-LABEL: func @dot(%{{.*}}: !llvm<"{ float*, i64, [1 x i64], [1 x i64] }*">, %{{.*}}: !llvm<"{ float*, i64, [1 x i64], [1 x i64] }*">, %{{.*}}: !llvm<"{ float*, i64 }*">) {
|
2019-09-06 23:30:54 +08:00
|
|
|
// CHECK-COUNT-3: llvm.mlir.constant(1 : index){{.*[[:space:]].*}}llvm.alloca{{.*[[:space:]].*}}llvm.store
|
2019-10-01 20:22:54 +08:00
|
|
|
// CHECK-NEXT: llvm.call @linalg_dot_viewsxf32_viewsxf32_viewf32(%{{.*}}, %{{.*}}, %{{.*}}) : (!llvm<"{ float*, i64, [1 x i64], [1 x i64] }*">, !llvm<"{ float*, i64, [1 x i64], [1 x i64] }*">, !llvm<"{ float*, i64 }*">) -> ()
|
2019-05-14 05:59:55 +08:00
|
|
|
|
2019-10-01 20:22:54 +08:00
|
|
|
func @dim(%arg0: memref<?x?xf32, #strided2D>) {
|
|
|
|
%0 = dim %arg0, 1 : memref<?x?xf32, #strided2D>
|
2019-05-14 05:59:55 +08:00
|
|
|
return
|
|
|
|
}
|
2019-10-01 20:22:54 +08:00
|
|
|
// CHECK-LABEL: func @dim(%{{.*}}: !llvm<"{ float*, i64, [2 x i64], [2 x i64] }*">) {
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[2, 1] : !llvm<"{ float*, i64, [2 x i64], [2 x i64] }">
|
2019-05-17 02:57:36 +08:00
|
|
|
|
2019-10-01 20:22:54 +08:00
|
|
|
func @subview(%arg0: memref<?x?xf32, #strided2D>) {
|
2019-06-24 22:59:59 +08:00
|
|
|
%c0 = constant 0 : index
|
2019-10-01 20:22:54 +08:00
|
|
|
%0 = linalg.subview %arg0[%c0, %c0, %c0, %c0, %c0, %c0] : memref<?x?xf32, #strided2D>
|
2019-06-24 22:59:59 +08:00
|
|
|
return
|
|
|
|
}
|
2019-08-20 01:21:15 +08:00
|
|
|
// CHECK-LABEL: func @subview
|
2019-08-23 03:46:30 +08:00
|
|
|
//
|
|
|
|
// Subview lowers to range + slice op
|
2019-09-04 00:10:24 +08:00
|
|
|
// CHECK: llvm.mlir.undef : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK: llvm.mlir.undef : !llvm<"{ i64, i64, i64 }">
|
2019-09-06 23:30:54 +08:00
|
|
|
// CHECK: llvm.mlir.undef : !llvm<"{ float*, i64, [2 x i64], [2 x i64] }">
|
2019-08-23 03:46:30 +08:00
|
|
|
//
|
|
|
|
// Select occurs in slice op lowering
|
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[2, 0] : !llvm<"{ float*, i64, [2 x i64], [2 x i64] }">
|
|
|
|
// CHECK-NEXT: llvm.icmp "slt" %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.select %{{.*}}, %{{.*}}, %{{.*}} : !llvm.i1, !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.sub %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.icmp "slt" %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.select %{{.*}}, %{{.*}}, %{{.*}} : !llvm.i1, !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
//
|
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[2, 1] : !llvm<"{ float*, i64, [2 x i64], [2 x i64] }">
|
|
|
|
// CHECK-NEXT: llvm.icmp "slt" %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.select %{{.*}}, %{{.*}}, %{{.*}} : !llvm.i1, !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.sub %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.icmp "slt" %{{.*}}, %{{.*}} : !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.select %{{.*}}, %{{.*}}, %{{.*}} : !llvm.i1, !llvm.i64
|
|
|
|
// CHECK-NEXT: llvm.mul %{{.*}}, %{{.*}} : !llvm.i64
|
2019-08-14 00:20:06 +08:00
|
|
|
|
2019-10-01 20:22:54 +08:00
|
|
|
func @view_with_range_and_index(%arg0: memref<?x?xf64, #strided2D>) {
|
2019-08-14 00:20:06 +08:00
|
|
|
%c0 = constant 0 : index
|
|
|
|
%c1 = constant 1 : index
|
|
|
|
%R = linalg.range %c0:%c1:%c1 : !linalg.range
|
|
|
|
loop.for %i0 = %c0 to %c1 step %c1 {
|
2019-10-01 20:22:54 +08:00
|
|
|
%1 = linalg.slice %arg0[%i0, %R] : memref<?x?xf64, #strided2D>, index, !linalg.range, memref<?xf64, #strided1D>
|
2019-08-14 00:20:06 +08:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
// CHECK-LABEL: func @view_with_range_and_index
|
2019-09-06 23:30:54 +08:00
|
|
|
// loop-body.
|
|
|
|
// CHECK: llvm.mlir.undef : !llvm<"{ double*, i64, [1 x i64], [1 x i64] }">
|
2019-08-14 00:20:06 +08:00
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[3, 0] : !llvm<"{ double*, i64, [2 x i64], [2 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[3, 1] : !llvm<"{ double*, i64, [2 x i64], [2 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[1] : !llvm<"{ double*, i64, [2 x i64], [2 x i64] }">
|
2019-10-01 20:22:54 +08:00
|
|
|
// CHECK: llvm.insertvalue %{{.*}}, %{{.*}}[0] : !llvm<"{ double*, i64, [1 x i64], [1 x i64] }">
|
2019-08-14 00:20:06 +08:00
|
|
|
// CHECK: llvm.insertvalue %{{.*}}[1] : !llvm<"{ double*, i64, [1 x i64], [1 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[0] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK: llvm.extractvalue %{{.*}}[1] : !llvm<"{ i64, i64, i64 }">
|
|
|
|
// CHECK: llvm.insertvalue %{{.*}}[2, 0] : !llvm<"{ double*, i64, [1 x i64], [1 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue %{{.*}}[3, 0] : !llvm<"{ double*, i64, [1 x i64], [1 x i64] }">
|
2019-08-24 02:08:59 +08:00
|
|
|
|
2019-10-01 20:22:54 +08:00
|
|
|
func @copy(%arg0: memref<?x?x?xf32, #strided3D>, %arg1: memref<?x?x?xf32, #strided3D>) {
|
|
|
|
linalg.copy(%arg0, %arg1) : memref<?x?x?xf32, #strided3D>, memref<?x?x?xf32, #strided3D>
|
2019-08-24 02:08:59 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
// CHECK-LABEL: func @copy
|
2019-10-01 20:22:54 +08:00
|
|
|
// CHECK: llvm.call @linalg_copy_viewsxsxsxf32_viewsxsxsxf32(%{{.*}}, %{{.*}}) : (!llvm<"{ float*, i64, [3 x i64], [3 x i64] }*">, !llvm<"{ float*, i64, [3 x i64], [3 x i64] }*">) -> ()
|
2019-08-24 08:28:51 +08:00
|
|
|
|
2019-10-01 20:22:54 +08:00
|
|
|
func @transpose(%arg0: memref<?x?x?xf32, #strided3D>) {
|
|
|
|
%0 = linalg.transpose %arg0 (i, j, k) -> (k, i, j) : memref<?x?x?xf32, #strided3D>
|
2019-08-24 08:28:51 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
// CHECK-LABEL: func @transpose
|
2019-09-06 23:30:54 +08:00
|
|
|
// CHECK: llvm.mlir.undef : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
2019-08-24 08:28:51 +08:00
|
|
|
// CHECK: llvm.insertvalue {{.*}}[0] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue {{.*}}[2, 0] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[2, 2] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue {{.*}}[2, 1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[2, 0] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue {{.*}}[2, 2] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[2, 1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
2019-08-24 08:44:55 +08:00
|
|
|
|
2019-10-01 20:22:54 +08:00
|
|
|
func @copy_transpose(%arg0: memref<?x?x?xf32, #strided3D>, %arg1: memref<?x?x?xf32, #strided3D>) {
|
2019-08-24 08:44:55 +08:00
|
|
|
linalg.copy(%arg0, %arg1) {inputPermutation = (i, j, k) -> (i, k, j),
|
|
|
|
outputPermutation = (i, j, k) -> (k, j, i)}
|
2019-10-01 20:22:54 +08:00
|
|
|
: memref<?x?x?xf32, #strided3D>, memref<?x?x?xf32, #strided3D>
|
2019-08-24 08:44:55 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
// CHECK-LABEL: func @copy
|
|
|
|
// Tranpose input
|
2019-09-06 23:30:54 +08:00
|
|
|
// CHECK: llvm.insertvalue {{.*}}[0] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue {{.*}}[2, 0] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[2, 0] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue {{.*}}[2, 1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[2, 2] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue {{.*}}[2, 2] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[2, 1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
2019-08-24 08:44:55 +08:00
|
|
|
// Transpose output
|
2019-09-06 23:30:54 +08:00
|
|
|
// CHECK: llvm.insertvalue {{.*}}[0] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue {{.*}}[2, 0] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[2, 2] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue {{.*}}[2, 1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[2, 1] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.extractvalue {{.*}}[2, 2] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// CHECK: llvm.insertvalue {{.*}}[2, 0] : !llvm<"{ float*, i64, [3 x i64], [3 x i64] }">
|
|
|
|
// Call external copy after promoting input and output structs to pointers
|
|
|
|
// CHECK-COUNT-2: llvm.mlir.constant(1 : index){{.*[[:space:]].*}}llvm.alloca{{.*[[:space:]].*}}llvm.store
|
2019-10-01 20:22:54 +08:00
|
|
|
// CHECK: llvm.call @linalg_copy_viewsxsxsxf32_viewsxsxsxf32(%{{.*}}, %{{.*}}) : (!llvm<"{ float*, i64, [3 x i64], [3 x i64] }*">, !llvm<"{ float*, i64, [3 x i64], [3 x i64] }*">) -> ()
|