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/2] [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/2] 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; } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
