1// RUN: mlir-opt %s -test-linalg-transform-patterns=test-interchange-pattern=4,0,3,1,2 | FileCheck %s 2// RUN: mlir-opt %s -test-linalg-transform-patterns=test-interchange-pattern=4,0,3,1,2 -test-linalg-transform-patterns=test-interchange-pattern=1,3,4,2,0 | FileCheck --check-prefix=CANCEL-OUT %s 3 4#map0 = affine_map<(d0, d1, d2, d3, d4) -> (d0, d1, d2, d3, d4)> 5#map1 = affine_map<(d0, d1, d2, d3, d4) -> (d0, d1, d3)> 6 7func @interchange_generic_op(%arg0 : memref<1x2x3x4x5xindex>, %arg1 : memref<1x2x4xindex>) { 8 linalg.generic { 9 indexing_maps = [#map0, #map1], 10 iterator_types = ["parallel", "parallel", "reduction", "parallel", "reduction"]} 11 ins(%arg0 : memref<1x2x3x4x5xindex>) 12 outs(%arg1 : memref<1x2x4xindex>) { 13 ^bb0(%arg2 : index, %arg3 : index) : 14 %0 = linalg.index 0 : index 15 %1 = linalg.index 1 : index 16 %2 = linalg.index 4 : index 17 %3 = subi %0, %1 : index 18 %4 = addi %3, %2 : index 19 %5 = addi %4, %arg2 : index 20 linalg.yield %5 : index 21 } 22 return 23} 24 25// CHECK-DAG: #[[MAP0:.+]] = affine_map<(d0, d1, d2, d3, d4) -> (d1, d3, d4, d2, d0)> 26// CHECK-DAG: #[[MAP1:.+]] = affine_map<(d0, d1, d2, d3, d4) -> (d1, d3, d2)> 27// CHECK: func @interchange_generic_op 28// CHECK: linalg.generic 29// CHECK-SAME: indexing_maps = [#[[MAP0]], #[[MAP1]]] 30// CHECK-SAME: iterator_types = ["reduction", "parallel", "parallel", "parallel", "reduction"] 31// CHECK-DAG: %[[IDX0:.+]] = linalg.index 1 : index 32// CHECK-DAG: %[[IDX1:.+]] = linalg.index 3 : index 33// CHECK-DAG: %[[IDX4:.+]] = linalg.index 0 : index 34// CHECK: %[[T0:.+]] = subi %[[IDX0]], %[[IDX1]] : index 35// CHECK: %[[T1:.+]] = addi %[[T0]], %[[IDX4]] : index 36// CHECK: %[[T2:.+]] = addi %[[T1]], %{{.*}} : index 37 38// CANCEL-OUT-DAG: #[[MAP0:.+]] = affine_map<(d0, d1, d2, d3, d4) -> (d0, d1, d2, d3, d4)> 39// CANCEL-OUT-DAG: #[[MAP1:.+]] = affine_map<(d0, d1, d2, d3, d4) -> (d0, d1, d3)> 40// CANCEL-OUT: func @interchange_generic_op 41// CANCEL-OUT: linalg.generic 42// CANCEL-OUT-SAME: indexing_maps = [#[[MAP0]], #[[MAP1]]] 43// CANCEL-OUT-SAME: iterator_types = ["parallel", "parallel", "reduction", "parallel", "reduction"] 44// CANCEL-OUT-DAG: %[[IDX0:.+]] = linalg.index 0 : index 45// CANCEL-OUT-DAG: %[[IDX1:.+]] = linalg.index 1 : index 46// CANCEL-OUT-DAG: %[[IDX4:.+]] = linalg.index 4 : index 47// CANCEL-OUT: %[[T0:.+]] = subi %[[IDX0]], %[[IDX1]] : index 48// CANCEL-OUT: %[[T1:.+]] = addi %[[T0]], %[[IDX4]] : index 49// CANCEL-OUT: %[[T2:.+]] = addi %[[T1]], %{{.*}} : index 50 51 52