Skip to content

Commit

Permalink
[Builder] Eliminate the StringRef/StringAttr forms of getSymbolRefAttr.
Browse files Browse the repository at this point in the history
The StringAttr version doesn't need a context, so we can just use the
existing `SymbolRefAttr::get` form.  The StringRef version isn't preferred
so we want to encourage people to use StringAttr.

There is an additional form of getSymbolRefAttr that takes a (SymbolTrait
implementing) operation.  This should also be moved, but I'll do that as
a separate patch.

Differential Revision: https://reviews.llvm.org/D108922
  • Loading branch information
lattner committed Aug 30, 2021
1 parent 7f2ce19 commit faf1c22
Show file tree
Hide file tree
Showing 37 changed files with 137 additions and 124 deletions.
5 changes: 3 additions & 2 deletions flang/include/flang/Optimizer/Dialect/FIROps.td
Original file line number Diff line number Diff line change
Expand Up @@ -2545,7 +2545,7 @@ def fir_CallOp : fir_Op<"call", [CallOpInterface]> {
[{
$_state.addOperands(operands);
$_state.addAttribute(calleeAttrName($_state.name),
$_builder.getSymbolRefAttr(callee));
SymbolRefAttr::get(callee));
$_state.addTypes(callee.getType().getResults());
}]>,
OpBuilder<(ins "mlir::SymbolRefAttr":$callee,
Expand All @@ -2560,7 +2560,8 @@ def fir_CallOp : fir_Op<"call", [CallOpInterface]> {
"llvm::ArrayRef<mlir::Type>":$results,
CArg<"mlir::ValueRange", "{}">:$operands),
[{
build($_builder, $_state, $_builder.getSymbolRefAttr(callee), results,
build($_builder, $_state,
SymbolRefAttr::get($_builder.getContext(), callee), results,
operands);
}]>];

Expand Down
2 changes: 1 addition & 1 deletion flang/lib/Lower/IntrinsicCall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,7 @@ mlir::SymbolRefAttr IntrinsicLibrary::getUnrestrictedIntrinsicSymbolRefAttr(
funcOp = getWrapper(rtCallGenerator, name, signature, loadRefArguments);
}

return builder.getSymbolRefAttr(funcOp.getName());
return SymbolRefAttr::get(funcOp);
}

//===----------------------------------------------------------------------===//
Expand Down
8 changes: 4 additions & 4 deletions flang/lib/Optimizer/Dialect/FIROps.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -398,8 +398,7 @@ mlir::ParseResult fir::parseCmpcOp(mlir::OpAsmParser &parser,
//===----------------------------------------------------------------------===//

void fir::ConvertOp::getCanonicalizationPatterns(
OwningRewritePatternList &results, MLIRContext *context) {
}
OwningRewritePatternList &results, MLIRContext *context) {}

mlir::OpFoldResult fir::ConvertOp::fold(llvm::ArrayRef<mlir::Attribute> opnds) {
if (value().getType() == getType())
Expand Down Expand Up @@ -629,7 +628,8 @@ void fir::GlobalOp::build(mlir::OpBuilder &builder, OperationState &result,
result.addAttribute(typeAttrName(result.name), mlir::TypeAttr::get(type));
result.addAttribute(mlir::SymbolTable::getSymbolAttrName(),
builder.getStringAttr(name));
result.addAttribute(symbolAttrName(), builder.getSymbolRefAttr(name));
result.addAttribute(symbolAttrName(),
SymbolRefAttr::get(builder.getContext(), name));
if (isConstant)
result.addAttribute(constantAttrName(result.name), builder.getUnitAttr());
if (initialVal)
Expand Down Expand Up @@ -1330,7 +1330,7 @@ static constexpr llvm::StringRef getTargetOffsetAttr() {
template <typename A, typename... AdditionalArgs>
static A getSubOperands(unsigned pos, A allArgs,
mlir::DenseIntElementsAttr ranges,
AdditionalArgs &&... additionalArgs) {
AdditionalArgs &&...additionalArgs) {
unsigned start = 0;
for (unsigned i = 0; i < pos; ++i)
start += (*(ranges.begin() + i)).getZExtValue();
Expand Down
3 changes: 2 additions & 1 deletion mlir/examples/toy/Ch2/mlir/Dialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,8 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
// Generic call always returns an unranked Tensor initially.
state.addTypes(UnrankedTensorType::get(builder.getF64Type()));
state.addOperands(arguments);
state.addAttribute("callee", builder.getSymbolRefAttr(callee));
state.addAttribute("callee",
mlir::SymbolRefAttr::get(builder.getContext(), callee));
}

//===----------------------------------------------------------------------===//
Expand Down
3 changes: 2 additions & 1 deletion mlir/examples/toy/Ch3/mlir/Dialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,8 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
// Generic call always returns an unranked Tensor initially.
state.addTypes(UnrankedTensorType::get(builder.getF64Type()));
state.addOperands(arguments);
state.addAttribute("callee", builder.getSymbolRefAttr(callee));
state.addAttribute("callee",
mlir::SymbolRefAttr::get(builder.getContext(), callee));
}

//===----------------------------------------------------------------------===//
Expand Down
3 changes: 2 additions & 1 deletion mlir/examples/toy/Ch4/mlir/Dialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,8 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
// Generic call always returns an unranked Tensor initially.
state.addTypes(UnrankedTensorType::get(builder.getF64Type()));
state.addOperands(arguments);
state.addAttribute("callee", builder.getSymbolRefAttr(callee));
state.addAttribute("callee",
mlir::SymbolRefAttr::get(builder.getContext(), callee));
}

/// Return the callee of the generic call operation, this is required by the
Expand Down
3 changes: 2 additions & 1 deletion mlir/examples/toy/Ch5/mlir/Dialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,8 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
// Generic call always returns an unranked Tensor initially.
state.addTypes(UnrankedTensorType::get(builder.getF64Type()));
state.addOperands(arguments);
state.addAttribute("callee", builder.getSymbolRefAttr(callee));
state.addAttribute("callee",
mlir::SymbolRefAttr::get(builder.getContext(), callee));
}

/// Return the callee of the generic call operation, this is required by the
Expand Down
3 changes: 2 additions & 1 deletion mlir/examples/toy/Ch6/mlir/Dialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,8 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
// Generic call always returns an unranked Tensor initially.
state.addTypes(UnrankedTensorType::get(builder.getF64Type()));
state.addOperands(arguments);
state.addAttribute("callee", builder.getSymbolRefAttr(callee));
state.addAttribute("callee",
mlir::SymbolRefAttr::get(builder.getContext(), callee));
}

/// Return the callee of the generic call operation, this is required by the
Expand Down
3 changes: 2 additions & 1 deletion mlir/examples/toy/Ch7/mlir/Dialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,8 @@ void GenericCallOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
// Generic call always returns an unranked Tensor initially.
state.addTypes(UnrankedTensorType::get(builder.getF64Type()));
state.addOperands(arguments);
state.addAttribute("callee", builder.getSymbolRefAttr(callee));
state.addAttribute("callee",
mlir::SymbolRefAttr::get(builder.getContext(), callee));
}

/// Return the callee of the generic call operation, this is required by the
Expand Down
2 changes: 1 addition & 1 deletion mlir/examples/toy/Ch7/mlir/MLIRGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -522,7 +522,7 @@ class MLIRGenImpl {
mlir::FuncOp calledFunc = calledFuncIt->second;
return builder.create<GenericCallOp>(
location, calledFunc.getType().getResult(0),
builder.getSymbolRefAttr(callee), operands);
mlir::SymbolRefAttr::get(builder.getContext(), callee), operands);
}

/// Emit a print expression. It emits specific operations for two builtins:
Expand Down
14 changes: 11 additions & 3 deletions mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -515,14 +515,22 @@ def LLVM_CallOp : LLVM_Op<"call",
let results = (outs Variadic<LLVM_Type>);
let builders = [
OpBuilder<(ins "LLVMFuncOp":$func, "ValueRange":$operands,
CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes),
[{
CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes), [{
Type resultType = func.getType().getReturnType();
if (!resultType.isa<LLVM::LLVMVoidType>())
$_state.addTypes(resultType);
$_state.addAttribute("callee", $_builder.getSymbolRefAttr(func));
$_state.addAttribute("callee", SymbolRefAttr::get(func));
$_state.addAttributes(attributes);
$_state.addOperands(operands);
}]>,
OpBuilder<(ins "TypeRange":$results, "StringAttr":$callee,
CArg<"ValueRange", "{}">:$operands), [{
build($_builder, $_state, results, SymbolRefAttr::get(callee), operands);
}]>,
OpBuilder<(ins "TypeRange":$results, "StringRef":$callee,
CArg<"ValueRange", "{}">:$operands), [{
build($_builder, $_state, results,
StringAttr::get($_builder.getContext(), callee), operands);
}]>];
let verifier = [{ return ::verify(*this); }];
let parser = [{ return parseCallOp(parser, result); }];
Expand Down
11 changes: 8 additions & 3 deletions mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
Original file line number Diff line number Diff line change
Expand Up @@ -560,7 +560,7 @@ def CallOp : Std_Op<"call",
let builders = [
OpBuilder<(ins "FuncOp":$callee, CArg<"ValueRange", "{}">:$operands), [{
$_state.addOperands(operands);
$_state.addAttribute("callee",$_builder.getSymbolRefAttr(callee));
$_state.addAttribute("callee", SymbolRefAttr::get(callee));
$_state.addTypes(callee.getType().getResults());
}]>,
OpBuilder<(ins "SymbolRefAttr":$callee, "TypeRange":$results,
Expand All @@ -569,14 +569,19 @@ def CallOp : Std_Op<"call",
$_state.addAttribute("callee", callee);
$_state.addTypes(results);
}]>,
OpBuilder<(ins "StringAttr":$callee, "TypeRange":$results,
CArg<"ValueRange", "{}">:$operands), [{
build($_builder, $_state, SymbolRefAttr::get(callee), results, operands);
}]>,
OpBuilder<(ins "StringRef":$callee, "TypeRange":$results,
CArg<"ValueRange", "{}">:$operands), [{
build($_builder, $_state, $_builder.getSymbolRefAttr(callee), results,
operands);
build($_builder, $_state, StringAttr::get($_builder.getContext(), callee),
results, operands);
}]>];

let extraClassDeclaration = [{
StringRef getCallee() { return callee(); }
StringAttr getCalleeAttr() { return calleeAttr().getAttr(); }
FunctionType getCalleeType();

/// Get the argument operands to the called function.
Expand Down
11 changes: 0 additions & 11 deletions mlir/include/mlir/IR/Builders.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,17 +97,6 @@ class Builder {
FloatAttr getFloatAttr(Type type, const APFloat &value);
StringAttr getStringAttr(const Twine &bytes);
ArrayAttr getArrayAttr(ArrayRef<Attribute> value);
FlatSymbolRefAttr getSymbolRefAttr(Operation *value);
FlatSymbolRefAttr getSymbolRefAttr(StringAttr value);
SymbolRefAttr getSymbolRefAttr(StringAttr value,
ArrayRef<FlatSymbolRefAttr> nestedReferences);
SymbolRefAttr getSymbolRefAttr(StringRef value,
ArrayRef<FlatSymbolRefAttr> nestedReferences) {
return getSymbolRefAttr(getStringAttr(value), nestedReferences);
}
FlatSymbolRefAttr getSymbolRefAttr(StringRef value) {
return getSymbolRefAttr(getStringAttr(value));
}

// Returns a 0-valued attribute of the given `type`. This function only
// supports boolean, integer, and 16-/32-/64-bit float types, and vector or
Expand Down
10 changes: 8 additions & 2 deletions mlir/include/mlir/IR/BuiltinAttributes.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class FunctionType;
class IntegerSet;
class IntegerType;
class Location;
class Operation;
class ShapedType;

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -685,12 +686,17 @@ class FlatSymbolRefAttr : public SymbolRefAttr {
using ValueType = StringRef;

/// Construct a symbol reference for the given value name.
static FlatSymbolRefAttr get(StringAttr value) {
return SymbolRefAttr::get(value);
}
static FlatSymbolRefAttr get(MLIRContext *ctx, StringRef value) {
return SymbolRefAttr::get(ctx, value);
}

static FlatSymbolRefAttr get(StringAttr value) {
return SymbolRefAttr::get(value);
/// Convenience getter for building a SymbolRefAttr based on an operation
/// that implements the SymbolTrait.
static FlatSymbolRefAttr get(Operation *symbol) {
return SymbolRefAttr::get(symbol);
}

/// Returns the name of the held symbol reference as a StringAttr.
Expand Down
10 changes: 9 additions & 1 deletion mlir/include/mlir/IR/BuiltinAttributes.td
Original file line number Diff line number Diff line change
Expand Up @@ -893,8 +893,16 @@ def Builtin_SymbolRefAttr : Builtin_Attr<"SymbolRef"> {
}]>,
];
let extraClassDeclaration = [{
static FlatSymbolRefAttr get(MLIRContext *ctx, StringRef value);
static SymbolRefAttr get(MLIRContext *ctx, StringRef value,
ArrayRef<FlatSymbolRefAttr> nestedRefs);
/// Convenience getters for building a SymbolRefAttr with no path, which is
/// known to produce a FlatSymbolRefAttr.
static FlatSymbolRefAttr get(StringAttr value);
static FlatSymbolRefAttr get(MLIRContext *ctx, StringRef value);

/// Convenience getter for buliding a SymbolRefAttr based on an operation
/// that implements the SymbolTrait.
static FlatSymbolRefAttr get(Operation *symbol);

/// Returns the name of the fully resolved symbol, i.e. the leaf of the
/// reference path.
Expand Down
5 changes: 3 additions & 2 deletions mlir/include/mlir/IR/OpBase.td
Original file line number Diff line number Diff line change
Expand Up @@ -1582,15 +1582,16 @@ def SymbolRefAttr : Attr<CPred<"$_self.isa<::mlir::SymbolRefAttr>()">,
let storageType = [{ ::mlir::SymbolRefAttr }];
let returnType = [{ ::mlir::SymbolRefAttr }];
let valueType = NoneType;
let constBuilderCall = "$_builder.getSymbolRefAttr($0)";
let constBuilderCall = "SymbolRefAttr::get($_builder.getContext(), $0)";
let convertFromStorage = "$_self";
}

def FlatSymbolRefAttr : Attr<CPred<"$_self.isa<::mlir::FlatSymbolRefAttr>()">,
"flat symbol reference attribute"> {
let storageType = [{ ::mlir::FlatSymbolRefAttr }];
let returnType = [{ ::llvm::StringRef }];
let valueType = NoneType;
let constBuilderCall = "$_builder.getSymbolRefAttr($0)";
let constBuilderCall = "SymbolRefAttr::get($_builder.getContext(), $0)";
let convertFromStorage = "$_self.getValue()";
}

Expand Down
8 changes: 4 additions & 4 deletions mlir/lib/Conversion/AsyncToLLVM/AsyncToLLVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ class CoroBeginOpConversion : public OpConversionPattern<CoroBeginOp> {

// Allocate memory for the coroutine frame.
auto coroAlloc = rewriter.create<LLVM::CallOp>(
loc, i8Ptr, rewriter.getSymbolRefAttr(kMalloc),
loc, i8Ptr, SymbolRefAttr::get(rewriter.getContext(), kMalloc),
ValueRange(coroSize.getResult()));

// Begin a coroutine: @llvm.coro.begin.
Expand Down Expand Up @@ -399,9 +399,9 @@ class CoroFreeOpConversion : public OpConversionPattern<CoroFreeOp> {
auto coroMem = rewriter.create<LLVM::CoroFreeOp>(loc, i8Ptr, operands);

// Free the memory.
rewriter.replaceOpWithNewOp<LLVM::CallOp>(op, TypeRange(),
rewriter.getSymbolRefAttr(kFree),
ValueRange(coroMem.getResult()));
rewriter.replaceOpWithNewOp<LLVM::CallOp>(
op, TypeRange(), SymbolRefAttr::get(rewriter.getContext(), kFree),
ValueRange(coroMem.getResult()));

return success();
}
Expand Down
3 changes: 1 addition & 2 deletions mlir/lib/Conversion/GPUCommon/OpToFuncCallLowering.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,7 @@ struct OpToFuncCallLowering : public ConvertOpToLLVMPattern<SourceOp> {

LLVMFuncOp funcOp = appendOrGetFuncOp(funcName, funcType, op);
auto callOp = rewriter.create<LLVM::CallOp>(
op->getLoc(), resultType, rewriter.getSymbolRefAttr(funcOp),
castedOperands);
op->getLoc(), resultType, SymbolRefAttr::get(funcOp), castedOperands);

if (resultType == operands.front().getType()) {
rewriter.replaceOp(op, {callOp.getResult(0)});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,14 +171,13 @@ void ConvertGpuLaunchFuncToVulkanLaunchFunc::convertGpuLaunchFunc(

// Create vulkan launch call op.
auto vulkanLaunchCallOp = builder.create<CallOp>(
loc, TypeRange{}, builder.getSymbolRefAttr(kVulkanLaunch),
loc, TypeRange{}, SymbolRefAttr::get(builder.getContext(), kVulkanLaunch),
vulkanLaunchOperands);

// Set SPIR-V binary shader data as an attribute.
vulkanLaunchCallOp->setAttr(
kSPIRVBlobAttrName,
StringAttr::get(loc->getContext(),
StringRef(binary.data(), binary.size())));
builder.getStringAttr(StringRef(binary.data(), binary.size())));

// Set entry point name as an attribute.
vulkanLaunchCallOp->setAttr(kSPIRVEntryPointAttrName,
Expand Down
20 changes: 7 additions & 13 deletions mlir/lib/Conversion/GPUToVulkan/ConvertLaunchFuncToVulkanCalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -248,9 +248,7 @@ void VulkanLaunchFuncToVulkanCallsPass::createBindMemRefCalls(
}
// Create call to `bindMemRef`.
builder.create<LLVM::CallOp>(
loc, TypeRange(),
builder.getSymbolRefAttr(
StringRef(symbolName.data(), symbolName.size())),
loc, TypeRange(), StringRef(symbolName.data(), symbolName.size()),
ValueRange{vulkanRuntime, descriptorSet, descriptorBinding,
ptrToMemRefDescriptor});
}
Expand Down Expand Up @@ -373,8 +371,7 @@ void VulkanLaunchFuncToVulkanCallsPass::translateVulkanLaunchCall(
Location loc = cInterfaceVulkanLaunchCallOp.getLoc();
// Create call to `initVulkan`.
auto initVulkanCall = builder.create<LLVM::CallOp>(
loc, TypeRange{getPointerType()}, builder.getSymbolRefAttr(kInitVulkan),
ValueRange{});
loc, TypeRange{getPointerType()}, kInitVulkan);
// The result of `initVulkan` function is a pointer to Vulkan runtime, we
// need to pass that pointer to each Vulkan runtime call.
auto vulkanRuntime = initVulkanCall.getResult(0);
Expand All @@ -396,32 +393,29 @@ void VulkanLaunchFuncToVulkanCallsPass::translateVulkanLaunchCall(
// Create call to `setBinaryShader` runtime function with the given pointer to
// SPIR-V binary and binary size.
builder.create<LLVM::CallOp>(
loc, TypeRange(), builder.getSymbolRefAttr(kSetBinaryShader),
loc, TypeRange(), kSetBinaryShader,
ValueRange{vulkanRuntime, ptrToSPIRVBinary, binarySize});
// Create LLVM global with entry point name.
Value entryPointName = createEntryPointNameConstant(
spirvAttributes.second.getValue(), loc, builder);
// Create call to `setEntryPoint` runtime function with the given pointer to
// entry point name.
builder.create<LLVM::CallOp>(loc, TypeRange(),
builder.getSymbolRefAttr(kSetEntryPoint),
builder.create<LLVM::CallOp>(loc, TypeRange(), kSetEntryPoint,
ValueRange{vulkanRuntime, entryPointName});

// Create number of local workgroup for each dimension.
builder.create<LLVM::CallOp>(
loc, TypeRange(), builder.getSymbolRefAttr(kSetNumWorkGroups),
loc, TypeRange(), kSetNumWorkGroups,
ValueRange{vulkanRuntime, cInterfaceVulkanLaunchCallOp.getOperand(0),
cInterfaceVulkanLaunchCallOp.getOperand(1),
cInterfaceVulkanLaunchCallOp.getOperand(2)});

// Create call to `runOnVulkan` runtime function.
builder.create<LLVM::CallOp>(loc, TypeRange(),
builder.getSymbolRefAttr(kRunOnVulkan),
builder.create<LLVM::CallOp>(loc, TypeRange(), kRunOnVulkan,
ValueRange{vulkanRuntime});

// Create call to 'deinitVulkan' runtime function.
builder.create<LLVM::CallOp>(loc, TypeRange(),
builder.getSymbolRefAttr(kDeinitVulkan),
builder.create<LLVM::CallOp>(loc, TypeRange(), kDeinitVulkan,
ValueRange{vulkanRuntime});

// Declare runtime functions.
Expand Down
3 changes: 2 additions & 1 deletion mlir/lib/Conversion/LinalgToStandard/LinalgToStandard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ static FlatSymbolRefAttr getLibraryCallSymbolRef(Operation *op,
}

// fnName is a dynamic std::string, unique it via a SymbolRefAttr.
FlatSymbolRefAttr fnNameAttr = rewriter.getSymbolRefAttr(fnName);
FlatSymbolRefAttr fnNameAttr =
SymbolRefAttr::get(rewriter.getContext(), fnName);
auto module = op->getParentOfType<ModuleOp>();
if (module.lookupSymbol(fnNameAttr.getAttr()))
return fnNameAttr;
Expand Down
2 changes: 1 addition & 1 deletion mlir/lib/Conversion/MemRefToLLVM/MemRefToLLVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ struct DeallocOpLowering : public ConvertOpToLLVMPattern<memref::DeallocOp> {
op.getLoc(), getVoidPtrType(),
memref.allocatedPtr(rewriter, op.getLoc()));
rewriter.replaceOpWithNewOp<LLVM::CallOp>(
op, TypeRange(), rewriter.getSymbolRefAttr(freeFunc), casted);
op, TypeRange(), SymbolRefAttr::get(freeFunc), casted);
return success();
}
};
Expand Down
Loading

2 comments on commit faf1c22

@victoryang00
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This minor change seems to make the code in onnx-mlir a huge side effect.

@joker-eph
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you clarify what you mean @victoryang00 ?
It isn't clear to me from your sentence if you are reporting that this change required many API updates in your project, or if there are other issues (correctness, performance, ergonomic, ...)?

Please sign in to comment.