@@ -690,6 +690,81 @@ func.func @slice_nofold(%arg0: tensor<?x4xf32>) -> tensor<?x4xf32> {
690
690
691
691
// -----
692
692
693
+ // CHECK-LABEL: @slice_fuse
694
+ func.func @slice_fuse (%arg0: tensor <3 x4 xf32 >) -> tensor <1 x2 xf32 > {
695
+ // CHECK-SAME: ([[PARAM_0_:%.+]]: tensor<3x4xf32>) -> tensor<1x2xf32> {
696
+ // CHECK: [[VAR_0_:%.+]] = tosa.slice [[PARAM_0_]] {size = array<i64: 1, 2>, start = array<i64: 0, 0>} : (tensor<3x4xf32>) -> tensor<1x2xf32>
697
+ // CHECK: return [[VAR_0_]] : tensor<1x2xf32>
698
+ %0 = tosa.slice %arg0 { size = array<i64 : 2 , 3 >, start = array<i64 : 0 , 0 >}: (tensor <3 x4 xf32 >) -> tensor <2 x3 xf32 >
699
+ %1 = tosa.slice %0 { size = array<i64 : 1 , 2 >, start = array<i64 : 0 , 0 >}: (tensor <2 x3 xf32 >) -> tensor <1 x2 xf32 >
700
+ return %1 : tensor <1 x2 xf32 >
701
+ }
702
+
703
+ // -----
704
+
705
+ // CHECK-LABEL: @slice_fuse_different_step
706
+ func.func @slice_fuse_different_step (%arg0: tensor <3 x4 xf32 >) -> tensor <1 x1 xf32 > {
707
+ // CHECK-SAME: ([[PARAM_0_:%.+]]: tensor<3x4xf32>) -> tensor<1x1xf32> {
708
+ // CHECK: [[VAR_0_:%.+]] = tosa.slice [[PARAM_0_]] {size = array<i64: 1, 1>, start = array<i64: 0, 0>} : (tensor<3x4xf32>) -> tensor<1x1xf32>
709
+ // CHECK: return [[VAR_0_]] : tensor<1x1xf32>
710
+ %0 = tosa.slice %arg0 { size = array<i64 : 1 , 3 >, start = array<i64 : 0 , 0 >}: (tensor <3 x4 xf32 >) -> tensor <1 x3 xf32 >
711
+ %1 = tosa.slice %0 { size = array<i64 : 1 , 1 >, start = array<i64 : 0 , 0 >}: (tensor <1 x3 xf32 >) -> tensor <1 x1 xf32 >
712
+ return %1 : tensor <1 x1 xf32 >
713
+ }
714
+
715
+ // -----
716
+
717
+ // CHECK-LABEL: @slice_fuse_different_start
718
+ func.func @slice_fuse_different_start (%arg0: tensor <3 x4 xf32 >) -> tensor <1 x1 xf32 > {
719
+ // CHECK-SAME: ([[PARAM_0_:%.+]]: tensor<3x4xf32>) -> tensor<1x1xf32> {
720
+ // CHECK: [[VAR_0_:%.+]] = tosa.slice [[PARAM_0_]] {size = array<i64: 1, 1>, start = array<i64: 1, 0>} : (tensor<3x4xf32>) -> tensor<1x1xf32>
721
+ // CHECK: return [[VAR_0_]] : tensor<1x1xf32>
722
+ %0 = tosa.slice %arg0 { size = array<i64 : 1 , 3 >, start = array<i64 : 1 , 0 >}: (tensor <3 x4 xf32 >) -> tensor <1 x3 xf32 >
723
+ %1 = tosa.slice %0 { size = array<i64 : 1 , 1 >, start = array<i64 : 0 , 0 >}: (tensor <1 x3 xf32 >) -> tensor <1 x1 xf32 >
724
+ return %1 : tensor <1 x1 xf32 >
725
+ }
726
+
727
+ // -----
728
+
729
+ // CHECK-LABEL: @slice_fuse_different_start_2
730
+ func.func @slice_fuse_different_start_2 (%arg0: tensor <10 x10 xf32 >) -> tensor <1 x1 xf32 > {
731
+ // CHECK-SAME: ([[PARAM_0_:%.+]]: tensor<10x10xf32>) -> tensor<1x1xf32> {
732
+ // CHECK: [[VAR_0_:%.+]] = tosa.slice [[PARAM_0_]] {size = array<i64: 1, 1>, start = array<i64: 4, 1>} : (tensor<10x10xf32>) -> tensor<1x1xf32>
733
+ // CHECK: return [[VAR_0_]] : tensor<1x1xf32>
734
+ %0 = tosa.slice %arg0 { size = array<i64 : 5 , 5 >, start = array<i64 : 4 , 0 >}: (tensor <10 x10 xf32 >) -> tensor <5 x5 xf32 >
735
+ %1 = tosa.slice %0 { size = array<i64 : 3 , 3 >, start = array<i64 : 0 , 0 >}: (tensor <5 x5 xf32 >) -> tensor <3 x3 xf32 >
736
+ %2 = tosa.slice %1 { size = array<i64 : 1 , 1 >, start = array<i64 : 0 , 1 >}: (tensor <3 x3 xf32 >) -> tensor <1 x1 xf32 >
737
+ return %2 : tensor <1 x1 xf32 >
738
+ }
739
+
740
+ // -----
741
+
742
+ // CHECK-LABEL: @slice_fuse_different_start_3
743
+ func.func @slice_fuse_different_start_3 (%arg0: tensor <10 x10 xf32 >) -> tensor <1 x1 xf32 > {
744
+ // CHECK-SAME: ([[PARAM_0_:%.+]]: tensor<10x10xf32>) -> tensor<1x1xf32> {
745
+ // CHECK: [[VAR_0_:%.+]] = tosa.slice [[PARAM_0_]] {size = array<i64: 1, 1>, start = array<i64: 4, 2>} : (tensor<10x10xf32>) -> tensor<1x1xf32>
746
+ // CHECK: return [[VAR_0_]] : tensor<1x1xf32>
747
+ %0 = tosa.slice %arg0 { size = array<i64 : 5 , 5 >, start = array<i64 : 4 , 1 >}: (tensor <10 x10 xf32 >) -> tensor <5 x5 xf32 >
748
+ %1 = tosa.slice %0 { size = array<i64 : 3 , 3 >, start = array<i64 : 0 , 0 >}: (tensor <5 x5 xf32 >) -> tensor <3 x3 xf32 >
749
+ %2 = tosa.slice %1 { size = array<i64 : 1 , 1 >, start = array<i64 : 0 , 1 >}: (tensor <3 x3 xf32 >) -> tensor <1 x1 xf32 >
750
+ return %2 : tensor <1 x1 xf32 >
751
+ }
752
+
753
+ // -----
754
+
755
+ // CHECK-LABEL: func.func @slice_fuse_different_start_dynamic
756
+ func.func @slice_fuse_different_start_dynamic (%arg0: tensor <*xf32 >) -> tensor <*xf32 > {
757
+ // CHECK-SAME: ([[PARAM_0_:%.+]]: tensor<*xf32>) -> tensor<*xf32> {
758
+ // CHECK: [[VAR_0_:%.+]] = tosa.slice [[PARAM_0_]] {size = array<i64: 1, 1>, start = array<i64: 4, 1>} : (tensor<*xf32>) -> tensor<*xf32>
759
+ // CHECK: return [[VAR_0_]] : tensor<*xf32>
760
+ %0 = tosa.slice %arg0 { size = array<i64 : 5 , 5 >, start = array<i64 : 4 , 0 >}: (tensor <*xf32 >) -> tensor <*xf32 >
761
+ %1 = tosa.slice %0 { size = array<i64 : 3 , 3 >, start = array<i64 : 0 , 0 >}: (tensor <*xf32 >) -> tensor <*xf32 >
762
+ %2 = tosa.slice %1 { size = array<i64 : 1 , 1 >, start = array<i64 : 0 , 1 >}: (tensor <*xf32 >) -> tensor <*xf32 >
763
+ return %2 : tensor <*xf32 >
764
+ }
765
+
766
+ // -----
767
+
693
768
// CHECK-LABEL: @tile_fold
694
769
func.func @tile_fold (%arg0: tensor <3 x4 xf32 >) -> tensor <3 x4 xf32 > {
695
770
// CHECK: return %arg0
0 commit comments