[Mlir-commits] [mlir] [mlir][affine] Add static basis support to affine.delinearize (PR #113846)
Krzysztof Drewniak
llvmlistbot at llvm.org
Tue Oct 29 09:20:32 PDT 2024
================
@@ -4508,32 +4509,50 @@ LogicalResult AffineDelinearizeIndexOp::inferReturnTypes(
RegionRange regions, SmallVectorImpl<Type> &inferredReturnTypes) {
AffineDelinearizeIndexOpAdaptor adaptor(operands, attributes, properties,
regions);
- inferredReturnTypes.assign(adaptor.getBasis().size(),
+ inferredReturnTypes.assign(adaptor.getStaticBasis().size(),
IndexType::get(context));
return success();
}
-void AffineDelinearizeIndexOp::build(OpBuilder &builder, OperationState &result,
+void AffineDelinearizeIndexOp::build(OpBuilder &odsBuilder,
+ OperationState &odsState,
+ Value linearIndex, ValueRange basis) {
+ SmallVector<Value> dynamicBasis;
+ SmallVector<int64_t> staticBasis;
+ dispatchIndexOpFoldResults(getAsOpFoldResult(basis), dynamicBasis,
+ staticBasis);
+ build(odsBuilder, odsState, linearIndex, dynamicBasis, staticBasis);
+}
+
+void AffineDelinearizeIndexOp::build(OpBuilder &odsBuilder,
+ OperationState &odsState,
Value linearIndex,
ArrayRef<OpFoldResult> basis) {
- result.addTypes(SmallVector<Type>(basis.size(), builder.getIndexType()));
- result.addOperands(linearIndex);
- SmallVector<Value> basisValues =
- llvm::map_to_vector(basis, [&](OpFoldResult ofr) -> Value {
- std::optional<int64_t> staticDim = getConstantIntValue(ofr);
- if (staticDim.has_value())
- return builder.create<arith::ConstantIndexOp>(result.location,
- *staticDim);
- return llvm::dyn_cast_if_present<Value>(ofr);
- });
- result.addOperands(basisValues);
+ SmallVector<Value> dynamicBasis;
+ SmallVector<int64_t> staticBasis;
+ dispatchIndexOpFoldResults(basis, dynamicBasis, staticBasis);
+ build(odsBuilder, odsState, linearIndex, dynamicBasis, staticBasis);
+}
+
+void AffineDelinearizeIndexOp::build(OpBuilder &odsBuilder,
+ OperationState &odsState,
+ Value linearIndex,
+ ArrayRef<int64_t> basis) {
+ build(odsBuilder, odsState, linearIndex, ValueRange{}, basis);
}
LogicalResult AffineDelinearizeIndexOp::verify() {
- if (getBasis().empty())
+ if (getStaticBasis().empty())
return emitOpError("basis should not be empty");
- if (getNumResults() != getBasis().size())
+ if (getNumResults() != getStaticBasis().size())
return emitOpError("should return an index for each basis element");
+ auto dynamicMarkersCount =
+ llvm::count_if(getStaticBasis(), ShapedType::isDynamic);
+ if (static_cast<size_t>(dynamicMarkersCount) != getDynamicBasis().size())
+ return emitOpError(
+ "mismatch between dynamic and static basis (kDynamic marker but no "
+ "corresponding dynamic basis entry) -- this can only happen due to an "
+ "incorrect fold/rewrite");
----------------
krzysz00 wrote:
The builder construction is along the lines of `b.create<affine::DelinearizeIndexOp>(loc, index, {v1, v2}, {2, 5, 7})`, which has too many dynamic basis entries, or alternatively `(index, {}, {2, kDynamic, 7})` which has too few
https://github.com/llvm/llvm-project/pull/113846
More information about the Mlir-commits
mailing list