llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Zahira Ammarguellat (zahiraam) <details> <summary>Changes</summary> This patch fixes a bug in Smith's algorithm (thanks to @<!-- -->andykaylor who detected it) and makes sure that last option in command line rules. --- Full diff: https://github.com/llvm/llvm-project/pull/78330.diff 4 Files Affected: - (modified) clang/lib/CodeGen/CGExprComplex.cpp (+6-2) - (modified) clang/lib/Driver/ToolChains/Clang.cpp (+10-9) - (modified) clang/test/CodeGen/cx-complex-range.c (+16) - (modified) clang/test/Driver/range.c (+7) ``````````diff diff --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp index e532794b71bdb4a..6fbd8f19eeb50a4 100644 --- a/clang/lib/CodeGen/CGExprComplex.cpp +++ b/clang/lib/CodeGen/CGExprComplex.cpp @@ -936,7 +936,7 @@ ComplexPairTy ComplexExprEmitter::EmitRangeReductionDiv(llvm::Value *LHSr, llvm::Value *RC = Builder.CreateFMul(CdD, RHSr); // rc llvm::Value *DpRC = Builder.CreateFAdd(RHSi, RC); // tmp=d+rc - llvm::Value *T7 = Builder.CreateFMul(LHSr, RC); // ar + llvm::Value *T7 = Builder.CreateFMul(LHSr, CdD); // ar llvm::Value *T8 = Builder.CreateFAdd(T7, LHSi); // ar+b llvm::Value *DSTFr = Builder.CreateFDiv(T8, DpRC); // (ar+b)/tmp @@ -978,7 +978,11 @@ ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) { return EmitRangeReductionDiv(LHSr, LHSi, RHSr, RHSi); else if (Op.FPFeatures.getComplexRange() == LangOptions::CX_Limited) return EmitAlgebraicDiv(LHSr, LHSi, RHSr, RHSi); - else if (!CGF.getLangOpts().FastMath) { + else if (!CGF.getLangOpts().FastMath || + // '-ffast-math' is used in the command line but followed by an + // '-fno-cx-limited-range'. + (CGF.getLangOpts().FastMath && + Op.FPFeatures.getComplexRange() == LangOptions::CX_Full)) { LHSi = OrigLHSi; // If we have a complex operand on the RHS and FastMath is not allowed, we // delegate to a libcall to handle all of the complexities and minimize diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 997ec2d491d02c8..7e25347677e23e8 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2765,6 +2765,7 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, StringRef Float16ExcessPrecision = ""; StringRef BFloat16ExcessPrecision = ""; LangOptions::ComplexRangeKind Range = LangOptions::ComplexRangeKind::CX_Full; + std::string ComplexRangeStr = ""; if (const Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { CmdArgs.push_back("-mlimit-float-precision"); @@ -2780,24 +2781,24 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, case options::OPT_fcx_limited_range: { EmitComplexRangeDiag(D, Range, LangOptions::ComplexRangeKind::CX_Limited); Range = LangOptions::ComplexRangeKind::CX_Limited; - std::string ComplexRangeStr = RenderComplexRangeOption("limited"); - if (!ComplexRangeStr.empty()) - CmdArgs.push_back(Args.MakeArgString(ComplexRangeStr)); + ComplexRangeStr = RenderComplexRangeOption("limited"); break; } case options::OPT_fno_cx_limited_range: + EmitComplexRangeDiag(D, Range, LangOptions::ComplexRangeKind::CX_Full); Range = LangOptions::ComplexRangeKind::CX_Full; + ComplexRangeStr = RenderComplexRangeOption("full"); break; case options::OPT_fcx_fortran_rules: { EmitComplexRangeDiag(D, Range, LangOptions::ComplexRangeKind::CX_Fortran); Range = LangOptions::ComplexRangeKind::CX_Fortran; - std::string ComplexRangeStr = RenderComplexRangeOption("fortran"); - if (!ComplexRangeStr.empty()) - CmdArgs.push_back(Args.MakeArgString(ComplexRangeStr)); + ComplexRangeStr = RenderComplexRangeOption("fortran"); break; } case options::OPT_fno_cx_fortran_rules: + EmitComplexRangeDiag(D, Range, LangOptions::ComplexRangeKind::CX_Full); Range = LangOptions::ComplexRangeKind::CX_Full; + ComplexRangeStr = RenderComplexRangeOption("full"); break; case options::OPT_ffp_model_EQ: { // If -ffp-model= is seen, reset to fno-fast-math @@ -3068,9 +3069,7 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, SeenUnsafeMathModeOption = true; // ffast-math enables fortran rules for complex multiplication and // division. - std::string ComplexRangeStr = RenderComplexRangeOption("limited"); - if (!ComplexRangeStr.empty()) - CmdArgs.push_back(Args.MakeArgString(ComplexRangeStr)); + ComplexRangeStr = RenderComplexRangeOption("limited"); break; } case options::OPT_fno_fast_math: @@ -3227,6 +3226,8 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, options::OPT_fstrict_float_cast_overflow, false)) CmdArgs.push_back("-fno-strict-float-cast-overflow"); + if (!ComplexRangeStr.empty()) + CmdArgs.push_back(Args.MakeArgString(ComplexRangeStr)); if (Args.hasArg(options::OPT_fcx_limited_range)) CmdArgs.push_back("-fcx-limited-range"); if (Args.hasArg(options::OPT_fcx_fortran_rules)) diff --git a/clang/test/CodeGen/cx-complex-range.c b/clang/test/CodeGen/cx-complex-range.c index 8368fa611335cca..2d8507c710f2021 100644 --- a/clang/test/CodeGen/cx-complex-range.c +++ b/clang/test/CodeGen/cx-complex-range.c @@ -15,9 +15,25 @@ // RUN: -ffast-math -complex-range=limited -emit-llvm -o - %s \ // RUN: | FileCheck %s --check-prefix=LMTD-FAST +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu \ +// RUN: -ffast-math -complex-range=full -emit-llvm -o - %s \ +// RUN: | FileCheck %s --check-prefix=FULL + // RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \ // RUN: -fno-cx-fortran-rules -o - | FileCheck %s --check-prefix=FULL +// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \ +// RUN: -fcx-limited-range -fno-cx-limited-range -o - \ +// RUN: | FileCheck %s --check-prefix=FULL + +// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \ +// RUN: -fno-cx-limited-range -fcx-limited-range -o - \ +// RUN: | FileCheck %s --check-prefix=FULL + +// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown \ +// RUN: -fno-cx-fortran-rules -fcx-fortran-rules -o - \ +// RUN: | FileCheck %s --check-prefix=FULL + _Complex float div(_Complex float a, _Complex float b) { // LABEL: define {{.*}} @div( // FULL: call {{.*}} @__divsc3 diff --git a/clang/test/Driver/range.c b/clang/test/Driver/range.c index 8d456a997d6967e..045d9c7d3d802ae 100644 --- a/clang/test/Driver/range.c +++ b/clang/test/Driver/range.c @@ -6,6 +6,9 @@ // RUN: %clang -### -target x86_64 -fno-cx-limited-range -c %s 2>&1 \ // RUN: | FileCheck %s +// RUN: %clang -### -target x86_64 -fcx-limited-range -fno-cx-limited-range \ +// RUN: -c %s 2>&1 | FileCheck --check-prefix=FULL %s + // RUN: %clang -### -target x86_64 -fcx-fortran-rules -c %s 2>&1 \ // RUN: | FileCheck --check-prefix=FRTRN %s @@ -29,7 +32,11 @@ // RUN: %clang -### -target x86_64 -fcx-limited-range -ffast-math -c %s 2>&1 \ // RUN: | FileCheck --check-prefix=LMTD %s +// RUN: %clang -### -target x86_64 -ffast-math -fno-cx-limited-range -c %s 2>&1 \ +// RUN: | FileCheck --check-prefix=FULL %s + // LMTD: -complex-range=limited +// FULL: -complex-range=full // LMTD-NOT: -complex-range=fortran // CHECK-NOT: -complex-range=limited // FRTRN: -complex-range=fortran `````````` </details> https://github.com/llvm/llvm-project/pull/78330 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits