diff --git a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp --- a/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp +++ b/flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp @@ -67,12 +67,9 @@ matchAndRewrite(mlir::FuncOp op, mlir::PatternRewriter &rewriter) const override { rewriter.startRootUpdate(op); - auto result = fir::NameUniquer::deconstruct(op.sym_name()); - if (fir::NameUniquer::isExternalFacingUniquedName(result)) { - auto newName = mangleExternalName(result); - op.sym_nameAttr(rewriter.getStringAttr(newName)); - SymbolTable::setSymbolName(op, newName); - } + auto result = fir::NameUniquer::deconstruct(op.getSymName()); + if (fir::NameUniquer::isExternalFacingUniquedName(result)) + op.setSymNameAttr(rewriter.getStringAttr(mangleExternalName(result))); rewriter.finalizeRootUpdate(op); return success(); } @@ -165,7 +162,7 @@ }); target.addDynamicallyLegalOp([](mlir::FuncOp op) { - return !fir::NameUniquer::needExternalNameMangling(op.sym_name()); + return !fir::NameUniquer::needExternalNameMangling(op.getSymName()); }); target.addDynamicallyLegalOp([](fir::GlobalOp op) { diff --git a/mlir/include/mlir/IR/BuiltinDialect.td b/mlir/include/mlir/IR/BuiltinDialect.td --- a/mlir/include/mlir/IR/BuiltinDialect.td +++ b/mlir/include/mlir/IR/BuiltinDialect.td @@ -34,6 +34,7 @@ public: }]; + let emitAccessorPrefix = kEmitAccessorPrefix_Both; } #endif // BUILTIN_BASE diff --git a/mlir/include/mlir/IR/BuiltinOps.td b/mlir/include/mlir/IR/BuiltinOps.td --- a/mlir/include/mlir/IR/BuiltinOps.td +++ b/mlir/include/mlir/IR/BuiltinOps.td @@ -76,7 +76,7 @@ }]; let arguments = (ins SymbolNameAttr:$sym_name, - TypeAttr:$type, + TypeAttrOf:$type, OptionalAttr:$sym_visibility); let regions = (region AnyRegion:$body); @@ -110,12 +110,6 @@ /// compatible. void cloneInto(FuncOp dest, BlockAndValueMapping &mapper); - /// Returns the type of this function. - /// FIXME: We should drive this via the ODS `type` param. - FunctionType getType() { - return getTypeAttr().getValue().cast(); - } - //===------------------------------------------------------------------===// // CallableOpInterface //===------------------------------------------------------------------===// @@ -144,7 +138,7 @@ LogicalResult verifyType() { auto type = getTypeAttr().getValue(); if (!type.isa()) - return emitOpError("requires '" + getTypeAttrName() + + return emitOpError("requires '" + FunctionOpInterface::getTypeAttrName() + "' attribute of function type"); return success(); } @@ -188,16 +182,16 @@ let arguments = (ins OptionalAttr:$sym_name, OptionalAttr:$sym_visibility); - let regions = (region SizedRegion<1>:$body); + let regions = (region SizedRegion<1>:$bodyRegion); - let assemblyFormat = "($sym_name^)? attr-dict-with-keyword $body"; + let assemblyFormat = "($sym_name^)? attr-dict-with-keyword $bodyRegion"; let builders = [OpBuilder<(ins CArg<"Optional", "{}">:$name)>]; let extraClassDeclaration = [{ /// Construct a module from the given location with an optional name. static ModuleOp create(Location loc, Optional name = llvm::None); /// Return the name of this module if present. - Optional getName() { return sym_name(); } + Optional getName() { return getSymName(); } //===------------------------------------------------------------------===// // SymbolOpInterface Methods diff --git a/mlir/include/mlir/IR/FunctionInterfaces.h b/mlir/include/mlir/IR/FunctionInterfaces.h --- a/mlir/include/mlir/IR/FunctionInterfaces.h +++ b/mlir/include/mlir/IR/FunctionInterfaces.h @@ -208,7 +208,7 @@ LogicalResult verifyTrait(ConcreteOp op) { if (!op.getTypeAttr()) return op.emitOpError("requires a type attribute '") - << ConcreteOp::getTypeAttrName() << '\''; + << function_interface_impl::getTypeAttrName() << '\''; if (failed(op.verifyType())) return failure(); diff --git a/mlir/include/mlir/IR/OpBase.td b/mlir/include/mlir/IR/OpBase.td --- a/mlir/include/mlir/IR/OpBase.td +++ b/mlir/include/mlir/IR/OpBase.td @@ -1268,6 +1268,11 @@ let constBuilderCall = "::mlir::TypeAttr::get($0)"; } +class TypeAttrOf + : TypeAttrBase { + let constBuilderCall = "::mlir::TypeAttr::get($0)"; +} + // The mere presence of unit attributes has a meaning. Therefore, unit // attributes are always treated as optional and accessors to them return // "true" if the attribute is present and "false" otherwise. diff --git a/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp b/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp --- a/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp +++ b/mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp @@ -492,18 +492,18 @@ matchAndRewrite(UnrealizedConversionCastOp op, OpAdaptor adaptor, ConversionPatternRewriter &rewriter) const override { SmallVector convertedTypes; - if (succeeded(typeConverter->convertTypes(op.outputs().getTypes(), + if (succeeded(typeConverter->convertTypes(op.getOutputs().getTypes(), convertedTypes)) && - convertedTypes == adaptor.inputs().getTypes()) { - rewriter.replaceOp(op, adaptor.inputs()); + convertedTypes == adaptor.getInputs().getTypes()) { + rewriter.replaceOp(op, adaptor.getInputs()); return success(); } convertedTypes.clear(); - if (succeeded(typeConverter->convertTypes(adaptor.inputs().getTypes(), + if (succeeded(typeConverter->convertTypes(adaptor.getInputs().getTypes(), convertedTypes)) && - convertedTypes == op.outputs().getType()) { - rewriter.replaceOp(op, adaptor.inputs()); + convertedTypes == op.getOutputs().getType()) { + rewriter.replaceOp(op, adaptor.getInputs()); return success(); } return failure(); diff --git a/mlir/lib/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.cpp b/mlir/lib/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.cpp --- a/mlir/lib/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.cpp +++ b/mlir/lib/Conversion/ReconcileUnrealizedCasts/ReconcileUnrealizedCasts.cpp @@ -37,15 +37,15 @@ auto users = op->getUsers(); if (!llvm::all_of(users, [&](Operation *user) { if (auto other = dyn_cast(user)) - return other.getResultTypes() == op.inputs().getTypes() && - other.inputs() == op.outputs(); + return other.getResultTypes() == op.getInputs().getTypes() && + other.getInputs() == op.getOutputs(); return false; })) { return rewriter.notifyMatchFailure(op, "live unrealized conversion cast"); } for (Operation *user : users) - rewriter.replaceOp(user, op.inputs()); + rewriter.replaceOp(user, op.getInputs()); rewriter.eraseOp(op); return success(); diff --git a/mlir/lib/Dialect/Async/Transforms/AsyncParallelFor.cpp b/mlir/lib/Dialect/Async/Transforms/AsyncParallelFor.cpp --- a/mlir/lib/Dialect/Async/Transforms/AsyncParallelFor.cpp +++ b/mlir/lib/Dialect/Async/Transforms/AsyncParallelFor.cpp @@ -463,8 +463,7 @@ ModuleOp module = computeFunc.func->getParentOfType(); - ArrayRef computeFuncInputTypes = - computeFunc.func.type().cast().getInputs(); + ArrayRef computeFuncInputTypes = computeFunc.func.getType().getInputs(); // Compared to the parallel compute function async dispatch function takes // additional !async.group argument. Also instead of a single `blockIndex` it @@ -541,7 +540,7 @@ operands[1] = midIndex; operands[2] = end; - executeBuilder.create(executeLoc, func.sym_name(), + executeBuilder.create(executeLoc, func.getSymName(), func.getCallableResults(), operands); executeBuilder.create(executeLoc, ValueRange()); }; @@ -562,7 +561,7 @@ SmallVector computeFuncOperands = {blockStart}; computeFuncOperands.append(forwardedInputs.begin(), forwardedInputs.end()); - b.create(computeFunc.func.sym_name(), + b.create(computeFunc.func.getSymName(), computeFunc.func.getCallableResults(), computeFuncOperands); b.create(ValueRange()); @@ -609,7 +608,7 @@ SmallVector operands = {c0, blockSize}; appendBlockComputeOperands(operands); - b.create(parallelComputeFunction.func.sym_name(), + b.create(parallelComputeFunction.func.getSymName(), parallelComputeFunction.func.getCallableResults(), operands); b.create(); @@ -628,7 +627,7 @@ SmallVector operands = {group, c0, blockCount, blockSize}; appendBlockComputeOperands(operands); - b.create(asyncDispatchFunction.sym_name(), + b.create(asyncDispatchFunction.getSymName(), asyncDispatchFunction.getCallableResults(), operands); @@ -687,7 +686,7 @@ // Call parallel compute function inside the async.execute region. auto executeBodyBuilder = [&](OpBuilder &executeBuilder, Location executeLoc, ValueRange executeArgs) { - executeBuilder.create(executeLoc, compute.sym_name(), + executeBuilder.create(executeLoc, compute.getSymName(), compute.getCallableResults(), computeFuncOperands(iv)); executeBuilder.create(executeLoc, ValueRange()); @@ -704,7 +703,7 @@ b.create(c1, blockCount, c1, ValueRange(), loopBuilder); // Call parallel compute function for the first block in the caller thread. - b.create(compute.sym_name(), compute.getCallableResults(), + b.create(compute.getSymName(), compute.getCallableResults(), computeFuncOperands(c0)); // Wait for the completion of all async compute operations. diff --git a/mlir/lib/Dialect/Async/Transforms/AsyncToAsyncRuntime.cpp b/mlir/lib/Dialect/Async/Transforms/AsyncToAsyncRuntime.cpp --- a/mlir/lib/Dialect/Async/Transforms/AsyncToAsyncRuntime.cpp +++ b/mlir/lib/Dialect/Async/Transforms/AsyncToAsyncRuntime.cpp @@ -180,7 +180,7 @@ // `async.await` op lowering will create resume blocks for async // continuations, and will conditionally branch to cleanup or suspend blocks. - for (Block &block : func.body().getBlocks()) { + for (Block &block : func.getBody().getBlocks()) { if (&block == entryBlock || &block == cleanupBlock || &block == suspendBlock) continue; @@ -677,7 +677,7 @@ // this dict between the passes is ugly. if (isAllowedToBlock(func) || outlinedFunctions.find(func) == outlinedFunctions.end()) { - for (Operation &op : func.body().getOps()) { + for (Operation &op : func.getBody().getOps()) { if (dyn_cast(op) || dyn_cast(op)) { funcWorklist.push_back(func); break; diff --git a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp --- a/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp +++ b/mlir/lib/Dialect/Linalg/ComprehensiveBufferize/ModuleBufferization.cpp @@ -149,7 +149,7 @@ /// Return nullptr if there is no such unique ReturnOp. static func::ReturnOp getAssumedUniqueReturnOp(FuncOp funcOp) { func::ReturnOp returnOp; - for (Block &b : funcOp.body()) { + for (Block &b : funcOp.getBody()) { if (auto candidateOp = dyn_cast(b.getTerminator())) { if (returnOp) return nullptr; @@ -460,7 +460,7 @@ // 3. Rewrite the bbArgs. // Iterate on the original `numArgs` and replace them in order. // This guarantees the argument order still matches after the rewrite. - Block &frontBlock = funcOp.body().front(); + Block &frontBlock = funcOp.getBody().front(); unsigned numArgs = frontBlock.getNumArguments(); for (unsigned idx = 0; idx < numArgs; ++idx) { auto bbArg = frontBlock.getArgument(0); @@ -527,7 +527,7 @@ // For each FuncOp, the number of CallOpInterface it contains. DenseMap numberCallOpsContainedInFuncOp; WalkResult res = moduleOp.walk([&](FuncOp funcOp) -> WalkResult { - if (!funcOp.body().empty()) { + if (!funcOp.getBody().empty()) { func::ReturnOp returnOp = getAssumedUniqueReturnOp(funcOp); if (!returnOp) return funcOp->emitError() @@ -624,7 +624,7 @@ argumentTypes.push_back(desiredMemrefType); // If funcOp's body is not empty, change the bbArg type and propagate. - if (!funcOp.body().empty()) { + if (!funcOp.getBody().empty()) { BlockArgument bbArg = funcOp.getArgument(argNumber); bbArg.setType(desiredMemrefType); OpBuilder b(bbArg.getContext()); @@ -886,7 +886,7 @@ // 4. Create the new CallOp. Operation *newCallOp = rewriter.create( - callOp.getLoc(), funcOp.sym_name(), resultTypes, newOperands); + callOp.getLoc(), funcOp.getSymName(), resultTypes, newOperands); newCallOp->setAttrs(callOp->getAttrs()); // Get replacement values for non-tensor / non-equivalent results. for (unsigned i = 0; i < replacementValues.size(); ++i) { @@ -1009,7 +1009,7 @@ // Analyze ops. for (FuncOp funcOp : moduleState.orderedFuncOps) { // No body => no analysis. - if (funcOp.body().empty()) + if (funcOp.getBody().empty()) continue; // Now analyzing function. @@ -1037,7 +1037,7 @@ // Bufferize function bodies. for (FuncOp funcOp : moduleState.orderedFuncOps) { // No body => no analysis. - if (funcOp.body().empty()) + if (funcOp.getBody().empty()) continue; if (failed(bufferizeOp(funcOp, state))) diff --git a/mlir/lib/Dialect/Tosa/Transforms/TosaInferShapes.cpp b/mlir/lib/Dialect/Tosa/Transforms/TosaInferShapes.cpp --- a/mlir/lib/Dialect/Tosa/Transforms/TosaInferShapes.cpp +++ b/mlir/lib/Dialect/Tosa/Transforms/TosaInferShapes.cpp @@ -283,7 +283,7 @@ IRRewriter rewriter(func.getContext()); - propagateShapesInRegion(func.body()); + propagateShapesInRegion(func.getBody()); // Insert UnrealizedConversionCasts to guarantee ReturnOp agress with // the FuncOp type. diff --git a/mlir/lib/IR/BuiltinDialect.cpp b/mlir/lib/IR/BuiltinDialect.cpp --- a/mlir/lib/IR/BuiltinDialect.cpp +++ b/mlir/lib/IR/BuiltinDialect.cpp @@ -101,7 +101,8 @@ ArrayRef argAttrs) { state.addAttribute(SymbolTable::getSymbolAttrName(), builder.getStringAttr(name)); - state.addAttribute(getTypeAttrName(), TypeAttr::get(type)); + state.addAttribute(function_interface_impl::getTypeAttrName(), + TypeAttr::get(type)); state.attributes.append(attrs.begin(), attrs.end()); state.addRegion(); @@ -287,8 +288,8 @@ LogicalResult UnrealizedConversionCastOp::fold(ArrayRef attrOperands, SmallVectorImpl &foldResults) { - OperandRange operands = inputs(); - ResultRange results = outputs(); + OperandRange operands = getInputs(); + ResultRange results = getOutputs(); if (operands.getType() == results.getType()) { foldResults.append(operands.begin(), operands.end()); diff --git a/mlir/test/lib/IR/TestPrintInvalid.cpp b/mlir/test/lib/IR/TestPrintInvalid.cpp --- a/mlir/test/lib/IR/TestPrintInvalid.cpp +++ b/mlir/test/lib/IR/TestPrintInvalid.cpp @@ -30,7 +30,7 @@ void runOnOperation() override { Location loc = getOperation().getLoc(); - OpBuilder builder(getOperation().body()); + OpBuilder builder(getOperation().getBodyRegion()); auto funcOp = builder.create( loc, "test", FunctionType::get(getOperation().getContext(), {}, {})); funcOp.addEntryBlock(); diff --git a/mlir/unittests/Interfaces/InferTypeOpInterfaceTest.cpp b/mlir/unittests/Interfaces/InferTypeOpInterfaceTest.cpp --- a/mlir/unittests/Interfaces/InferTypeOpInterfaceTest.cpp +++ b/mlir/unittests/Interfaces/InferTypeOpInterfaceTest.cpp @@ -41,7 +41,7 @@ // Create ValueShapeRange on the arith.addi operation. ValueShapeRange addiRange() { - auto &fnBody = mapFn.body(); + auto &fnBody = mapFn.getBody(); return std::next(fnBody.front().begin())->getOperands(); }