@@ -90,6 +90,95 @@ func @extract_strided_slice_of_constant_mask() -> (vector<2x1xi1>) {
90
90
91
91
// -----
92
92
93
+ // CHECK-LABEL: extract_strided_fold
94
+ // CHECK-SAME: (%[[ARG:.*]]: vector<4x3xi1>)
95
+ // CHECK-NEXT: return %[[ARG]] : vector<4x3xi1>
96
+ func @extract_strided_fold (%arg : vector <4 x3 xi1 >) -> (vector <4 x3 xi1 >) {
97
+ %0 = vector.extract_strided_slice %arg
98
+ {offsets = [0 , 0 ], sizes = [4 , 3 ], strides = [1 , 1 ]}
99
+ : vector <4 x3 xi1 > to vector <4 x3 xi1 >
100
+ return %0 : vector <4 x3 xi1 >
101
+ }
102
+
103
+ // -----
104
+
105
+ // CHECK-LABEL: extract_strided_fold_insert
106
+ // CHECK-SAME: (%[[ARG:.*]]: vector<4x4xf32>
107
+ // CHECK-NEXT: return %[[ARG]] : vector<4x4xf32>
108
+ func @extract_strided_fold_insert (%a: vector <4 x4 xf32 >, %b: vector <8 x16 xf32 >)
109
+ -> (vector <4 x4 xf32 >) {
110
+ %0 = vector.insert_strided_slice %a , %b {offsets = [2 , 2 ], strides = [1 , 1 ]}
111
+ : vector <4 x4 xf32 > into vector <8 x16 xf32 >
112
+ %1 = vector.extract_strided_slice %0
113
+ {offsets = [2 , 2 ], sizes = [4 , 4 ], strides = [1 , 1 ]}
114
+ : vector <8 x16 xf32 > to vector <4 x4 xf32 >
115
+ return %1 : vector <4 x4 xf32 >
116
+ }
117
+
118
+ // -----
119
+
120
+ // Case where the vector inserted is a subset of the vector extracted.
121
+ // CHECK-LABEL: extract_strided_fold_insert
122
+ // CHECK-SAME: (%[[ARG0:.*]]: vector<6x4xf32>
123
+ // CHECK-NEXT: %[[EXT:.*]] = vector.extract_strided_slice %[[ARG0]]
124
+ // CHECK-SAME: {offsets = [0, 0], sizes = [4, 4], strides = [1, 1]}
125
+ // CHECK-SAME: : vector<6x4xf32> to vector<4x4xf32>
126
+ // CHECK-NEXT: return %[[EXT]] : vector<4x4xf32>
127
+ func @extract_strided_fold_insert (%a: vector <6 x4 xf32 >, %b: vector <8 x16 xf32 >)
128
+ -> (vector <4 x4 xf32 >) {
129
+ %0 = vector.insert_strided_slice %a , %b {offsets = [2 , 2 ], strides = [1 , 1 ]}
130
+ : vector <6 x4 xf32 > into vector <8 x16 xf32 >
131
+ %1 = vector.extract_strided_slice %0
132
+ {offsets = [2 , 2 ], sizes = [4 , 4 ], strides = [1 , 1 ]}
133
+ : vector <8 x16 xf32 > to vector <4 x4 xf32 >
134
+ return %1 : vector <4 x4 xf32 >
135
+ }
136
+
137
+ // -----
138
+
139
+ // Negative test where the extract is not a subset of the element inserted.
140
+ // CHECK-LABEL: extract_strided_fold_negative
141
+ // CHECK-SAME: (%[[ARG0:.*]]: vector<4x4xf32>, %[[ARG1:.*]]: vector<8x16xf32>
142
+ // CHECK: %[[INS:.*]] = vector.insert_strided_slice %[[ARG0]], %[[ARG1]]
143
+ // CHECK-SAME: {offsets = [2, 2], strides = [1, 1]}
144
+ // CHECK-SAME: : vector<4x4xf32> into vector<8x16xf32>
145
+ // CHECK: %[[EXT:.*]] = vector.extract_strided_slice %[[INS]]
146
+ // CHECK-SAME: {offsets = [2, 2], sizes = [6, 4], strides = [1, 1]}
147
+ // CHECK-SAME: : vector<8x16xf32> to vector<6x4xf32>
148
+ // CHECK-NEXT: return %[[EXT]] : vector<6x4xf32>
149
+ func @extract_strided_fold_negative (%a: vector <4 x4 xf32 >, %b: vector <8 x16 xf32 >)
150
+ -> (vector <6 x4 xf32 >) {
151
+ %0 = vector.insert_strided_slice %a , %b {offsets = [2 , 2 ], strides = [1 , 1 ]}
152
+ : vector <4 x4 xf32 > into vector <8 x16 xf32 >
153
+ %1 = vector.extract_strided_slice %0
154
+ {offsets = [2 , 2 ], sizes = [6 , 4 ], strides = [1 , 1 ]}
155
+ : vector <8 x16 xf32 > to vector <6 x4 xf32 >
156
+ return %1 : vector <6 x4 xf32 >
157
+ }
158
+
159
+ // -----
160
+
161
+ // Case where we need to go through 2 level of insert element.
162
+ // CHECK-LABEL: extract_strided_fold_insert
163
+ // CHECK-SAME: (%[[ARG0:.*]]: vector<2x4xf32>, %[[ARG1:.*]]: vector<1x4xf32>,
164
+ // CHECK-NEXT: %[[EXT:.*]] = vector.extract_strided_slice %[[ARG1]]
165
+ // CHECK-SAME: {offsets = [0, 1], sizes = [1, 1], strides = [1, 1]}
166
+ // CHECK-SAME: : vector<1x4xf32> to vector<1x1xf32>
167
+ // CHECK-NEXT: return %[[EXT]] : vector<1x1xf32>
168
+ func @extract_strided_fold_insert (%a: vector <2 x4 xf32 >, %b: vector <1 x4 xf32 >,
169
+ %c : vector <1 x4 xf32 >) -> (vector <1 x1 xf32 >) {
170
+ %0 = vector.insert_strided_slice %b , %a {offsets = [0 , 0 ], strides = [1 , 1 ]}
171
+ : vector <1 x4 xf32 > into vector <2 x4 xf32 >
172
+ %1 = vector.insert_strided_slice %c , %0 {offsets = [1 , 0 ], strides = [1 , 1 ]}
173
+ : vector <1 x4 xf32 > into vector <2 x4 xf32 >
174
+ %2 = vector.extract_strided_slice %1
175
+ {offsets = [0 , 1 ], sizes = [1 , 1 ], strides = [1 , 1 ]}
176
+ : vector <2 x4 xf32 > to vector <1 x1 xf32 >
177
+ return %2 : vector <1 x1 xf32 >
178
+ }
179
+
180
+ // -----
181
+
93
182
// CHECK-LABEL: transpose_1D_identity
94
183
// CHECK-SAME: ([[ARG:%.*]]: vector<4xf32>)
95
184
func @transpose_1D_identity (%arg : vector <4 xf32 >) -> vector <4 xf32 > {
0 commit comments