@@ -2477,7 +2477,7 @@ void transform::TileUsingForOp::build(
24772477 /* target=*/ target,
24782478 /* dynamic_sizes=*/ dynamicTileSizes,
24792479 /* static_sizes=*/ staticTileSizesAttr,
2480- /* interchange=*/ builder.getI64ArrayAttr (interchange),
2480+ /* interchange=*/ builder.getDenseI64ArrayAttr (interchange),
24812481 /* scalable_sizes=*/ expandedScalableSizes);
24822482}
24832483
@@ -2611,8 +2611,7 @@ transform::TileUsingForOp::apply(transform::TransformRewriter &rewriter,
26112611 });
26122612 }
26132613
2614- tilingOptions.setInterchange (
2615- extractFromIntegerArrayAttr<int64_t >(getInterchange ()));
2614+ tilingOptions.setInterchange (getInterchange ());
26162615 FailureOr<scf::SCFTilingResult> maybeTilingResult =
26172616 tileUsingSCFForOp (rewriter, tilingInterface, tilingOptions);
26182617 if (failed (maybeTilingResult))
@@ -2649,6 +2648,33 @@ SmallVector<OpFoldResult> transform::TileUsingForOp::getMixedSizes() {
26492648 return results;
26502649}
26512650
2651+ // We want to parse `DenseI64ArrayAttr` using the short form without the
2652+ // `array` prefix to be consistent in the IR with `parseDynamicIndexList`.
2653+ ParseResult parseOptionalInterchange (OpAsmParser &parser,
2654+ OperationState &result) {
2655+ if (succeeded (parser.parseOptionalLBrace ())) {
2656+ if (failed (parser.parseKeyword (" interchange" )))
2657+ return parser.emitError (parser.getNameLoc ()) << " expect `interchange`" ;
2658+ if (failed (parser.parseEqual ()))
2659+ return parser.emitError (parser.getNameLoc ()) << " expect `=`" ;
2660+ result.addAttribute (" interchange" ,
2661+ DenseI64ArrayAttr::parse (parser, Type{}));
2662+ if (failed (parser.parseRBrace ()))
2663+ return parser.emitError (parser.getNameLoc ()) << " expect `}`" ;
2664+ }
2665+ return success ();
2666+ }
2667+
2668+ void printOptionalInterchange (OpAsmPrinter &p,
2669+ ArrayRef<int64_t > interchangeVals) {
2670+ if (!interchangeVals.empty ()) {
2671+ p << " {interchange = [" ;
2672+ llvm::interleaveComma (interchangeVals, p,
2673+ [&](int64_t integer) { p << integer; });
2674+ p << " ]}" ;
2675+ }
2676+ }
2677+
26522678ParseResult transform::TileUsingForOp::parse (OpAsmParser &parser,
26532679 OperationState &result) {
26542680 OpAsmParser::UnresolvedOperand target;
@@ -2660,7 +2686,7 @@ ParseResult transform::TileUsingForOp::parse(OpAsmParser &parser,
26602686
26612687 if (parser.parseOperand (target) || parser.getCurrentLocation (&operandLoc) ||
26622688 parseDynamicIndexList (parser, dynamicSizes, staticSizes, scalableVals) ||
2663- parser. parseOptionalAttrDict ( result. attributes ) ||
2689+ parseOptionalInterchange (parser, result) ||
26642690 parser.parseColonType (functionalType))
26652691 return ParseResult::failure ();
26662692
@@ -2694,10 +2720,7 @@ void TileUsingForOp::print(OpAsmPrinter &p) {
26942720 printDynamicIndexList (p, getOperation (), getDynamicSizes (), getStaticSizes (),
26952721 /* valueTypes=*/ {}, getScalableSizesAttr (),
26962722 OpAsmParser::Delimiter::Square);
2697- p.printOptionalAttrDict (
2698- (*this )->getAttrs (),
2699- /* elidedAttrs=*/ {getScalableSizesAttrName (getOperation ()->getName ()),
2700- getStaticSizesAttrName (getOperation ()->getName ())});
2723+ printOptionalInterchange (p, getInterchange ());
27012724 p << " : " ;
27022725 p.printFunctionalType (getOperands ().getTypes (), getResults ().getTypes ());
27032726}
0 commit comments