[libc-commits] [libc] [lldb] [clang] [compiler-rt] [mlir] [polly] [libcxx] [openmp] [llvm] [C API] Add support for setting/getting new nneg flag on zext instructions (PR #73592)
Benji Smith via libc-commits
libc-commits at lists.llvm.org
Tue Nov 28 04:03:50 PST 2023
https://github.com/Benjins updated https://github.com/llvm/llvm-project/pull/73592
>From de348ecdbf9d3c299eb4fe302ed2c224df7cde6b Mon Sep 17 00:00:00 2001
From: Benji Smith <6193112+Benjins at users.noreply.github.com>
Date: Mon, 27 Nov 2023 18:15:22 -0500
Subject: [PATCH] [C API] Add support for setting/getting new nneg flag on zext
instructions
This flag was added in #67982, but was not yet accessible via the C API. This
commit adds a getter/setter for this flag, and a test for it
---
llvm/docs/ReleaseNotes.rst | 3 +++
llvm/include/llvm-c/Core.h | 11 +++++++++++
llvm/lib/IR/Core.cpp | 10 ++++++++++
llvm/test/Bindings/llvm-c/echo.ll | 2 ++
llvm/tools/llvm-c-test/echo.cpp | 8 ++++++++
5 files changed, 34 insertions(+)
diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index 2c663932f8f8c2f..2c160f1707cbb95 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -199,6 +199,9 @@ Changes to the C API
The option structure exposes an additional setting (i.e., the target ABI) and
provides default values for unspecified settings.
+* Added ``LLVMGetNNeg`` and ``LLVMSetNNeg`` for setting/getting the new nneg flag
+ on zext instructions
+
Changes to the CodeGen infrastructure
-------------------------------------
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index b752fd42a7a12cf..b16f67ef02f3362 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -3974,6 +3974,17 @@ void LLVMSetNSW(LLVMValueRef ArithInst, LLVMBool HasNSW);
LLVMBool LLVMGetExact(LLVMValueRef DivOrShrInst);
void LLVMSetExact(LLVMValueRef DivOrShrInst, LLVMBool IsExact);
+/**
+ * Gets if the instruction has the non-negative flag set
+ * Only valid for zext instructions
+ */
+LLVMBool LLVMGetNNeg(LLVMValueRef NonNegInst);
+/**
+ * Sets the non-negative flag for the instruction
+ * Only valid for zext instructions
+ */
+void LLVMSetNNeg(LLVMValueRef NonNegInst, LLVMBool IsNonNeg);
+
/* Memory */
LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index b089dd48e55b4d4..e07664f8a17c6d9 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -3454,6 +3454,16 @@ void LLVMSetExact(LLVMValueRef DivOrShrInst, LLVMBool IsExact) {
cast<Instruction>(P)->setIsExact(IsExact);
}
+LLVMBool LLVMGetNNeg(LLVMValueRef NonNegInst) {
+ Value *P = unwrap<Value>(NonNegInst);
+ return cast<Instruction>(P)->hasNonNeg();
+}
+
+void LLVMSetNNeg(LLVMValueRef NonNegInst, LLVMBool IsNonNeg) {
+ Value *P = unwrap<Value>(NonNegInst);
+ cast<Instruction>(P)->setNonNeg(IsNonNeg);
+}
+
/*--.. Memory ..............................................................--*/
LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
diff --git a/llvm/test/Bindings/llvm-c/echo.ll b/llvm/test/Bindings/llvm-c/echo.ll
index 5daa238bfb8e533..72d5b455badcbec 100644
--- a/llvm/test/Bindings/llvm-c/echo.ll
+++ b/llvm/test/Bindings/llvm-c/echo.ll
@@ -90,6 +90,8 @@ define i32 @iops(i32 %a, i32 %b) {
%21 = sdiv exact i32 %20, %2
%22 = lshr exact i32 %21, %4
%23 = ashr exact i32 %22, %14
+ %24 = zext i32 %23 to i64
+ %25 = zext nneg i32 %23 to i64
ret i32 %23
}
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp
index 06966ce528eae4d..3b07ccb29f3e061 100644
--- a/llvm/tools/llvm-c-test/echo.cpp
+++ b/llvm/tools/llvm-c-test/echo.cpp
@@ -899,6 +899,14 @@ struct FunCloner {
Dst = LLVMBuildFence(Builder, Ordering, IsSingleThreaded, Name);
break;
}
+ case LLVMZExt: {
+ LLVMValueRef Val = CloneValue(LLVMGetOperand(Src, 0));
+ LLVMTypeRef DestTy = CloneType(LLVMTypeOf(Src));
+ LLVMBool NNeg = LLVMGetNNeg(Src);
+ Dst = LLVMBuildZExt(Builder, Val, DestTy, Name);
+ LLVMSetNNeg(Dst, NNeg);
+ break;
+ }
default:
break;
}
More information about the libc-commits
mailing list