@@ -2477,7 +2477,7 @@ void transform::TileUsingForOp::build(
2477
2477
/* target=*/ target,
2478
2478
/* dynamic_sizes=*/ dynamicTileSizes,
2479
2479
/* static_sizes=*/ staticTileSizesAttr,
2480
- /* interchange=*/ builder.getI64ArrayAttr (interchange),
2480
+ /* interchange=*/ builder.getDenseI64ArrayAttr (interchange),
2481
2481
/* scalable_sizes=*/ expandedScalableSizes);
2482
2482
}
2483
2483
@@ -2611,8 +2611,7 @@ transform::TileUsingForOp::apply(transform::TransformRewriter &rewriter,
2611
2611
});
2612
2612
}
2613
2613
2614
- tilingOptions.setInterchange (
2615
- extractFromIntegerArrayAttr<int64_t >(getInterchange ()));
2614
+ tilingOptions.setInterchange (getInterchange ());
2616
2615
FailureOr<scf::SCFTilingResult> maybeTilingResult =
2617
2616
tileUsingSCFForOp (rewriter, tilingInterface, tilingOptions);
2618
2617
if (failed (maybeTilingResult))
@@ -2649,6 +2648,33 @@ SmallVector<OpFoldResult> transform::TileUsingForOp::getMixedSizes() {
2649
2648
return results;
2650
2649
}
2651
2650
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
+
2652
2678
ParseResult transform::TileUsingForOp::parse (OpAsmParser &parser,
2653
2679
OperationState &result) {
2654
2680
OpAsmParser::UnresolvedOperand target;
@@ -2660,7 +2686,7 @@ ParseResult transform::TileUsingForOp::parse(OpAsmParser &parser,
2660
2686
2661
2687
if (parser.parseOperand (target) || parser.getCurrentLocation (&operandLoc) ||
2662
2688
parseDynamicIndexList (parser, dynamicSizes, staticSizes, scalableVals) ||
2663
- parser. parseOptionalAttrDict ( result. attributes ) ||
2689
+ parseOptionalInterchange (parser, result) ||
2664
2690
parser.parseColonType (functionalType))
2665
2691
return ParseResult::failure ();
2666
2692
@@ -2694,10 +2720,7 @@ void TileUsingForOp::print(OpAsmPrinter &p) {
2694
2720
printDynamicIndexList (p, getOperation (), getDynamicSizes (), getStaticSizes (),
2695
2721
/* valueTypes=*/ {}, getScalableSizesAttr (),
2696
2722
OpAsmParser::Delimiter::Square);
2697
- p.printOptionalAttrDict (
2698
- (*this )->getAttrs (),
2699
- /* elidedAttrs=*/ {getScalableSizesAttrName (getOperation ()->getName ()),
2700
- getStaticSizesAttrName (getOperation ()->getName ())});
2723
+ printOptionalInterchange (p, getInterchange ());
2701
2724
p << " : " ;
2702
2725
p.printFunctionalType (getOperands ().getTypes (), getResults ().getTypes ());
2703
2726
}
0 commit comments