From f0a25eae56995c6dfd4db5d14b0c18ecabece995 Mon Sep 17 00:00:00 2001 From: Letu Ren 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(*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(*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(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 + // 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 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(op, resTy, adaptor.getSrc()); + rewriter.replaceOpWithNewOp(op, resTy, + adaptor.getSrc()); return mlir::success(); }