// RUN: mlir-opt %s -convert-linalg-to-affine-loops | FileCheck %s // Test that we can lower all the way to LLVM without crashing, don't check results here. // RUN: mlir-opt %s --convert-linalg-to-llvm -o=/dev/null 2>&1 // CHECK-DAG: #[[strided2D:.*]] = affine_map<(d0, d1)[s0, s1] -> (d0 * s1 + s0 + d1)> // CHECK-DAG: #[[strided3D:.*]] = affine_map<(d0, d1, d2)[s0, s1, s2] -> (d0 * s1 + s0 + d1 * s2 + d2)> // CHECK-DAG: #[[stride2Dilation1:.*]] = affine_map<(d0, d1) -> (d0 * 2 + d1)> func @matmul(%arg0: memref, %M: index, %N: index, %K: index) { %c0 = constant 0 : index %c1 = constant 1 : index %A = view %arg0[%c0][%M, %K] : memref to memref %B = view %arg0[%c0][%K, %N] : memref to memref %C = view %arg0[%c0][%M, %N] : memref to memref linalg.matmul(%A, %B, %C) : memref, memref, memref return } // CHECK-LABEL: func @matmul(%{{.*}}: memref, // CHECK-SAME: [[M:arg[0-9]+]]: index // CHECK-SAME: [[N:arg[0-9]+]]: index // CHECK-SAME: [[K:arg[0-9]+]]: index // CHECK: %[[A:.*]] = std.view %{{.*}}[{{.*}}] : memref to memref // CHECK: %[[B:.*]] = std.view %{{.*}}[{{.*}}] : memref to memref // CHECK: %[[C:.*]] = std.view %{{.*}}[{{.*}}] : memref to memref // CHECK: affine.for %{{.*}} = 0 to %{{.*}} { // CHECK: affine.for %{{.*}} = 0 to %{{.*}} { // CHECK: affine.for %{{.*}} = 0 to %{{.*}} { // CHECK-DAG: %[[a:.*]] = affine.load %[[A]][%{{.*}}, %{{.*}}] : memref // CHECK-DAG: %[[b:.*]] = affine.load %[[B]][%{{.*}}, %{{.*}}] : memref // CHECK-DAG: %[[inc:.*]] = mulf %[[a]], %[[b]] : f32 // CHECK-DAG: %[[c:.*]] = affine.load %[[C]][%{{.*}}, %{{.*}}] : memref // CHECK-DAG: %[[res:.*]] = addf %[[c]], %[[inc]] : f32 // CHECK: affine.store %[[res]], %[[C]][%{{.*}}, %{{.*}}] : memref func @conv_view3(%arg0: memref, %arg1: memref, %arg2: memref) { linalg.conv(%arg0, %arg1, %arg2) {strides = [2]}: memref, memref, memref return } // CHECK-LABEL: func @conv_view3( // CHECK: %{{.*}}: memref, %{{.*}}: memref, %{{.*}}: memref) { // CHECK: %[[Z0:.*]] = dim %arg0, 0 : memref // CHECK: %[[Q:.*]] = dim %arg0, 1 : memref // CHECK: %[[K:.*]] = dim %arg0, 2 : memref // CHECK: %[[B:.*]] = dim %arg1, 0 : memref // CHECK: %[[X0:.*]] = dim %arg2, 1 : memref // CHECK: affine.for %{{.*}} = 0 to %[[B]] { // CHECK: affine.for %{{.*}} = 0 to %[[X0]] { // CHECK: affine.for %{{.*}} = 0 to %[[K]] { // CHECK: affine.for %{{.*}} = 0 to %[[Q]] { // CHECK: affine.for %{{.*}} = 0 to %[[Z0]] { // CHECK: %[[SUM:.*]] = affine.apply #[[stride2Dilation1]](%{{.*}}, %{{.*}})