[llvm] [LLVM-C] Upstream `LLVMBuild{Min, Max}Num` from rustc (PR #162500)

via llvm-commits llvm-commits at lists.llvm.org
Wed Oct 8 08:41:57 PDT 2025


https://github.com/AMS21 created https://github.com/llvm/llvm-project/pull/162500

Upstreaming the [LLVMBuildMinNum](https://github.com/rust-lang/rust/blob/82224f6891c7e7aa0c6c865aa825100b3ea2d0fb/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp#L1579) and [LLVMBuildMaxNum](https://github.com/rust-lang/rust/blob/82224f6891c7e7aa0c6c865aa825100b3ea2d0fb/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp#L1583) functions to create calls to the `minnum` and `maxnum` intrinsics.

>From fc99f804e4b9bda4125d2d1e3e77d6a70fc3515f Mon Sep 17 00:00:00 2001
From: AMS21 <ams21.github at gmail.com>
Date: Wed, 8 Oct 2025 17:34:05 +0200
Subject: [PATCH] [LLVM-C] Upstream `LLVMBuild{Min,Max}Num` from rustc

---
 llvm/docs/ReleaseNotes.md              |  1 +
 llvm/include/llvm-c/Core.h             | 20 ++++++++++++++++++++
 llvm/lib/IR/Core.cpp                   | 10 ++++++++++
 llvm/unittests/IR/InstructionsTest.cpp | 23 +++++++++++++++++++++++
 4 files changed, 54 insertions(+)

diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index 79d93d08b8398..15c9aaf3b129b 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -147,6 +147,7 @@ Changes to the C API
 --------------------
 
 * Add `LLVMGetOrInsertFunction` to get or insert a function, replacing the combination of `LLVMGetNamedFunction` and `LLVMAddFunction`.
+* Add `LLVMBuildMinNum` and `LLVMBuildMaxNum` to create calls to the `minnum` and `maxnum` intrinsics.
 
 Changes to the CodeGen infrastructure
 -------------------------------------
diff --git a/llvm/include/llvm-c/Core.h b/llvm/include/llvm-c/Core.h
index 3d22f85911e78..2d66050b5acfa 100644
--- a/llvm/include/llvm-c/Core.h
+++ b/llvm/include/llvm-c/Core.h
@@ -4626,6 +4626,26 @@ LLVM_C_ABI LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V,
 LLVM_C_ABI LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V,
                                      const char *Name);
 
+/**
+ * Creates and inserts a minnum intrinsic intruction.
+ *
+ * Returns the minimum of the two floating point values.
+ *
+ * @see llvm::IRBuilder::CreateMinNum()
+ */
+LLVM_C_ABI LLVMValueRef LLVMBuildMinNum(LLVMBuilderRef B, LLVMValueRef LHS,
+                                        LLVMValueRef RHS);
+
+/**
+ * Creates and inserts a maxnum intrinsic intruction.
+ *
+ * Returns the maximum of the two floating point values.
+ *
+ * @see llvm::IRBuilder::CreateMaxNum()
+ */
+LLVM_C_ABI LLVMValueRef LLVMBuildMaxNum(LLVMBuilderRef B, LLVMValueRef LHS,
+                                        LLVMValueRef RHS);
+
 LLVM_C_ABI LLVMBool LLVMGetNUW(LLVMValueRef ArithInst);
 LLVM_C_ABI void LLVMSetNUW(LLVMValueRef ArithInst, LLVMBool HasNUW);
 LLVM_C_ABI LLVMBool LLVMGetNSW(LLVMValueRef ArithInst);
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index 3f1cc1e4e6d0e..d0285fb4516fa 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -3804,6 +3804,16 @@ LLVMValueRef LLVMBuildNot(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
   return wrap(unwrap(B)->CreateNot(unwrap(V), Name));
 }
 
+LLVMValueRef LLVMBuildMinNum(LLVMBuilderRef B, LLVMValueRef LHS,
+                             LLVMValueRef RHS) {
+  return wrap(unwrap(B)->CreateMinNum(unwrap(LHS), unwrap(RHS)));
+}
+
+LLVMValueRef LLVMBuildMaxNum(LLVMBuilderRef B, LLVMValueRef LHS,
+                             LLVMValueRef RHS) {
+  return wrap(unwrap(B)->CreateMaxNum(unwrap(LHS), unwrap(RHS)));
+}
+
 LLVMBool LLVMGetNUW(LLVMValueRef ArithInst) {
   Value *P = unwrap<Value>(ArithInst);
   return cast<Instruction>(P)->hasNoUnsignedWrap();
diff --git a/llvm/unittests/IR/InstructionsTest.cpp b/llvm/unittests/IR/InstructionsTest.cpp
index fe9e7e8228490..cb79a14d0ee7f 100644
--- a/llvm/unittests/IR/InstructionsTest.cpp
+++ b/llvm/unittests/IR/InstructionsTest.cpp
@@ -1933,5 +1933,28 @@ TEST(InstructionsTest, StripAndAccumulateConstantOffset) {
   EXPECT_TRUE(Offset.isZero());
 }
 
+TEST(InstructionsTest, LLVMBuildMinMaxNum) {
+  LLVMContext Ctx;
+  Module M("Mod", Ctx);
+  FunctionType *FT = FunctionType::get(Type::getVoidTy(Ctx), {}, false);
+  Function *F = Function::Create(FT, Function::ExternalLinkage, "f", M);
+  BasicBlock *BB = BasicBlock::Create(Ctx, "entry", F);
+  IRBuilder<> B(BB);
+
+  Type *FTy = B.getFloatTy();
+  Value *LHS = ConstantFP::get(FTy, 1.0);
+  Value *RHS = ConstantFP::get(FTy, 2.0);
+
+  auto *Min = unwrap<CallInst>(LLVMBuildMinNum(wrap(&B), wrap(LHS), wrap(RHS)));
+  Function *MinFunc = Min->getCalledFunction();
+  EXPECT_EQ(MinFunc->getIntrinsicID(), Intrinsic::minnum);
+  EXPECT_EQ(Min->getType(), FTy);
+
+  auto *Max = unwrap<CallInst>(LLVMBuildMaxNum(wrap(&B), wrap(LHS), wrap(RHS)));
+  Function *MaxFunc = Max->getCalledFunction();
+  EXPECT_EQ(MaxFunc->getIntrinsicID(), Intrinsic::maxnum);
+  EXPECT_EQ(Max->getType(), FTy);
+}
+
 } // end anonymous namespace
 } // end namespace llvm



More information about the llvm-commits mailing list