@@ -558,3 +558,100 @@ func @indexed_generic_op_reshape_consumer_fusion(%arg0 : tensor<?x?x4x5xi32>)
558
558
// CHECK: linalg.indexed_generic
559
559
// CHECK-SAME: indexing_maps = [#[[$MAP0]], #[[$MAP1]]]
560
560
// CHECK-NOT: linalg.tensor_reshape
561
+
562
+ // -----
563
+
564
+ // CHECK-DAG: #[[MAP0:.+]] = affine_map<(d0, d1, d2) -> (d0, d1 + d2 * 7)>
565
+ // CHECK-DAG: #[[MAP1:.+]] = affine_map<(d0, d1, d2) -> (d0, d1, d2)>
566
+
567
+ #map0 = affine_map <(d0 , d1 , d2 ) -> (d0 )>
568
+ #map1 = affine_map <(d0 , d1 , d2 ) -> (d1 , d2 )>
569
+ #map2 = affine_map <(d0 , d1 , d2 ) -> (d0 , d2 , d1 )>
570
+ #map3 = affine_map <(d0 , d1 , d2 ) -> (d0 , d1 , d2 )>
571
+ func @generic_op_021_permultation_reshape_producer_fusion (%arg0 : tensor <3 x35 xf32 >) -> tensor <3 x7 x5 xf32 > {
572
+ %0 = linalg.tensor_reshape %arg0 [#map0 , #map1 ] : tensor <3 x35 xf32 > into tensor <3 x5 x7 xf32 >
573
+ %1 = linalg.generic {index ing_maps = [#map2 , #map3 ], iterator_types = [" parallel" , " parallel" , " parallel" ]} ins (%0 : tensor <3 x5 x7 xf32 >) {
574
+ ^bb0 (%arg2: f32 ): // no predecessors
575
+ linalg.yield %arg2 : f32
576
+ } -> tensor <3 x7 x5 xf32 >
577
+ return %1 : tensor <3 x7 x5 xf32 >
578
+ }
579
+
580
+ // CHECK-LABEL: func @generic_op_021_permultation_reshape_producer_fusion
581
+ // CHECK-NOT: linalg.tensor_reshape
582
+ // CHECK: linalg.generic
583
+ // CHECK-SAME: indexing_maps = [#[[$MAP0]], #[[$MAP1]]]
584
+ // CHECK-NOT: linalg.tensor_reshape
585
+
586
+ // -----
587
+
588
+ // CHECK-DAG: #[[MAP0:.+]] = affine_map<(d0, d1, d2) -> (d2, d0 * 7 + d1)>
589
+ // CHECK-DAG: #[[MAP1:.+]] = affine_map<(d0, d1, d2) -> (d0, d1, d2)>
590
+
591
+ #map0 = affine_map <(d0 , d1 , d2 ) -> (d0 )>
592
+ #map1 = affine_map <(d0 , d1 , d2 ) -> (d1 , d2 )>
593
+ #map2 = affine_map <(d0 , d1 , d2 ) -> (d1 , d2 , d0 )>
594
+ #map3 = affine_map <(d0 , d1 , d2 ) -> (d0 , d1 , d2 )>
595
+ func @generic_op_120_permultation_reshape_producer_fusion (%arg0 : tensor <3 x35 xf32 >) -> tensor <5 x7 x3 xf32 > {
596
+ %0 = linalg.tensor_reshape %arg0 [#map0 , #map1 ] : tensor <3 x35 xf32 > into tensor <3 x5 x7 xf32 >
597
+ %1 = linalg.generic {index ing_maps = [#map2 , #map3 ], iterator_types = [" parallel" , " parallel" , " parallel" ]} ins (%0 : tensor <3 x5 x7 xf32 >) {
598
+ ^bb0 (%arg2: f32 ): // no predecessors
599
+ linalg.yield %arg2 : f32
600
+ } -> tensor <5 x7 x3 xf32 >
601
+ return %1 : tensor <5 x7 x3 xf32 >
602
+ }
603
+
604
+ // CHECK-LABEL: func @generic_op_120_permultation_reshape_producer_fusion
605
+ // CHECK-NOT: linalg.tensor_reshape
606
+ // CHECK: linalg.generic
607
+ // CHECK-SAME: indexing_maps = [#[[$MAP0]], #[[$MAP1]]]
608
+ // CHECK-NOT: linalg.tensor_reshape
609
+
610
+ // -----
611
+
612
+ // CHECK-DAG: #[[MAP0:.+]] = affine_map<(d0, d1, d2) -> (d1, d0 * 7 + d2)>
613
+ // CHECK-DAG: #[[MAP1:.+]] = affine_map<(d0, d1, d2) -> (d0, d1, d2)>
614
+
615
+ #map0 = affine_map <(d0 , d1 , d2 ) -> (d0 )>
616
+ #map1 = affine_map <(d0 , d1 , d2 ) -> (d1 , d2 )>
617
+ #map2 = affine_map <(d0 , d1 , d2 ) -> (d1 , d0 , d2 )>
618
+ #map3 = affine_map <(d0 , d1 , d2 ) -> (d0 , d1 , d2 )>
619
+ func @generic_op_102_permultation_reshape_producer_fusion (%arg0 : tensor <3 x35 xf32 >) -> tensor <5 x3 x7 xf32 > {
620
+ %0 = linalg.tensor_reshape %arg0 [#map0 , #map1 ] : tensor <3 x35 xf32 > into tensor <3 x5 x7 xf32 >
621
+ %1 = linalg.generic {index ing_maps = [#map2 , #map3 ], iterator_types = [" parallel" , " parallel" , " parallel" ]} ins (%0 : tensor <3 x5 x7 xf32 >) {
622
+ ^bb0 (%arg2: f32 ): // no predecessors
623
+ linalg.yield %arg2 : f32
624
+ } -> tensor <5 x3 x7 xf32 >
625
+ return %1 : tensor <5 x3 x7 xf32 >
626
+ }
627
+
628
+ // CHECK-LABEL: func @generic_op_102_permultation_reshape_producer_fusion
629
+ // CHECK-NOT: linalg.tensor_reshape
630
+ // CHECK: linalg.generic
631
+ // CHECK-SAME: indexing_maps = [#[[$MAP0]], #[[$MAP1]]]
632
+ // CHECK-NOT: linalg.tensor_reshape
633
+
634
+ // -----
635
+
636
+ // CHECK-DAG: #[[MAP0:.+]] = affine_map<(d0, d1, d2) -> (d0, d1, d2)>
637
+ // CHECK-DAG: #[[MAP1:.+]] = affine_map<(d0, d1, d2) -> (d1, d0 * 7 + d2)>
638
+
639
+
640
+ #map0 = affine_map <(d0 , d1 , d2 ) -> (d0 , d1 , d2 )>
641
+ #map1 = affine_map <(d0 , d1 , d2 ) -> (d1 , d0 , d2 )>
642
+ #map2 = affine_map <(d0 , d1 , d2 ) -> (d0 )>
643
+ #map3 = affine_map <(d0 , d1 , d2 ) -> (d1 , d2 )>
644
+ func @generic_op_102_permultation_reshape_consumer_fusion (%arg0 : tensor <3 x5 x7 xf32 >) -> tensor <5 x21 xf32 > {
645
+ %0 = linalg.generic {index ing_maps = [#map0 , #map1 ], iterator_types = [" parallel" , " parallel" , " parallel" ]} ins (%arg0 : tensor <3 x5 x7 xf32 >) {
646
+ ^bb0 (%arg2: f32 ): // no predecessors
647
+ linalg.yield %arg2 : f32
648
+ } -> tensor <5 x3 x7 xf32 >
649
+ %1 = linalg.tensor_reshape %0 [#map2 , #map3 ] : tensor <5 x3 x7 xf32 > into tensor <5 x21 xf32 >
650
+ return %1 : tensor <5 x21 xf32 >
651
+ }
652
+
653
+ // CHECK-LABEL: func @generic_op_102_permultation_reshape_consumer_fusion
654
+ // CHECK-NOT: linalg.tensor_reshape
655
+ // CHECK: linalg.generic
656
+ // CHECK-SAME: indexing_maps = [#[[$MAP0]], #[[$MAP1]]]
657
+ // CHECK-NOT: linalg.tensor_reshape
0 commit comments