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