diff --git a/mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h b/mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h index 6245f88db3d19..f3b34f9fded7f 100644 --- a/mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h +++ b/mlir/include/mlir/Dialect/Bufferization/IR/BufferizableOpInterface.h @@ -651,7 +651,8 @@ void replaceOpWithBufferizedValues(RewriterBase &rewriter, Operation *op, template OpTy replaceOpWithNewBufferizedOp(RewriterBase &rewriter, Operation *op, Args &&...args) { - auto newOp = rewriter.create(op->getLoc(), std::forward(args)...); + auto newOp = + OpTy::create(rewriter, op->getLoc(), std::forward(args)...); replaceOpWithBufferizedValues(rewriter, op, newOp->getResults()); return newOp; } diff --git a/mlir/include/mlir/Dialect/Bufferization/Transforms/Passes.h b/mlir/include/mlir/Dialect/Bufferization/Transforms/Passes.h index 596c470ef6d23..a2409f2796b94 100644 --- a/mlir/include/mlir/Dialect/Bufferization/Transforms/Passes.h +++ b/mlir/include/mlir/Dialect/Bufferization/Transforms/Passes.h @@ -148,14 +148,14 @@ struct BufferResultsToOutParamsOpts { /// Default memref.alloc is used AllocationFn allocationFn = [](OpBuilder &builder, Location loc, MemRefType type) { - return builder.create(loc, type).getResult(); + return memref::AllocOp::create(builder, loc, type).getResult(); }; /// Memcpy function; used to create a copy between two memrefs. /// Default memref.copy is used. MemCpyFn memCpyFn = [](OpBuilder &builder, Location loc, Value from, Value to) { - builder.create(loc, from, to); + memref::CopyOp::create(builder, loc, from, to); return success(); }; diff --git a/mlir/include/mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.td b/mlir/include/mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.td index df5a2448bd779..e98b94b5b3052 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.td +++ b/mlir/include/mlir/Dialect/LLVMIR/BasicPtxBuilderInterface.td @@ -114,7 +114,7 @@ def BasicPtxBuilderOpInterface : OpInterface<"BasicPtxBuilderInterface"> { /*methodBody=*/"", /*defaultImpl=*/ [{ mlir::Operation* op = $_op; - return rewriter.create( + return LLVM::ConstantOp::create(rewriter, op->getLoc(), rewriter.getIntegerType(32), val); }] >, diff --git a/mlir/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.td b/mlir/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.td index 7bbc56f549c0b..ca0cc03acd7ad 100644 --- a/mlir/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.td +++ b/mlir/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.td @@ -454,7 +454,7 @@ def TransposeOp : LinalgStructuredBase_Op<"transpose", [ static void regionBuilder(mlir::ImplicitLocOpBuilder &b, mlir::Block &block, mlir::ArrayRef, function_ref emitError) { OpBuilder::InsertionGuard guard(b); - b.create(b.getLoc(), block.getArgument(0)); + linalg::YieldOp::create(b, b.getLoc(), block.getArgument(0)); } static std::function, function_ref emitError) { OpBuilder::InsertionGuard guard(b); - b.create(b.getLoc(), block.getArgument(0)); + linalg::YieldOp::create(b, b.getLoc(), block.getArgument(0)); } static std::function` - /// and `OpBuilder::create` whenever the `OpTy::build` is overloaded + /// and `OpTy::create` whenever the `OpTy::build` is overloaded /// thus. This happens because the `TypeRange(T&&)` ctor is implicit /// as well, and there's no SFINAE we can add to this method that would /// block subsequent application of that ctor. The only way to fix the diff --git a/mlir/include/mlir/Dialect/Tosa/Utils/ConversionUtils.h b/mlir/include/mlir/Dialect/Tosa/Utils/ConversionUtils.h index 6f3b0916a7a60..cdcd099ec7d22 100644 --- a/mlir/include/mlir/Dialect/Tosa/Utils/ConversionUtils.h +++ b/mlir/include/mlir/Dialect/Tosa/Utils/ConversionUtils.h @@ -70,7 +70,7 @@ checkHasDynamicBatchDims(PatternRewriter &rewriter, Op op, } dynamicDims.push_back( - rewriter.create(op->getLoc(), params[0], 0)); + tensor::DimOp::create(rewriter, op->getLoc(), params[0], 0)); return dynamicDims; } @@ -91,7 +91,7 @@ namespace { template TosaOp createOpAndInferShape(ImplicitLocOpBuilder &builder, Type resultTy, Args &&...args) { - auto op = builder.create(resultTy, args...); + auto op = TosaOp::create(builder, resultTy, args...); InferShapedTypeOpInterface shapeInterface = dyn_cast(op.getOperation()); diff --git a/mlir/include/mlir/Dialect/Tosa/Utils/QuantUtils.h b/mlir/include/mlir/Dialect/Tosa/Utils/QuantUtils.h index bdd8713037eea..9d9a934cdfd5e 100644 --- a/mlir/include/mlir/Dialect/Tosa/Utils/QuantUtils.h +++ b/mlir/include/mlir/Dialect/Tosa/Utils/QuantUtils.h @@ -47,7 +47,7 @@ Value getConstTensorInt(OpBuilder &builder, Location loc, mlir::RankedTensorType const_type = RankedTensorType::get({count}, element_type); mlir::DenseElementsAttr const_attr = DenseElementsAttr::get(const_type, vec); - auto const_op = builder.create(loc, const_type, const_attr); + auto const_op = tosa::ConstOp::create(builder, loc, const_type, const_attr); return const_op.getResult(); } diff --git a/mlir/include/mlir/Dialect/Utils/ReshapeOpsUtils.h b/mlir/include/mlir/Dialect/Utils/ReshapeOpsUtils.h index 704e39e908841..6d4ea5b5136de 100644 --- a/mlir/include/mlir/Dialect/Utils/ReshapeOpsUtils.h +++ b/mlir/include/mlir/Dialect/Utils/ReshapeOpsUtils.h @@ -332,11 +332,11 @@ struct ComposeCollapseOfExpandOp : public OpRewritePattern { // the first dynamic size. Value result = dynamicSizes[0]; for (Value v : llvm::drop_begin(dynamicSizes)) - result = rewriter.create(loc, result, v); + result = arith::MulIOp::create(rewriter, loc, result, v); if (numStaticElems != 1) { - result = rewriter.create( - loc, result, - rewriter.create(loc, numStaticElems)); + result = arith::MulIOp::create( + rewriter, loc, result, + arith::ConstantIndexOp::create(rewriter, loc, numStaticElems)); } newOutputShape.push_back(result); } diff --git a/mlir/include/mlir/Dialect/Vector/Utils/VectorUtils.h b/mlir/include/mlir/Dialect/Vector/Utils/VectorUtils.h index cc8421b23a074..d68138acec0db 100644 --- a/mlir/include/mlir/Dialect/Vector/Utils/VectorUtils.h +++ b/mlir/include/mlir/Dialect/Vector/Utils/VectorUtils.h @@ -118,9 +118,10 @@ inline auto makeVscaleConstantBuilder(PatternRewriter &rewriter, Location loc) { Value vscale = nullptr; return [loc, vscale, &rewriter](int64_t multiplier) mutable { if (!vscale) - vscale = rewriter.create(loc); - return rewriter.create( - loc, vscale, rewriter.create(loc, multiplier)); + vscale = vector::VectorScaleOp::create(rewriter, loc); + return arith::MulIOp::create( + rewriter, loc, vscale, + arith::ConstantIndexOp::create(rewriter, loc, multiplier)); }; } diff --git a/mlir/include/mlir/IR/Builders.h b/mlir/include/mlir/IR/Builders.h index 5a2520b48a7b3..2e356dec1981f 100644 --- a/mlir/include/mlir/IR/Builders.h +++ b/mlir/include/mlir/IR/Builders.h @@ -552,7 +552,7 @@ class OpBuilder : public Builder { template std::enable_if_t(), OpTy> createOrFold(Location location, Args &&...args) { - auto op = create(location, std::forward(args)...); + auto op = OpTy::create(*this, location, std::forward(args)...); SmallVector unused; (void)tryFold(op.getOperation(), unused); @@ -662,7 +662,7 @@ class ImplicitLocOpBuilder : public mlir::OpBuilder { /// location. template OpTy create(Args &&...args) { - return OpBuilder::create(curLoc, std::forward(args)...); + return OpTy::create(*this, curLoc, std::forward(args)...); } /// Create an operation of specific op type at the current insertion point, diff --git a/mlir/include/mlir/IR/PatternMatch.h b/mlir/include/mlir/IR/PatternMatch.h index 3a2dbd136b438..b3608b4394f45 100644 --- a/mlir/include/mlir/IR/PatternMatch.h +++ b/mlir/include/mlir/IR/PatternMatch.h @@ -517,7 +517,9 @@ class RewriterBase : public OpBuilder { /// ops must match. The original op is erased. template OpTy replaceOpWithNewOp(Operation *op, Args &&...args) { - auto newOp = create(op->getLoc(), std::forward(args)...); + auto builder = static_cast(this); + auto newOp = + OpTy::create(*builder, op->getLoc(), std::forward(args)...); replaceOp(op, newOp.getOperation()); return newOp; } diff --git a/mlir/include/mlir/Interfaces/ViewLikeInterface.h b/mlir/include/mlir/Interfaces/ViewLikeInterface.h index 14427a97a5502..db9c37fc3dc99 100644 --- a/mlir/include/mlir/Interfaces/ViewLikeInterface.h +++ b/mlir/include/mlir/Interfaces/ViewLikeInterface.h @@ -109,8 +109,8 @@ class OpWithOffsetSizesAndStridesConstantArgumentFolder final // Create the new op in canonical form. auto newOp = - rewriter.create(op.getLoc(), resultType, op.getSource(), - mixedOffsets, mixedSizes, mixedStrides); + OpType::create(rewriter, op.getLoc(), resultType, op.getSource(), + mixedOffsets, mixedSizes, mixedStrides); CastOpFunc()(rewriter, op, newOp); return success(); diff --git a/mlir/include/mlir/Parser/Parser.h b/mlir/include/mlir/Parser/Parser.h index 828760fcbefa9..8a8cfb9090143 100644 --- a/mlir/include/mlir/Parser/Parser.h +++ b/mlir/include/mlir/Parser/Parser.h @@ -64,7 +64,7 @@ inline OwningOpRef constructContainerOpForParserIfNecessary( "block that has an implicit terminator or does not require one"); OpBuilder builder(context); - ContainerOpT op = builder.create(sourceFileLoc); + ContainerOpT op = ContainerOpT::create(builder, sourceFileLoc); OwningOpRef opRef(op); assert(op->getNumRegions() == 1 && llvm::hasSingleElement(op->getRegion(0)) && diff --git a/mlir/lib/Target/IRDLToCpp/IRDLToCpp.cpp b/mlir/lib/Target/IRDLToCpp/IRDLToCpp.cpp index 538ea4f450b29..d6b8a8a1df426 100644 --- a/mlir/lib/Target/IRDLToCpp/IRDLToCpp.cpp +++ b/mlir/lib/Target/IRDLToCpp/IRDLToCpp.cpp @@ -226,6 +226,15 @@ static void generateOpBuilderDeclarations(irdl::detail::dictionary &dict, stream << llvm::formatv( R"(static void build(::mlir::OpBuilder &opBuilder, ::mlir::OperationState &opState, {0} {1} ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {{});)", resultParams, operandParams); + stream << "\n"; + stream << llvm::formatv( + R"(static {0} create(::mlir::OpBuilder &opBuilder, ::mlir::Location location, {1} {2} ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {{});)", + opStrings.opCppName, resultParams, operandParams); + stream << "\n"; + stream << llvm::formatv( + R"(static {0} create(::mlir::ImplicitLocOpBuilder &opBuilder, {1} {2} ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {{});)", + opStrings.opCppName, resultParams, operandParams); + stream << "\n"; dict["OP_BUILD_DECLS"] = buildDecls; } @@ -339,9 +348,25 @@ void {0}::build(::mlir::OpBuilder &opBuilder, ::mlir::OperationState &opState, { {3} {4} } + +{0} {0}::create(::mlir::OpBuilder &opBuilder, ::mlir::Location location, {1} {2} ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {{ + ::mlir::OperationState __state__(location, getOperationName()); + build(opBuilder, __state__, {5} {6} attributes); + auto __res__ = ::llvm::dyn_cast<{0}>(opBuilder.create(__state__)); + assert(__res__ && "builder didn't return the right type"); + return __res__; +} + +{0} {0}::create(::mlir::ImplicitLocOpBuilder &opBuilder, {1} {2} ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) {{ + return create(opBuilder, opBuilder.getLoc(), {5} {6} attributes); +} )", opStrings.opCppName, std::move(resultTypes), std::move(operandTypes), - std::move(operandAdder), std::move(resultAdder)); + std::move(operandAdder), std::move(resultAdder), + llvm::join(opStrings.opResultNames, ",") + + (!opStrings.opResultNames.empty() ? "," : ""), + llvm::join(opStrings.opOperandNames, ",") + + (!opStrings.opOperandNames.empty() ? "," : "")); dict["OP_BUILD_DEFS"] = buildDefinition; diff --git a/mlir/lib/Target/IRDLToCpp/Templates/PerOperationDecl.txt b/mlir/lib/Target/IRDLToCpp/Templates/PerOperationDecl.txt index 9e787b8056a89..e9068e9488f99 100644 --- a/mlir/lib/Target/IRDLToCpp/Templates/PerOperationDecl.txt +++ b/mlir/lib/Target/IRDLToCpp/Templates/PerOperationDecl.txt @@ -175,6 +175,17 @@ public: ::mlir::TypeRange resultTypes, ::mlir::ValueRange operands, ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + + static __OP_CPP_NAME__ create(::mlir::OpBuilder &odsBuilder, + ::mlir::Location location, + ::mlir::TypeRange resultTypes, + ::mlir::ValueRange operands, + ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); + + static __OP_CPP_NAME__ create(::mlir::ImplicitLocOpBuilder &odsBuilder, + ::mlir::TypeRange resultTypes, + ::mlir::ValueRange operands, + ::llvm::ArrayRef<::mlir::NamedAttribute> attributes = {}); }; diff --git a/mlir/lib/Target/IRDLToCpp/Templates/PerOperationDef.txt b/mlir/lib/Target/IRDLToCpp/Templates/PerOperationDef.txt index 88f19d0f22ca4..30ca420d77448 100644 --- a/mlir/lib/Target/IRDLToCpp/Templates/PerOperationDef.txt +++ b/mlir/lib/Target/IRDLToCpp/Templates/PerOperationDef.txt @@ -21,6 +21,29 @@ void __OP_CPP_NAME__::build(::mlir::OpBuilder &odsBuilder, odsState.addTypes(resultTypes); } +__OP_CPP_NAME__ +__OP_CPP_NAME__::create(::mlir::OpBuilder &odsBuilder, + ::mlir::Location location, + ::mlir::TypeRange resultTypes, + ::mlir::ValueRange operands, + ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) +{ + ::mlir::OperationState state(location, getOperationName()); + build(odsBuilder, state, resultTypes, operands, attributes); + auto res = ::llvm::dyn_cast<__OP_CPP_NAME__>(odsBuilder.create(state)); + assert(res && "builder didn't return the right type"); + return res; +} + +__OP_CPP_NAME__ +__OP_CPP_NAME__::create(::mlir::ImplicitLocOpBuilder &odsBuilder, + ::mlir::TypeRange resultTypes, + ::mlir::ValueRange operands, + ::llvm::ArrayRef<::mlir::NamedAttribute> attributes) +{ + return create(odsBuilder, odsBuilder.getLoc(), resultTypes, operands, attributes); +} + __NAMESPACE_CLOSE__