[llvm] 1343e68 - [C API] Add function to create ConstantRange attributes to C API (#90505)
via llvm-commits
llvm-commits at lists.llvm.org
Sat May 4 00:02:02 PDT 2024
Author: Andreas Jonson
Date: 2024-05-04T16:01:59+09:00
New Revision: 1343e68862874f1baf2d8523320e2278fcb9df32
URL: https://github.com/llvm/llvm-project/commit/1343e68862874f1baf2d8523320e2278fcb9df32
DIFF: https://github.com/llvm/llvm-project/commit/1343e68862874f1baf2d8523320e2278fcb9df32.diff
LOG: [C API] Add function to create ConstantRange attributes to C API (#90505)
Added:
Modified:
llvm/docs/ReleaseNotes.rst
llvm/include/llvm-c/Core.h
llvm/lib/IR/Core.cpp
llvm/unittests/IR/AttributesTest.cpp
Removed:
################################################################################
diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index 792b7a4b440f2a..0f4e2759de08ac 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -164,6 +164,8 @@ Changes to the C API
* Added ``LLVMAtomicRMWBinOpUIncWrap`` and ``LLVMAtomicRMWBinOpUDecWrap`` to
``LLVMAtomicRMWBinOp`` enum for AtomicRMW instructions.
+* Added ``LLVMCreateConstantRangeAttribute`` function for creating ConstantRange Attributes.
+
Changes to the CodeGen infrastructure
-------------------------------------
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index 0b03f3b36fcdd3..ba02ca48257532 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -673,6 +673,18 @@ LLVMAttributeRef LLVMCreateTypeAttribute(LLVMContextRef C, unsigned KindID,
*/
LLVMTypeRef LLVMGetTypeAttributeValue(LLVMAttributeRef A);
+/**
+ * Create a ConstantRange attribute.
+ *
+ * LowerWords and UpperWords need to be NumBits divided by 64 rounded up
+ * elements long.
+ */
+LLVMAttributeRef LLVMCreateConstantRangeAttribute(LLVMContextRef C,
+ unsigned KindID,
+ unsigned NumBits,
+ const uint64_t LowerWords[],
+ const uint64_t UpperWords[]);
+
/**
* Create a string attribute.
*/
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index 6aff94f39d9c0c..1b84527d5e8741 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -14,6 +14,7 @@
#include "llvm-c/Core.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DerivedTypes.h"
@@ -33,6 +34,7 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Threading.h"
#include "llvm/Support/raw_ostream.h"
@@ -178,6 +180,20 @@ LLVMTypeRef LLVMGetTypeAttributeValue(LLVMAttributeRef A) {
return wrap(Attr.getValueAsType());
}
+LLVMAttributeRef LLVMCreateConstantRangeAttribute(LLVMContextRef C,
+ unsigned KindID,
+ unsigned NumBits,
+ const uint64_t LowerWords[],
+ const uint64_t UpperWords[]) {
+ auto &Ctx = *unwrap(C);
+ auto AttrKind = (Attribute::AttrKind)KindID;
+ unsigned NumWords = divideCeil(NumBits, 64);
+ return wrap(Attribute::get(
+ Ctx, AttrKind,
+ ConstantRange(APInt(NumBits, ArrayRef(LowerWords, NumWords)),
+ APInt(NumBits, ArrayRef(UpperWords, NumWords)))));
+}
+
LLVMAttributeRef LLVMCreateStringAttribute(LLVMContextRef C,
const char *K, unsigned KLength,
const char *V, unsigned VLength) {
diff --git a/llvm/unittests/IR/AttributesTest.cpp b/llvm/unittests/IR/AttributesTest.cpp
index 1accdfd3f6a423..a7967593c2f960 100644
--- a/llvm/unittests/IR/AttributesTest.cpp
+++ b/llvm/unittests/IR/AttributesTest.cpp
@@ -7,8 +7,10 @@
//===----------------------------------------------------------------------===//
#include "llvm/IR/Attributes.h"
+#include "llvm-c/Core.h"
#include "llvm/AsmParser/Parser.h"
#include "llvm/IR/AttributeMask.h"
+#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/LLVMContext.h"
@@ -308,4 +310,34 @@ TEST(Attributes, RemoveParamAttributes) {
EXPECT_EQ(AL.getNumAttrSets(), 0U);
}
+TEST(Attributes, ConstantRangeAttributeCAPI) {
+ LLVMContext C;
+ {
+ const unsigned NumBits = 8;
+ const uint64_t LowerWords[] = {0};
+ const uint64_t UpperWords[] = {42};
+
+ ConstantRange Range(APInt(NumBits, ArrayRef(LowerWords)),
+ APInt(NumBits, ArrayRef(UpperWords)));
+
+ Attribute RangeAttr = Attribute::get(C, Attribute::Range, Range);
+ auto OutAttr = unwrap(LLVMCreateConstantRangeAttribute(
+ wrap(&C), Attribute::Range, NumBits, LowerWords, UpperWords));
+ EXPECT_EQ(OutAttr, RangeAttr);
+ }
+ {
+ const unsigned NumBits = 128;
+ const uint64_t LowerWords[] = {1, 1};
+ const uint64_t UpperWords[] = {42, 42};
+
+ ConstantRange Range(APInt(NumBits, ArrayRef(LowerWords)),
+ APInt(NumBits, ArrayRef(UpperWords)));
+
+ Attribute RangeAttr = Attribute::get(C, Attribute::Range, Range);
+ auto OutAttr = unwrap(LLVMCreateConstantRangeAttribute(
+ wrap(&C), Attribute::Range, NumBits, LowerWords, UpperWords));
+ EXPECT_EQ(OutAttr, RangeAttr);
+ }
+}
+
} // end anonymous namespace
More information about the llvm-commits
mailing list