diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst index 2c663932f8f8c..2c160f1707cbb 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 b752fd42a7a12..b16f67ef02f33 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 b089dd48e55b4..e07664f8a17c6 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -3454,6 +3454,16 @@ void LLVMSetExact(LLVMValueRef DivOrShrInst, LLVMBool IsExact) { cast(P)->setIsExact(IsExact); } +LLVMBool LLVMGetNNeg(LLVMValueRef NonNegInst) { + Value *P = unwrap(NonNegInst); + return cast(P)->hasNonNeg(); +} + +void LLVMSetNNeg(LLVMValueRef NonNegInst, LLVMBool IsNonNeg) { + Value *P = unwrap(NonNegInst); + cast(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 5daa238bfb8e5..72d5b455badcb 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 06966ce528eae..3b07ccb29f3e0 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; }