From 48058e5f353d90a37ef17aff2647a89bb749705c Mon Sep 17 00:00:00 2001 From: Amr Hesham Date: Sun, 2 Nov 2025 13:23:20 +0100 Subject: [PATCH] [CIR] Upstream Builtin ExpOp --- clang/include/clang/CIR/Dialect/IR/CIROps.td | 10 +++++++++ clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp | 11 ++++++++++ .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 8 +++++++ .../CIR/CodeGen/builtins-floating-point.c | 21 +++++++++++++++++++ 4 files changed, 50 insertions(+) diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index dc56db1bbd4ea..6f9a69e697cc3 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -4191,6 +4191,16 @@ def CIR_CosOp : CIR_UnaryFPToFPBuiltinOp<"cos", "CosOp"> { }]; } +def CIR_ExpOp : CIR_UnaryFPToFPBuiltinOp<"exp", "ExpOp"> { + let summary = "Computes the floating-point base-e exponential value"; + let description = [{ + `cir.exp` computes the exponential of a floating-point operand and returns + a result of the same type. + + Floating-point exceptions are ignored, and it does not set `errno`. + }]; +} + def CIR_FAbsOp : CIR_UnaryFPToFPBuiltinOp<"fabs", "FAbsOp"> { let summary = "Computes the floating-point absolute value"; let description = [{ diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index d9b9e3b877b50..0803910f2e83a 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -222,6 +222,17 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID, assert(!cir::MissingFeatures::fastMathFlags()); return emitUnaryMaybeConstrainedFPBuiltin(*this, *e); + case Builtin::BIexp: + case Builtin::BIexpf: + case Builtin::BIexpl: + case Builtin::BI__builtin_exp: + case Builtin::BI__builtin_expf: + case Builtin::BI__builtin_expf16: + case Builtin::BI__builtin_expl: + case Builtin::BI__builtin_expf128: + assert(!cir::MissingFeatures::fastMathFlags()); + return emitUnaryMaybeConstrainedFPBuiltin(*this, *e); + case Builtin::BIfabs: case Builtin::BIfabsf: case Builtin::BIfabsl: diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index d94108294a9a3..ba967a43ce59a 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -194,6 +194,14 @@ mlir::LogicalResult CIRToLLVMCosOpLowering::matchAndRewrite( return mlir::success(); } +mlir::LogicalResult CIRToLLVMExpOpLowering::matchAndRewrite( + cir::ExpOp 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/CodeGen/builtins-floating-point.c b/clang/test/CIR/CodeGen/builtins-floating-point.c index 8bdc43c59dc6f..1b7de650662c7 100644 --- a/clang/test/CIR/CodeGen/builtins-floating-point.c +++ b/clang/test/CIR/CodeGen/builtins-floating-point.c @@ -25,3 +25,24 @@ float ceil(float f) { // LLVM: %{{.*}} = call float @llvm.ceil.f32(float %{{.*}}) // OGCG: %{{.*}} = call float @llvm.ceil.f32(float %{{.*}}) } + +float expf(float f) { + return __builtin_expf(f); + // CIR: %{{.*}} = cir.exp {{.*}} : !cir.float + // LLVM: %{{.*}} = call float @llvm.exp.f32(float %{{.*}}) + // OGCG: %{{.*}} = call float @llvm.exp.f32(float %{{.*}}) +} + +double exp(double f) { + return __builtin_exp(f); + // CIR: %{{.*}} = cir.exp {{.*}} : !cir.double + // LLVM: %{{.*}} = call double @llvm.exp.f64(double %{{.*}}) + // OGCG: %{{.*}} = call double @llvm.exp.f64(double %{{.*}}) +} + +long double expl(long double f) { + return __builtin_expl(f); + // CIR: %{{.*}} = cir.exp {{.*}} : !cir.long_double + // LLVM: %{{.*}} = call fp128 @llvm.exp.f128(fp128 %{{.*}}) + // OGCG: %{{.*}} = call fp128 @llvm.exp.f128(fp128 %{{.*}}) +}