>,
InterfaceMethod<
/*desc=*/[{
- Return the range of position in the result of the affine map
- computed by getLoopsToShapesMap() which correspond to the
- AffineExprs used to access the outputs of the operation.
- }],
- /*retTy=*/"std::pair<int64_t, int64_t>",
- /*methodName=*/"getResultsPositionInLoopsToShapeMap",
- /*args=*/(ins),
- /*methodBody=*/"",
- /*defaultImplementation=*/[{
- int64_t inputRankSum = 0;
- int64_t outputRankSum = 0;
- for(OpOperand *input : getInputOperands())
- inputRankSum += getRank(input);
- for(OpOperand *output : getOutputOperands())
- outputRankSum += getRank(output);
- return {inputRankSum, inputRankSum + outputRankSum};
- }]
- >,
- InterfaceMethod<
- /*desc=*/[{
Like `getShape`, but only returns statically-known information, without
generating any new IR. For each shape dimension, returns >=0 if that
dimension is statically known, or ShapeType::kDynamicSize otherwise.
llvm::SmallBitVector positions;
};
+static std::pair<int64_t, int64_t>
+getResultsPositionInLoopsToShapeMap(LinalgOp &op) {
+ int64_t inputRankSum = 0;
+ int64_t outputRankSum = 0;
+ for (OpOperand *input : op.getInputOperands())
+ inputRankSum += op.getRank(input);
+ for (OpOperand *output : op.getOutputOperands())
+ outputRankSum += op.getRank(output);
+ return {inputRankSum, inputRankSum + outputRankSum};
+}
+
LogicalResult
LinalgOp::reifyResultShapes(OpBuilder &b,
ReifiedRankedShapedTypeDims &reifiedReturnShapes) {
// Find the position in the above map that represents the shape of the
// result:dim being inferred.
- auto resultShapesSubMapPos = getResultsPositionInLoopsToShapeMap();
+ auto resultShapesSubMapPos = getResultsPositionInLoopsToShapeMap(*this);
/// From loopsToShapesMap extract the submap that represents the shape of the
/// (resultIdx, dim) needed.