[clang] [CIR] Upstream Builtin FloorOp (PR #169954)
Letu Ren via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 28 11:37:19 PST 2025
https://github.com/FantasqueX updated https://github.com/llvm/llvm-project/pull/169954
>From f0a25eae56995c6dfd4db5d14b0c18ecabece995 Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Sat, 29 Nov 2025 03:27:48 +0800
Subject: [PATCH 1/2] [CIR] Upstream Builtin FloorOp
---
clang/include/clang/CIR/Dialect/IR/CIROps.td | 10 +++++++++
clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp | 10 +++++++++
.../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 8 +++++++
.../CodeGenBuiltins/builtins-floating-point.c | 21 +++++++++++++++++++
4 files changed, 49 insertions(+)
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 5f5fab6f12300..dca7fd1485309 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -4722,6 +4722,16 @@ def CIR_FAbsOp : CIR_UnaryFPToFPBuiltinOp<"fabs", "FAbsOp"> {
}];
}
+def CIR_FloorOp : CIR_UnaryFPToFPBuiltinOp<"floor", "FloorOp"> {
+ let summary = "Computes the floating-point floor value";
+ let description = [{
+ `cir.floor` computes the floor of a floating-point operand and returns
+ a result of the same type.
+
+ Floating-point exceptions are ignored, and it does not set `errno`.
+ }];
+}
+
//===----------------------------------------------------------------------===//
// Variadic Operations
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index 7d4d13121d5e5..8fd3ffeb4e261 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -321,6 +321,16 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
case Builtin::BI__builtin_fabsf128:
return emitUnaryMaybeConstrainedFPBuiltin<cir::FAbsOp>(*this, *e);
+ case Builtin::BIfloor:
+ case Builtin::BIfloorf:
+ case Builtin::BIfloorl:
+ case Builtin::BI__builtin_floor:
+ case Builtin::BI__builtin_floorf:
+ case Builtin::BI__builtin_floorf16:
+ case Builtin::BI__builtin_floorl:
+ case Builtin::BI__builtin_floorf128:
+ return emitUnaryMaybeConstrainedFPBuiltin<cir::FloorOp>(*this, *e);
+
case Builtin::BI__assume:
case Builtin::BI__builtin_assume: {
if (e->getArg(0)->HasSideEffects(getContext()))
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 0c34d87734c3e..25314c3e6cacd 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -210,6 +210,14 @@ mlir::LogicalResult CIRToLLVMExp2OpLowering::matchAndRewrite(
return mlir::success();
}
+mlir::LogicalResult CIRToLLVMFloorOpLowering::matchAndRewrite(
+ cir::FloorOp op, OpAdaptor adaptor,
+ mlir::ConversionPatternRewriter &rewriter) const {
+ mlir::Type resTy = typeConverter->convertType(op.getType());
+ rewriter.replaceOpWithNewOp<mlir::LLVM::FFloorOp>(op, resTy, adaptor.getSrc());
+ return mlir::success();
+}
+
static mlir::Value getLLVMIntCast(mlir::ConversionPatternRewriter &rewriter,
mlir::Value llvmSrc, mlir::Type llvmDstIntTy,
bool isUnsigned, uint64_t cirSrcWidth,
diff --git a/clang/test/CIR/CodeGenBuiltins/builtins-floating-point.c b/clang/test/CIR/CodeGenBuiltins/builtins-floating-point.c
index a4307c57b04b6..010633551f57d 100644
--- a/clang/test/CIR/CodeGenBuiltins/builtins-floating-point.c
+++ b/clang/test/CIR/CodeGenBuiltins/builtins-floating-point.c
@@ -67,3 +67,24 @@ long double my_exp2l(long double f) {
// LLVM: %{{.*}} = call fp128 @llvm.exp2.f128(fp128 %{{.*}})
// OGCG: %{{.*}} = call fp128 @llvm.exp2.f128(fp128 %{{.*}})
}
+
+float floorf(float f) {
+ return __builtin_floorf(f);
+ // CIR: %{{.*}} = cir.floor %{{.*}} : !cir.float
+ // LLVM: %{{.*}} = call float @llvm.floor.f32(float %{{.*}})
+ // OGCG: %{{.*}} = call float @llvm.floor.f32(float %{{.*}})
+}
+
+double floor(double f) {
+ return __builtin_floor(f);
+ // CIR: %{{.*}} = cir.floor %{{.*}} : !cir.double
+ // LLVM: %{{.*}} = call double @llvm.floor.f64(double %{{.*}})
+ // OGCG: %{{.*}} = call double @llvm.floor.f64(double %{{.*}})
+}
+
+long double floorl(long double f) {
+ return __builtin_floorl(f);
+ // CIR: %{{.*}} = cir.floor %{{.*}} : !cir.long_double<!cir.f128>
+ // LLVM: %{{.*}} = call fp128 @llvm.floor.f128(fp128 %{{.*}})
+ // OGCG: %{{.*}} = call fp128 @llvm.floor.f128(fp128 %{{.*}})
+}
>From a9c954efa3763e065c5c2d21adbfe380f481d9d0 Mon Sep 17 00:00:00 2001
From: Letu Ren <fantasquex at gmail.com>
Date: Sat, 29 Nov 2025 03:37:04 +0800
Subject: [PATCH 2/2] fix style
---
clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 25314c3e6cacd..0a0c55123eda2 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -214,7 +214,8 @@ mlir::LogicalResult CIRToLLVMFloorOpLowering::matchAndRewrite(
cir::FloorOp op, OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const {
mlir::Type resTy = typeConverter->convertType(op.getType());
- rewriter.replaceOpWithNewOp<mlir::LLVM::FFloorOp>(op, resTy, adaptor.getSrc());
+ rewriter.replaceOpWithNewOp<mlir::LLVM::FFloorOp>(op, resTy,
+ adaptor.getSrc());
return mlir::success();
}
More information about the cfe-commits
mailing list