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+benj...@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; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits