https://github.com/AmrDeveloper updated 
https://github.com/llvm/llvm-project/pull/157496

>From e823abc753890bde1b2d39bb3ec66a5349819c62 Mon Sep 17 00:00:00 2001
From: AmrDeveloper <[email protected]>
Date: Sun, 7 Sep 2025 22:30:39 +0200
Subject: [PATCH 1/2] [CIR] Upstream FPToFPBuiltin ATanOp

---
 clang/include/clang/CIR/Dialect/IR/CIROps.td  | 10 +++++++
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp       |  2 ++
 .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 10 +++++++
 .../CIR/Lowering/DirectToLLVM/LowerToLLVM.h   |  9 +++++++
 clang/test/CIR/CodeGen/builtins-elementwise.c | 27 +++++++++++++++++++
 5 files changed, 58 insertions(+)

diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td 
b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index f3715bdb5ef42..b3c435cc59140 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -3837,6 +3837,16 @@ def CIR_ASinOp : CIR_UnaryFPToFPBuiltinOp<"asin", 
"ASinOp"> {
   }];
 }
 
+def CIR_ATanOp : CIR_UnaryFPToFPBuiltinOp<"atan", "ATanOp"> {
+  let summary = "Computes the floating-point arcus tangent value";
+  let description = [{
+    `cir.atan` computes the arcus tangent 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 2150a810e269d..8892e62accb74 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -413,6 +413,8 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl 
&gd, unsigned builtinID,
     return emitUnaryFPBuiltin<cir::ACosOp>(*this, *e);
   case Builtin::BI__builtin_elementwise_asin:
     return emitUnaryFPBuiltin<cir::ASinOp>(*this, *e);
+  case Builtin::BI__builtin_elementwise_atan:
+    return emitUnaryFPBuiltin<cir::ATanOp>(*this, *e);
   }
 
   // If this is an alias for a lib function (e.g. __builtin_sin), emit
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp 
b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 816987ba48145..708121964e80b 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -1103,6 +1103,15 @@ mlir::LogicalResult 
CIRToLLVMBaseClassAddrOpLowering::matchAndRewrite(
   return mlir::success();
 }
 
+mlir::LogicalResult CIRToLLVMATanOpLowering::matchAndRewrite(
+    cir::ATanOp op, OpAdaptor adaptor,
+    mlir::ConversionPatternRewriter &rewriter) const {
+  mlir::Type resTy = typeConverter->convertType(op.getType());
+  rewriter.replaceOpWithNewOp<mlir::LLVM::ATanOp>(op, resTy,
+                                                  adaptor.getOperands()[0]);
+  return mlir::success();
+}
+
 mlir::LogicalResult CIRToLLVMAllocaOpLowering::matchAndRewrite(
     cir::AllocaOp op, OpAdaptor adaptor,
     mlir::ConversionPatternRewriter &rewriter) const {
@@ -2468,6 +2477,7 @@ void ConvertCIRToLLVMPass::runOnOperation() {
                CIRToLLVMAssumeSepStorageOpLowering,
                CIRToLLVMAtomicCmpXchgLowering,
                CIRToLLVMBaseClassAddrOpLowering,
+               CIRToLLVMATanOpLowering,
                CIRToLLVMBinOpLowering,
                CIRToLLVMBitClrsbOpLowering,
                CIRToLLVMBitClzOpLowering,
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h 
b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
index 34b121c88f677..dd1dd0aaec7d8 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.h
@@ -755,6 +755,15 @@ class CIRToLLVMASinOpLowering : public 
mlir::OpConversionPattern<cir::ASinOp> {
                   mlir::ConversionPatternRewriter &) const override;
 };
 
+class CIRToLLVMATanOpLowering : public mlir::OpConversionPattern<cir::ATanOp> {
+public:
+  using mlir::OpConversionPattern<cir::ATanOp>::OpConversionPattern;
+
+  mlir::LogicalResult
+  matchAndRewrite(cir::ATanOp op, OpAdaptor,
+                  mlir::ConversionPatternRewriter &) const override;
+};
+
 class CIRToLLVMInlineAsmOpLowering
     : public mlir::OpConversionPattern<cir::InlineAsmOp> {
   mlir::DataLayout const &dataLayout;
diff --git a/clang/test/CIR/CodeGen/builtins-elementwise.c 
b/clang/test/CIR/CodeGen/builtins-elementwise.c
index 431558d7e9697..e3460f06d166a 100644
--- a/clang/test/CIR/CodeGen/builtins-elementwise.c
+++ b/clang/test/CIR/CodeGen/builtins-elementwise.c
@@ -62,3 +62,30 @@ void test_builtin_elementwise_asin(float f, double d, 
vfloat4 vf4,
   // OGCG: %{{.*}} = call <4 x double> @llvm.asin.v4f64(<4 x double> %{{.*}})
   vd4 = __builtin_elementwise_asin(vd4);
 }
+
+void test_builtin_elementwise_atan(float f, double d, vfloat4 vf4,
+  vdouble4  vd4) {
+  // CIR-LABEL: test_builtin_elementwise_atan
+  // LLVM-LABEL: test_builtin_elementwise_atan
+  // OGCG-LABEL: test_builtin_elementwise_atan
+
+  // CIR: %{{.*}} = cir.atan %{{.*}} : !cir.float
+  // LLVM: %{{.*}} = call float @llvm.atan.f32(float %{{.*}})
+  // OGCG: %{{.*}} = call float @llvm.atan.f32(float %{{.*}})
+  f = __builtin_elementwise_atan(f);
+
+  // CIR: %{{.*}} = cir.atan %{{.*}} : !cir.double
+  // LLVM: %{{.*}} = call double @llvm.atan.f64(double %{{.*}})
+  // OGCG: %{{.*}} = call double @llvm.atan.f64(double %{{.*}})
+  d = __builtin_elementwise_atan(d);
+
+  // CIR: %{{.*}} = cir.atan %{{.*}} : !cir.vector<4 x !cir.float>
+  // LLVM: %{{.*}} = call <4 x float> @llvm.atan.v4f32(<4 x float> %{{.*}})
+  // OGCG: %{{.*}} = call <4 x float> @llvm.atan.v4f32(<4 x float> %{{.*}})
+  vf4 = __builtin_elementwise_atan(vf4);
+
+  // CIR: %{{.*}} = cir.atan %{{.*}} : !cir.vector<4 x !cir.double>
+  // LLVM: %{{.*}} = call <4 x double> @llvm.atan.v4f64(<4 x double> %{{.*}})
+  // OGCG: %{{.*}} = call <4 x double> @llvm.atan.v4f64(<4 x double> %{{.*}})
+  vd4 = __builtin_elementwise_atan(vd4);
+}

>From 26fac40dce22b7e56635baad96eafd2b0a863fc8 Mon Sep 17 00:00:00 2001
From: AmrDeveloper <[email protected]>
Date: Tue, 9 Sep 2025 18:38:39 +0200
Subject: [PATCH 2/2] Address code review comments

---
 clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp 
b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 708121964e80b..d9097b0b9e03d 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -1107,8 +1107,7 @@ mlir::LogicalResult 
CIRToLLVMATanOpLowering::matchAndRewrite(
     cir::ATanOp op, OpAdaptor adaptor,
     mlir::ConversionPatternRewriter &rewriter) const {
   mlir::Type resTy = typeConverter->convertType(op.getType());
-  rewriter.replaceOpWithNewOp<mlir::LLVM::ATanOp>(op, resTy,
-                                                  adaptor.getOperands()[0]);
+  rewriter.replaceOpWithNewOp<mlir::LLVM::ATanOp>(op, resTy, adaptor.getSrc());
   return mlir::success();
 }
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to