From de755178c19711c1ea3a25e544c236632bc1c29d Mon Sep 17 00:00:00 2001 From: YunQiang Su Date: Fri, 28 Feb 2025 09:45:25 +0800 Subject: [PATCH 1/2] IRBuilder: Add FMFSource parameter to CreateMaxNum/CreateMinNum In https://github.com/llvm/llvm-project/pull/112852, we claimed that llvm.minnum and llvm.maxnum should treat +0.0>-0.0, while libc doesn't require fmin(3)/fmax(3) for it. Let's add FMFSource parameter to CreateMaxNum and CreateMinNum, so that it can be used by CodeGenFunction::EmitBuiltinExpr of Clang. --- llvm/include/llvm/IR/IRBuilder.h | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h index 933dbb306d1fc..c37a8a98e1c4d 100644 --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -1005,23 +1005,25 @@ class IRBuilderBase { const Twine &Name = ""); /// Create call to the minnum intrinsic. - Value *CreateMinNum(Value *LHS, Value *RHS, const Twine &Name = "") { + Value *CreateMinNum(Value *LHS, Value *RHS, const Twine &Name = "", + FMFSource FMFSource = {}) { if (IsFPConstrained) { return CreateConstrainedFPUnroundedBinOp( - Intrinsic::experimental_constrained_minnum, LHS, RHS, nullptr, Name); + Intrinsic::experimental_constrained_minnum, LHS, RHS, FMFSource, Name); } - return CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS, nullptr, Name); + return CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS, FMFSource, Name); } /// Create call to the maxnum intrinsic. - Value *CreateMaxNum(Value *LHS, Value *RHS, const Twine &Name = "") { + Value *CreateMaxNum(Value *LHS, Value *RHS, const Twine &Name = "", + FMFSource FMFSource = {}) { if (IsFPConstrained) { return CreateConstrainedFPUnroundedBinOp( - Intrinsic::experimental_constrained_maxnum, LHS, RHS, nullptr, Name); + Intrinsic::experimental_constrained_maxnum, LHS, RHS, FMFSource, Name); } - return CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS, nullptr, Name); + return CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS, FMFSource, Name); } /// Create call to the minimum intrinsic. From 20509941549b2fb0a3af1df543dde0a29193a657 Mon Sep 17 00:00:00 2001 From: YunQiang Su Date: Mon, 3 Mar 2025 15:10:36 +0800 Subject: [PATCH 2/2] para order --- clang/lib/CodeGen/CGBuiltin.cpp | 4 ++-- llvm/include/llvm/IR/IRBuilder.h | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 65fac01d58362..1c877b95d8f8a 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -4378,7 +4378,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, : llvm::Intrinsic::umax, Op0, Op1, nullptr, "elt.max"); } else - Result = Builder.CreateMaxNum(Op0, Op1, "elt.max"); + Result = Builder.CreateMaxNum(Op0, Op1, /*FMFSource=*/nullptr, "elt.max"); return RValue::get(Result); } case Builtin::BI__builtin_elementwise_min: { @@ -4394,7 +4394,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, : llvm::Intrinsic::umin, Op0, Op1, nullptr, "elt.min"); } else - Result = Builder.CreateMinNum(Op0, Op1, "elt.min"); + Result = Builder.CreateMinNum(Op0, Op1, /*FMFSource=*/nullptr, "elt.min"); return RValue::get(Result); } diff --git a/llvm/include/llvm/IR/IRBuilder.h b/llvm/include/llvm/IR/IRBuilder.h index c37a8a98e1c4d..67e357c600d3b 100644 --- a/llvm/include/llvm/IR/IRBuilder.h +++ b/llvm/include/llvm/IR/IRBuilder.h @@ -1005,22 +1005,24 @@ class IRBuilderBase { const Twine &Name = ""); /// Create call to the minnum intrinsic. - Value *CreateMinNum(Value *LHS, Value *RHS, const Twine &Name = "", - FMFSource FMFSource = {}) { + Value *CreateMinNum(Value *LHS, Value *RHS, FMFSource FMFSource = {}, + const Twine &Name = "") { if (IsFPConstrained) { return CreateConstrainedFPUnroundedBinOp( - Intrinsic::experimental_constrained_minnum, LHS, RHS, FMFSource, Name); + Intrinsic::experimental_constrained_minnum, LHS, RHS, FMFSource, + Name); } return CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS, FMFSource, Name); } /// Create call to the maxnum intrinsic. - Value *CreateMaxNum(Value *LHS, Value *RHS, const Twine &Name = "", - FMFSource FMFSource = {}) { + Value *CreateMaxNum(Value *LHS, Value *RHS, FMFSource FMFSource = {}, + const Twine &Name = "") { if (IsFPConstrained) { return CreateConstrainedFPUnroundedBinOp( - Intrinsic::experimental_constrained_maxnum, LHS, RHS, FMFSource, Name); + Intrinsic::experimental_constrained_maxnum, LHS, RHS, FMFSource, + Name); } return CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS, FMFSource, Name);