@@ -82,6 +82,118 @@ func.func @transfer_write_and_vector_rank_reducing_to_0d(
82
82
// CHECK: %[[SHCAST:.+]] = vector.shape_cast %[[VECTOR]] : vector<1x1x1xf32> to vector<f32>
83
83
// CHECK: vector.transfer_write %[[SHCAST]], %[[SUBVIEW]]{{.*}} : vector<f32>, memref<f32>
84
84
85
+ func.func @transfer_read_dynamic_rank_reducing (
86
+ %arg : memref <?x1 xi8 , strided <[?, ?], offset : ?>>) -> vector <[16 ]x1 xi8 > {
87
+ %c0 = arith.constant 0 : index
88
+ %pad = arith.constant 0 : i8
89
+ %v = vector.transfer_read %arg [%c0 , %c0 ], %pad {in_bounds = [true , true ]} :
90
+ memref <?x1 xi8 , strided <[?, ?], offset : ?>>, vector <[16 ]x1 xi8 >
91
+ return %v : vector <[16 ]x1 xi8 >
92
+ }
93
+ // CHECK-LABEL: func @transfer_read_dynamic_rank_reducing
94
+ // CHECK-SAME: %[[ARG:.+]]: memref<?x1xi8
95
+ // CHECK: %[[C0:.+]] = arith.constant 0 : index
96
+ // CHECK: %[[DIM0:.+]] = memref.dim %[[ARG]], %[[C0]] : memref<?x1xi8, strided<[?, ?], offset: ?>>
97
+ // CHECK: %[[SUBVIEW:.+]] = memref.subview %[[ARG]][0, 0] [%[[DIM0]], 1] [1, 1] : memref<?x1xi8, {{.*}}> to memref<?xi8, {{.*}}>
98
+ // CHECK: vector.transfer_read %[[SUBVIEW]]{{.*}} : memref<?xi8, {{.*}}>, vector<[16]xi8>
99
+
100
+ func.func @masked_transfer_read_dynamic_rank_reducing_1 (
101
+ %arg : memref <?x1 xi8 , strided <[?, ?], offset : ?>>,
102
+ %mask_dim0 : index ) -> vector <[16 ]x1 xi8 > {
103
+ %c0 = arith.constant 0 : index
104
+ %c1 = arith.constant 1 : index
105
+ %pad = arith.constant 0 : i8
106
+ %mask = vector.create_mask %mask_dim0 , %c1 : vector <[16 ]x1 xi1 >
107
+ %v = vector.transfer_read %arg [%c0 , %c0 ], %pad , %mask {in_bounds = [true , true ]} :
108
+ memref <?x1 xi8 , strided <[?, ?], offset : ?>>, vector <[16 ]x1 xi8 >
109
+ return %v : vector <[16 ]x1 xi8 >
110
+ }
111
+ // CHECK-LABEL: func @masked_transfer_read_dynamic_rank_reducing_1
112
+ // CHECK-SAME: %[[ARG:.+]]: memref<?x1xi8
113
+ // CHECK-SAME: %[[MASK_DIM0:.+]]: index
114
+ // CHECK: %[[C0:.+]] = arith.constant 0 : index
115
+ // CHECK: %[[PAD:.+]] = arith.constant 0 : i8
116
+ // CHECK: %[[MASK:.+]] = vector.create_mask %[[MASK_DIM0]] : vector<[16]xi1>
117
+ // CHECK: %[[DIM0:.+]] = memref.dim %[[ARG]], %[[C0]] : memref<?x1xi8, strided<[?, ?], offset: ?>>
118
+ // CHECK: %[[SUBVIEW:.+]] = memref.subview %[[ARG]][0, 0] [%[[DIM0]], 1] [1, 1] : memref<?x1xi8, {{.*}}> to memref<?xi8, {{.*}}>
119
+ // CHECK: vector.transfer_read %[[SUBVIEW]][{{.*}}], %[[PAD]], %[[MASK]] {in_bounds = [true]} : memref<?xi8, {{.*}}>, vector<[16]xi8>
120
+
121
+ func.func @masked_transfer_read_dynamic_rank_reducing_2 (
122
+ %arg : memref <1 x?x3 x1 x?x1 xi8 , strided <[?, ?, ?, ?, ?, ?], offset : ?>>,
123
+ %mask_dim1 : index , %mask_dim4 : index ) -> vector <1 x[1 ]x3 x1 x[16 ]x1 xi8 > {
124
+ %c0 = arith.constant 0 : index
125
+ %c1 = arith.constant 1 : index
126
+ %c2 = arith.constant 2 : index
127
+ %pad = arith.constant 0 : i8
128
+ %mask = vector.create_mask %c1 , %mask_dim1 , %c2 , %c1 , %mask_dim4 , %c1 : vector <1 x[1 ]x3 x1 x[16 ]x1 xi1 >
129
+ %v = vector.transfer_read %arg [%c0 , %c0 , %c0 , %c0 , %c0 , %c0 ], %pad , %mask {in_bounds = [true , true , true , true , true , true ]} :
130
+ memref <1 x?x3 x1 x?x1 xi8 , strided <[?, ?, ?, ?, ?, ?], offset : ?>>, vector <1 x[1 ]x3 x1 x[16 ]x1 xi8 >
131
+ return %v : vector <1 x[1 ]x3 x1 x[16 ]x1 xi8 >
132
+ }
133
+ // CHECK-LABEL: func @masked_transfer_read_dynamic_rank_reducing_2
134
+ // CHECK-SAME: %[[ARG:.+]]: memref<1x?x3x1x?x1xi8
135
+ // CHECK-SAME: %[[MASK_DIM1:.+]]: index, %[[MASK_DIM4:.+]]: index
136
+ // CHECK-DAG: %[[C0:.+]] = arith.constant 0 : index
137
+ // CHECK-DAG: %[[C1:.+]] = arith.constant 1 : index
138
+ // CHECK-DAG: %[[C2:.+]] = arith.constant 2 : index
139
+ // CHECK-DAG: %[[C4:.+]] = arith.constant 4 : index
140
+ // CHECK-DAG: %[[PAD:.+]] = arith.constant 0 : i8
141
+ // CHECK: %[[MASK:.+]] = vector.create_mask %[[MASK_DIM1]], %[[C2]], %[[MASK_DIM4]] : vector<[1]x3x[16]xi1>
142
+ // CHECK: %[[DIM1:.+]] = memref.dim %[[ARG]], %[[C1]] : memref<1x?x3x1x?x1xi8, strided<[?, ?, ?, ?, ?, ?], offset: ?>>
143
+ // CHECK: %[[DIM4:.+]] = memref.dim %[[ARG]], %[[C4]] : memref<1x?x3x1x?x1xi8, strided<[?, ?, ?, ?, ?, ?], offset: ?>>
144
+ // CHECK: %[[SUBVIEW:.+]] = memref.subview %[[ARG]][0, 0, 0, 0, 0, 0] [1, %[[DIM1]], 3, 1, %[[DIM4]], 1] [1, 1, 1, 1, 1, 1] : memref<1x?x3x1x?x1xi8, {{.*}}> to memref<?x3x?xi8, {{.*}}>
145
+ // CHECK: vector.transfer_read %[[SUBVIEW]][{{.*}}], %[[PAD]], %[[MASK]] {in_bounds = [true, true, true]} : memref<?x3x?xi8, {{.*}}>, vector<[1]x3x[16]xi8>
146
+
147
+ /// Only masks operands of vector.create_mask are currently supported.
148
+ func.func @unsupported_masked_transfer_read_dynamic_rank_reducing_1 (
149
+ %arg : memref <?x1 xi8 , strided <[?, ?], offset : ?>>,
150
+ %mask : vector <[16 ]x1 xi1 >) -> vector <[16 ]x1 xi8 > {
151
+ %c0 = arith.constant 0 : index
152
+ %pad = arith.constant 0 : i8
153
+ %v = vector.transfer_read %arg [%c0 , %c0 ], %pad , %mask {in_bounds = [true , true ]} :
154
+ memref <?x1 xi8 , strided <[?, ?], offset : ?>>, vector <[16 ]x1 xi8 >
155
+ return %v : vector <[16 ]x1 xi8 >
156
+ }
157
+ // CHECK-LABEL: func @unsupported_masked_transfer_read_dynamic_rank_reducing_1
158
+ // CHECK-SAME: %[[ARG:.+]]: memref<?x1xi8
159
+ // CHECK-NOT: vector.create_mask
160
+ // CHECK-NOT: memref.subview
161
+ // CHECK: vector.transfer_read %[[ARG]]
162
+
163
+ /// Unit dim mask must be constant of 1.
164
+ func.func @unsupported_masked_transfer_read_dynamic_rank_reducing_2 (
165
+ %arg : memref <?x1 xi8 , strided <[?, ?], offset : ?>>,
166
+ %mask_dim0 : index , %mask_dim1 : index ) -> vector <[16 ]x1 xi8 > {
167
+ %c0 = arith.constant 0 : index
168
+ %c1 = arith.constant 1 : index
169
+ %pad = arith.constant 0 : i8
170
+ %mask = vector.create_mask %mask_dim0 , %mask_dim1 : vector <[16 ]x1 xi1 >
171
+ %v = vector.transfer_read %arg [%c0 , %c0 ], %pad , %mask {in_bounds = [true , true ]} :
172
+ memref <?x1 xi8 , strided <[?, ?], offset : ?>>, vector <[16 ]x1 xi8 >
173
+ return %v : vector <[16 ]x1 xi8 >
174
+ }
175
+ // CHECK-LABEL: func @unsupported_masked_transfer_read_dynamic_rank_reducing_2
176
+ // CHECK-SAME: %[[ARG:.+]]: memref<?x1xi8
177
+ // CHECK-NOT: memref.subview
178
+ // CHECK: vector.transfer_read {{.*}} vector<[16]x1xi8>
179
+
180
+ /// Unit dim must be non-scalable.
181
+ func.func @masked_transfer_read_dynamic_rank_reducing_scalable_unit_dim (
182
+ %arg : memref <?x1 xi8 , strided <[?, ?], offset : ?>>,
183
+ %mask_dim0 : index ) -> vector <[16 ]x[1 ]xi8 > {
184
+ %c0 = arith.constant 0 : index
185
+ %c1 = arith.constant 1 : index
186
+ %pad = arith.constant 0 : i8
187
+ %mask = vector.create_mask %mask_dim0 , %c1 : vector <[16 ]x[1 ]xi1 >
188
+ %v = vector.transfer_read %arg [%c0 , %c0 ], %pad , %mask {in_bounds = [true , true ]} :
189
+ memref <?x1 xi8 , strided <[?, ?], offset : ?>>, vector <[16 ]x[1 ]xi8 >
190
+ return %v : vector <[16 ]x[1 ]xi8 >
191
+ }
192
+ // CHECK-LABEL: func @masked_transfer_read_dynamic_rank_reducing_scalable_unit_dim
193
+ // CHECK-SAME: %[[ARG:.+]]: memref<?x1xi8
194
+ // CHECK-NOT: memref.subview
195
+ // CHECK: vector.transfer_read {{.*}} vector<[16]x[1]xi8>
196
+
85
197
module attributes {transform.with_named_sequence } {
86
198
transform.named_sequence @__transform_main (%func_op: !transform.op <" func.func" > {transform.readonly }) {
87
199
transform.apply_patterns to %func_op {
0 commit comments