@@ -1458,16 +1458,20 @@ static LogicalResult
1458
1458
vectorizeAsTensorPackOp (RewriterBase &rewriter, tensor::PackOp packOp,
1459
1459
ArrayRef<int64_t > inputVectorSizes,
1460
1460
SmallVectorImpl<Value> &newResults) {
1461
- auto padValue = packOp.getPaddingValue ();
1461
+ OpBuilder::InsertionGuard g (rewriter);
1462
+ rewriter.setInsertionPoint (packOp);
1463
+
1462
1464
Location loc = packOp.getLoc ();
1465
+ auto padValue = packOp.getPaddingValue ();
1466
+ if (!padValue) {
1467
+ padValue = rewriter.create <arith::ConstantOp>(
1468
+ loc, rewriter.getZeroAttr (packOp.getSourceType ().getElementType ()));
1469
+ }
1463
1470
int64_t inputRank = inputVectorSizes.size ();
1464
1471
int64_t outputRank = packOp.getDestRank ();
1465
1472
auto maskType = VectorType::get (inputVectorSizes, rewriter.getI1Type ());
1466
1473
auto vectorType = VectorType::get (inputVectorSizes, padValue.getType ());
1467
1474
1468
- OpBuilder::InsertionGuard g (rewriter);
1469
- rewriter.setInsertionPoint (packOp);
1470
-
1471
1475
ReifiedRankedShapedTypeDims reifiedReturnShapes;
1472
1476
LogicalResult status =
1473
1477
cast<ReifyRankedShapedTypeOpInterface>(packOp.getOperation ())
@@ -1502,14 +1506,6 @@ vectorizeAsTensorPackOp(RewriterBase &rewriter, tensor::PackOp packOp,
1502
1506
/* source=*/ emptyOp,
1503
1507
/* indices=*/ SmallVector<Value>(outputRank, zero),
1504
1508
/* inBounds=*/ SmallVector<bool >(outputRank, true ));
1505
- // bool needMaskForWrite = llvm::any_of(
1506
- // llvm::zip_equal(inputVectorSizes, packOp.getResultType().getShape()),
1507
- // [](auto it) { return std::get<0>(it) != std::get<1>(it); });
1508
- // if (needMaskForWrite) {
1509
- // Value maskForWrite = rewriter.create<vector::CreateMaskOp>(
1510
- // loc, maskType, reifiedReturnShapes[0]);
1511
- // write = mlir::vector::maskOperation(rewriter, write, maskForWrite);
1512
- // }
1513
1509
newResults.push_back (write->getResult (0 ));
1514
1510
return success ();
1515
1511
}
@@ -1710,7 +1706,7 @@ static LogicalResult
1710
1706
vectorizePackOpPrecondition (tensor::PackOp packOp,
1711
1707
ArrayRef<int64_t > inputVectorSizes) {
1712
1708
auto padValue = packOp.getPaddingValue ();
1713
- if (! padValue) {
1709
+ if (padValue && getConstantIntValue (padValue) != std::nullopt ) {
1714
1710
LDBG (" pad value is not constant: " << packOp << " \n " );
1715
1711
return failure ();
1716
1712
}
0 commit comments