-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[MLIR][IRDL] Add C API for IRDL Variadicity attributes. #171076
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[MLIR][IRDL] Add C API for IRDL Variadicity attributes. #171076
Conversation
This add the basic APIs to create VariadicityAttr and VariadicityArrayAttr attributes from the C API. This is necessary for C API users that want to create IRDL dialect declarations.
|
@llvm/pr-subscribers-mlir Author: Mike Urbach (mikeurbach) ChangesThis add the basic APIs to create VariadicityAttr and Full diff: https://github.com/llvm/llvm-project/pull/171076.diff 3 Files Affected:
diff --git a/mlir/include/mlir-c/Dialect/IRDL.h b/mlir/include/mlir-c/Dialect/IRDL.h
index c4d6ffd989af9..d87ab864fb33f 100644
--- a/mlir/include/mlir-c/Dialect/IRDL.h
+++ b/mlir/include/mlir-c/Dialect/IRDL.h
@@ -22,6 +22,20 @@ MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(IRDL, irdl);
/// the module's associated context.
MLIR_CAPI_EXPORTED MlirLogicalResult mlirLoadIRDLDialects(MlirModule module);
+//===----------------------------------------------------------------------===//
+// VariadicityAttr
+//===----------------------------------------------------------------------===//
+
+MLIR_CAPI_EXPORTED MlirAttribute
+mlirIRDLVariadicityAttrGet(MlirContext ctx, MlirStringRef value);
+
+//===----------------------------------------------------------------------===//
+// VariadicityArrayAttr
+//===----------------------------------------------------------------------===//
+
+MLIR_CAPI_EXPORTED MlirAttribute mlirIRDLVariadicityArrayAttrGet(
+ MlirContext ctx, intptr_t nValues, MlirAttribute const *values);
+
#ifdef __cplusplus
}
#endif
diff --git a/mlir/lib/CAPI/Dialect/IRDL.cpp b/mlir/lib/CAPI/Dialect/IRDL.cpp
index cb9dc8ceb6795..43f420bf6db05 100644
--- a/mlir/lib/CAPI/Dialect/IRDL.cpp
+++ b/mlir/lib/CAPI/Dialect/IRDL.cpp
@@ -16,3 +16,30 @@ MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(IRDL, irdl, mlir::irdl::IRDLDialect)
MlirLogicalResult mlirLoadIRDLDialects(MlirModule module) {
return wrap(mlir::irdl::loadDialects(unwrap(module)));
}
+
+//===----------------------------------------------------------------------===//
+// VariadicityAttr
+//===----------------------------------------------------------------------===//
+
+MlirAttribute mlirIRDLVariadicityAttrGet(MlirContext ctx, MlirStringRef value) {
+ return wrap(mlir::irdl::VariadicityAttr::get(
+ unwrap(ctx), mlir::irdl::symbolizeVariadicity(unwrap(value)).value()));
+}
+
+//===----------------------------------------------------------------------===//
+// VariadicityArrayAttr
+//===----------------------------------------------------------------------===//
+
+MlirAttribute mlirIRDLVariadicityArrayAttrGet(MlirContext ctx, intptr_t nValues,
+ MlirAttribute const *values) {
+ llvm::SmallVector<mlir::Attribute> attrs;
+ llvm::ArrayRef<mlir::Attribute> unwrappedAttrs =
+ unwrapList(nValues, values, attrs);
+
+ llvm::SmallVector<mlir::irdl::VariadicityAttr> variadicities;
+ for (auto attr : unwrappedAttrs)
+ variadicities.push_back(llvm::cast<mlir::irdl::VariadicityAttr>(attr));
+
+ return wrap(
+ mlir::irdl::VariadicityArrayAttr::get(unwrap(ctx), variadicities));
+}
diff --git a/mlir/test/CAPI/irdl.c b/mlir/test/CAPI/irdl.c
index ad52ece6a41ce..20cf35f2501ff 100644
--- a/mlir/test/CAPI/irdl.c
+++ b/mlir/test/CAPI/irdl.c
@@ -12,6 +12,7 @@
#include "mlir-c/Dialect/IRDL.h"
#include "mlir-c/IR.h"
+#include "mlir-c/Support.h"
const char irdlDialect[] = "\
irdl.dialect @foo {\
@@ -37,10 +38,39 @@ const char newDialectUsage[] = "\
\"bar.op\"(%res) : (i32) -> ()\
}";
+void testVariadicityAttributes(MlirContext ctx) {
+ MlirAttribute variadicitySingle =
+ mlirIRDLVariadicityAttrGet(ctx, mlirStringRefCreateFromCString("single"));
+
+ // CHECK: #irdl<variadicity single>
+ mlirAttributeDump(variadicitySingle);
+
+ MlirAttribute variadicityOptional = mlirIRDLVariadicityAttrGet(
+ ctx, mlirStringRefCreateFromCString("optional"));
+
+ // CHECK: #irdl<variadicity optional>
+ mlirAttributeDump(variadicityOptional);
+
+ MlirAttribute variadicityVariadic = mlirIRDLVariadicityAttrGet(
+ ctx, mlirStringRefCreateFromCString("variadic"));
+
+ // CHECK: #irdl<variadicity variadic>
+ mlirAttributeDump(variadicityVariadic);
+
+ MlirAttribute variadicities[] = {variadicitySingle, variadicityOptional,
+ variadicityVariadic};
+ MlirAttribute variadicityArray =
+ mlirIRDLVariadicityArrayAttrGet(ctx, 3, variadicities);
+
+ // CHECK: #irdl<variadicity_array[ single, optional, variadic]>
+ mlirAttributeDump(variadicityArray);
+}
+
int main(void) {
MlirContext ctx = mlirContextCreate();
mlirDialectHandleLoadDialect(mlirGetDialectHandle__irdl__(), ctx);
+ // Test loading an IRDL dialect and using it.
MlirModule dialectDecl =
mlirModuleCreateParse(ctx, mlirStringRefCreateFromCString(irdlDialect));
@@ -53,6 +83,10 @@ int main(void) {
mlirOperationDump(mlirModuleGetOperation(usingModule));
mlirModuleDestroy(usingModule);
+
+ // Test variadicity attributes.
+ testVariadicityAttributes(ctx);
+
mlirContextDestroy(ctx);
return 0;
}
|
math-fehr
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
That looks good to me!
|
Thanks for the review @math-fehr . BTW, I didn't handle this in this PR, but we could probably update the Python bindings to use the C API. Seems like it builds string representations of variadicity attributes, and parses them currently. |
This add the basic APIs to create VariadicityAttr and
VariadicityArrayAttr attributes from the C API. This is necessary for
C API users that want to create IRDL dialect declarations.