https://github.com/Fznamznon updated 
https://github.com/llvm/llvm-project/pull/234289

>From c3b78d1993f105071fdd5c2590648c315c9da2ec Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Wed, 21 Oct 2026 12:20:46 -0500
Subject: [PATCH 1/3] [CIR] Fix complex promoted division for double

While working on long double format attribute, I wanted to make sure CIR
passes pick up and use the info correctly, however the possible affected place
where we figure out long double type on the fly was always hardcoded
to use long_double<double> type. It should use targetinfo's long double instead,
taking mlong-double options into account.

Assisted-by: claude
---
 .../Dialect/Transforms/LoweringPrepare.cpp    | 18 +++++-
 .../complex-div-promoted-long-double.c        | 56 +++++++++++++++++++
 2 files changed, 71 insertions(+), 3 deletions(-)
 create mode 100644 clang/test/CIR/CodeGen/complex-div-promoted-long-double.c

diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp 
b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index 495109e0dc4350..511eed33bf3768 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -919,15 +919,27 @@ static mlir::Type 
higherPrecisionElementTypeForComplexArithmetic(
     const clang::LangOptions &langOpts, CIRBaseBuilderTy &builder,
     mlir::Type elementType) {
 
-  auto getHigherPrecisionFPType = [&context](mlir::Type type) -> mlir::Type {
+  auto getHigherPrecisionFPType = [&context,
+                                   &targetInfo](mlir::Type type) -> mlir::Type 
{
     if (mlir::isa<cir::FP16Type>(type))
       return cir::SingleType::get(&context);
 
     if (mlir::isa<cir::SingleType>(type) || mlir::isa<cir::BF16Type>(type))
       return cir::DoubleType::get(&context);
 
-    if (mlir::isa<cir::DoubleType>(type))
-      return cir::LongDoubleType::get(&context, type);
+    if (mlir::isa<cir::DoubleType>(type)) {
+      const llvm::fltSemantics &format = targetInfo.getLongDoubleFormat();
+      mlir::Type underlying;
+      if (&format == &llvm::APFloat::IEEEdouble())
+        underlying = cir::DoubleType::get(&context);
+      else if (&format == &llvm::APFloat::x87DoubleExtended())
+        underlying = cir::FP80Type::get(&context);
+      else if (&format == &llvm::APFloat::IEEEquad())
+        underlying = cir::FP128Type::get(&context);
+      else
+        llvm_unreachable("NYI: unsupported long double format");
+      return cir::LongDoubleType::get(&context, underlying);
+    }
 
     return type;
   };
diff --git a/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c 
b/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c
new file mode 100644
index 00000000000000..102351656cac61
--- /dev/null
+++ b/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c
@@ -0,0 +1,56 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -complex-range=promoted 
-fclangir -emit-llvm %s -o - | FileCheck %s --check-prefix=X87
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -complex-range=promoted 
-emit-llvm %s -o - | FileCheck %s --check-prefix=X87
+
+
+// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -complex-range=promoted 
-fclangir -emit-llvm %s -o - | FileCheck %s --check-prefixes=FP128
+// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -complex-range=promoted 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FP128
+
+// FIXME: -mlong-double* is currently ignored by lowermodule, enable the cases
+// when it isn't
+// RUN_disable: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-64 
-complex-range=promoted -fclangir -emit-llvm %s -o - | FileCheck %s 
--check-prefix=DBL
+// RUN_disable: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-64 
-complex-range=promoted -emit-llvm %s -o - | FileCheck %s --check-prefix=DBL
+
+// RUN_disable: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-128 
-complex-range=promoted -fclangir -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FP128
+// RUN_disable: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-128 
-complex-range=promoted -emit-llvm %s -o - | FileCheck %s --check-prefix=FP128
+
+_Complex double div(_Complex double a, _Complex double b) { return a / b; }
+
+// X87: [[AR:%[a-zA-Z0-9._]+]] = fpext double %{{.*}} to x86_fp80
+// X87: [[AI:%[a-zA-Z0-9._]+]] = fpext double %{{.*}} to x86_fp80
+// X87: [[BR:%[a-zA-Z0-9._]+]] = fpext double %{{.*}} to x86_fp80
+// X87: [[BI:%[a-zA-Z0-9._]+]] = fpext double %{{.*}} to x86_fp80
+// X87-DAG: [[ARBR:%[a-zA-Z0-9._]+]] = fmul x86_fp80 [[AR]], [[BR]]
+// X87-DAG: [[AIBI:%[a-zA-Z0-9._]+]] = fmul x86_fp80 [[AI]], [[BI]]
+// X87-DAG: [[BRBR:%[a-zA-Z0-9._]+]] = fmul x86_fp80 [[BR]], [[BR]]
+// X87-DAG: [[BIBI:%[a-zA-Z0-9._]+]] = fmul x86_fp80 [[BI]], [[BI]]
+// X87-DAG: [[NUMR:%[a-zA-Z0-9._]+]] = fadd x86_fp80 [[ARBR]], [[AIBI]]
+// X87-DAG: [[DEN:%[a-zA-Z0-9._]+]] = fadd x86_fp80 [[BRBR]], [[BIBI]]
+// X87-DAG: [[AIBR:%[a-zA-Z0-9._]+]] = fmul x86_fp80 [[AI]], [[BR]]
+// X87-DAG: [[ARBI:%[a-zA-Z0-9._]+]] = fmul x86_fp80 [[AR]], [[BI]]
+// X87-DAG: [[NUMI:%[a-zA-Z0-9._]+]] = fsub x86_fp80 [[AIBR]], [[ARBI]]
+// X87-DAG: [[RES_R:%[a-zA-Z0-9._]+]] = fdiv x86_fp80 [[NUMR]], [[DEN]]
+// X87-DAG: [[RES_I:%[a-zA-Z0-9._]+]] = fdiv x86_fp80 [[NUMI]], [[DEN]]
+// X87: fptrunc x86_fp80 [[RES_R]] to double
+// X87: fptrunc x86_fp80 [[RES_I]] to double
+// FP128: [[AR:%[a-zA-Z0-9._]+]] = fpext double %{{.*}} to fp128
+// FP128: [[AI:%[a-zA-Z0-9._]+]] = fpext double %{{.*}} to fp128
+// FP128: [[BR:%[a-zA-Z0-9._]+]] = fpext double %{{.*}} to fp128
+// FP128: [[BI:%[a-zA-Z0-9._]+]] = fpext double %{{.*}} to fp128
+// FP128-DAG: [[ARBR:%[a-zA-Z0-9._]+]] = fmul fp128 [[AR]], [[BR]]
+// FP128-DAG: [[AIBI:%[a-zA-Z0-9._]+]] = fmul fp128 [[AI]], [[BI]]
+// FP128-DAG: [[BRBR:%[a-zA-Z0-9._]+]] = fmul fp128 [[BR]], [[BR]]
+// FP128-DAG: [[BIBI:%[a-zA-Z0-9._]+]] = fmul fp128 [[BI]], [[BI]]
+// FP128-DAG: [[NUMR:%[a-zA-Z0-9._]+]] = fadd fp128 [[ARBR]], [[AIBI]]
+// FP128-DAG: [[DEN:%[a-zA-Z0-9._]+]] = fadd fp128 [[BRBR]], [[BIBI]]
+// FP128-DAG: [[AIBR:%[a-zA-Z0-9._]+]] = fmul fp128 [[AI]], [[BR]]
+// FP128-DAG: [[ARBI:%[a-zA-Z0-9._]+]] = fmul fp128 [[AR]], [[BI]]
+// FP128-DAG: [[NUMI:%[a-zA-Z0-9._]+]] = fsub fp128 [[AIBR]], [[ARBI]]
+// FP128-DAG: [[RES_R:%[a-zA-Z0-9._]+]] = fdiv fp128 [[NUMR]], [[DEN]]
+// FP128-DAG: [[RES_I:%[a-zA-Z0-9._]+]] = fdiv fp128 [[NUMI]], [[DEN]]
+// FP128: fptrunc fp128 [[RES_R]] to double
+// FP128: fptrunc fp128 [[RES_I]] to double
+// DBL-NOT: fpext
+// DBL-NOT: fptrunc
+// DBL: call double @llvm.fabs.f64(double
+// DBL: call double @llvm.fabs.f64(double
+// DBL: fdiv double

>From e90699b7972f326d44ad8b9b0b84775c3664037c Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Mon, 26 Oct 2026 04:05:49 -0500
Subject: [PATCH 2/3] Enable the test

---
 .../CIR/CodeGen/complex-div-promoted-long-double.c     | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c 
b/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c
index 102351656cac61..6febb4dbb17650 100644
--- a/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c
+++ b/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c
@@ -5,13 +5,11 @@
 // RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -complex-range=promoted 
-fclangir -emit-llvm %s -o - | FileCheck %s --check-prefixes=FP128
 // RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -complex-range=promoted 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FP128
 
-// FIXME: -mlong-double* is currently ignored by lowermodule, enable the cases
-// when it isn't
-// RUN_disable: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-64 
-complex-range=promoted -fclangir -emit-llvm %s -o - | FileCheck %s 
--check-prefix=DBL
-// RUN_disable: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-64 
-complex-range=promoted -emit-llvm %s -o - | FileCheck %s --check-prefix=DBL
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-64 
-complex-range=promoted -fclangir -emit-llvm %s -o - | FileCheck %s 
--check-prefix=DBL
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-64 
-complex-range=promoted -emit-llvm %s -o - | FileCheck %s --check-prefix=DBL
 
-// RUN_disable: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-128 
-complex-range=promoted -fclangir -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FP128
-// RUN_disable: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-128 
-complex-range=promoted -emit-llvm %s -o - | FileCheck %s --check-prefix=FP128
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-128 
-complex-range=promoted -fclangir -emit-llvm %s -o - | FileCheck %s 
--check-prefix=FP128
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -mlong-double-128 
-complex-range=promoted -emit-llvm %s -o - | FileCheck %s --check-prefix=FP128
 
 _Complex double div(_Complex double a, _Complex double b) { return a / b; }
 

>From 36c09ad7e1d8896d4c46c7f657dbb6a3aaf13870 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Mon, 26 Oct 2026 05:12:13 -0500
Subject: [PATCH 3/3] Remove empty line

---
 clang/test/CIR/CodeGen/complex-div-promoted-long-double.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c 
b/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c
index 6febb4dbb17650..fabc8b6328349c 100644
--- a/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c
+++ b/clang/test/CIR/CodeGen/complex-div-promoted-long-double.c
@@ -1,7 +1,6 @@
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -complex-range=promoted 
-fclangir -emit-llvm %s -o - | FileCheck %s --check-prefix=X87
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -complex-range=promoted 
-emit-llvm %s -o - | FileCheck %s --check-prefix=X87
 
-
 // RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -complex-range=promoted 
-fclangir -emit-llvm %s -o - | FileCheck %s --check-prefixes=FP128
 // RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -complex-range=promoted 
-emit-llvm %s -o - | FileCheck %s --check-prefix=FP128
 

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

Reply via email to