DefaultValuedOptionalAttr<DenseI64ArrayAttr, "{}">:$interchange);
let results = (outs PDL_Operation:$tiled_linalg_op,
Variadic<PDL_Operation>:$loops);
+
+ let builders = [
+ OpBuilder<(ins "Value":$target,
+ "ArrayRef<OpFoldResult>":$mixedTileSizes,
+ CArg<"ArrayRef<int64_t>", "{}">:$interchange)>
+ ];
let hasCustomAssemblyFormat = 1;
// TileToScfForOp
//===----------------------------------------------------------------------===//
+void transform::TileToScfForOp::build(OpBuilder &builder, OperationState &result,
+ Value target,
+ ArrayRef<OpFoldResult> mixedTileSizes,
+ ArrayRef<int64_t> interchange) {
+ SmallVector<int64_t> staticTileSizes;
+ SmallVector<Value> dynamicTileSizes;
+ dispatchIndexOpFoldResults(mixedTileSizes, dynamicTileSizes, staticTileSizes);
+ // Call the default builder which sets up the proper operands segment sizes
+ // attributes for multiple variadic operands. In the absence of this,
+ // horrible bugs ensue.
+ auto staticTileSizesAttr = builder.getDenseI64ArrayAttr(staticTileSizes);
+ int64_t numExpectedLoops =
+ staticTileSizes.size() - llvm::count(staticTileSizes, 0);
+ SmallVector<Type> resultTypes;
+ resultTypes.reserve(numExpectedLoops);
+ build(builder, result,
+ /*tiled_linalg_op=*/target.getType(),
+ /*loops=*/resultTypes,
+ /*target=*/target,
+ /*dynamic_sizes=*/dynamicTileSizes,
+ /*static_sizes=*/staticTileSizesAttr,
+ /*interchange=*/builder.getDenseI64ArrayAttr(interchange));
+}
+
DiagnosedSilenceableFailure
transform::TileToScfForOp::apply(TransformResults &transformResults,
TransformState &state) {