27 auto producerOp = dyn_cast<TilingInterface>(producer.
getOwner());
32 if (!llvm::all_of(sliceOp.getMixedStrides(),
isOneInteger))
35 FailureOr<TilingResult> tiledResult = producerOp.generateResultTileValue(
37 sliceOp.getMixedSizes());
38 if (failed(tiledResult))
43 llvm::SmallBitVector droppedDims = sliceOp.getDroppedDims();
44 if (droppedDims.any()) {
45 assert(tiledResult->tiledValues.size() == 1 &&
46 "expected only a single tiled result value to replace the extract "
52 auto newSliceOp = tensor::ExtractSliceOp::create(
53 builder, sliceOp.getLoc(), sliceOp.
getType(),
54 tiledResult->tiledValues[0], offsets, sliceOp.getMixedSizes(), strides);
55 tiledResult->tiledValues[0] = newSliceOp;
56 tiledResult->generatedSlices.push_back(newSliceOp);
65 if (sliceOps.empty()) {
67 { llvm::dbgs() <<
"expected candidate slices list to be non-empty"; });
70 if (sliceOps.size() != consumerOperands.size()) {
73 <<
"expected as many operands as the number of slices passed";
78 dyn_cast<TilingInterface>(consumerOperands.front()->getOwner());
81 for (
auto *opOperand : consumerOperands.drop_front()) {
82 if (opOperand->getOwner() != consumerOp) {
85 <<
"expected all consumer operands to be from the same operation";
91 auto consumerOperandNums = llvm::map_to_vector(
92 consumerOperands, [](
OpOperand *opOperand) ->
unsigned {
97 for (
auto sliceOp : sliceOps) {
100 if (!llvm::all_of(sliceOp.getMixedStrides(),
isOneInteger))
105 allOffsets.emplace_back(std::move(offsets));
106 allSizes.emplace_back(std::move(sizes));
108 FailureOr<TilingResult> tiledResult =
109 consumerOp.getTiledImplementationFromOperandTiles(
110 builder, consumerOperandNums, allOffsets, allSizes);
111 if (failed(tiledResult))
FailureOr< TilingResult > replaceInsertSlicesWithTiledConsumer(OpBuilder &builder, ArrayRef< tensor::InsertSliceOp > sliceOps, ArrayRef< OpOperand * > consumerOperands)
Method to swap tensor.insert_slices with their consumers when the consumer implements the TilingInter...