diff options
author | Qiu Chaofan <qiucofan@cn.ibm.com> | 2022-11-18 10:28:24 +0800 |
---|---|---|
committer | Qiu Chaofan <qiucofan@cn.ibm.com> | 2022-11-18 10:34:41 +0800 |
commit | cab9c02bd97f520cb8a01a9197505438581f7de8 (patch) | |
tree | 2dd3bfe14e7fb48ea4f30a89bdd1fad8a80d5ff1 /clang | |
parent | a65d5309d5b73527efcbdec49a3ba9bba0fd873d (diff) | |
download | llvm-cab9c02bd97f520cb8a01a9197505438581f7de8.zip llvm-cab9c02bd97f520cb8a01a9197505438581f7de8.tar.gz llvm-cab9c02bd97f520cb8a01a9197505438581f7de8.tar.bz2 |
[Clang] Fix behavior of -ffp-model option when overriden
-ffp-model=strict -ffp-model=fast will still enable strict exception
handling behavior, therefore clang still emits constrained FP operations
in IR.
-ffp-model=fast -ffp-model=strict emits two warnings: one for strict
overriding fast, the other for strict overriding strict, which is
confusing.
Reviewed By: zahiraam
Differential Revision: https://reviews.llvm.org/D137618
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Driver/ToolChains/Clang.cpp | 11 | ||||
-rw-r--r-- | clang/test/CodeGen/ffp-model.c | 4 | ||||
-rw-r--r-- | clang/test/Driver/fp-model.c | 18 |
3 files changed, 27 insertions, 6 deletions
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 46f642b..deb4464 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3041,6 +3041,7 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, SignedZeros = false; TrappingMath = false; RoundingFPMath = false; + FPExceptionBehavior = ""; // If fast-math is set then set the fp-contract mode to fast. FPContract = "fast"; SeenUnsafeMathModeOption = true; @@ -3081,10 +3082,12 @@ static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, else { StrictFPModel = false; FPModel = ""; - D.Diag(clang::diag::warn_drv_overriding_flag_option) - << "-ffp-model=strict" << - ((A->getNumValues() == 0) ? A->getSpelling() - : Args.MakeArgString(A->getSpelling() + A->getValue())); + auto RHS = (A->getNumValues() == 0) + ? A->getSpelling() + : Args.MakeArgString(A->getSpelling() + A->getValue()); + if (RHS != "-ffp-model=strict") + D.Diag(clang::diag::warn_drv_overriding_flag_option) + << "-ffp-model=strict" << RHS; } } diff --git a/clang/test/CodeGen/ffp-model.c b/clang/test/CodeGen/ffp-model.c index e7f911f..57fa0ef 100644 --- a/clang/test/CodeGen/ffp-model.c +++ b/clang/test/CodeGen/ffp-model.c @@ -36,9 +36,9 @@ float mymuladd(float x, float y, float z) { // CHECK-STRICT-FAST: load float, ptr // CHECK-STRICT-FAST: load float, ptr - // CHECK-STRICT-FAST: call fast float @llvm.experimental.constrained.fmul.f32(float {{.*}}, float {{.*}}, {{.*}}) + // CHECK-STRICT-FAST: fmul fast float {{.*}}, {{.*}} // CHECK-STRICT-FAST: load float, ptr - // CHECK-STRICT-FAST: call fast float @llvm.experimental.constrained.fadd.f32(float {{.*}}, float {{.*}}, {{.*}} + // CHECK-STRICT-FAST: fadd fast float {{.*}}, {{.*}} // CHECK-FAST1: load float, ptr // CHECK-FAST1: load float, ptr diff --git a/clang/test/Driver/fp-model.c b/clang/test/Driver/fp-model.c index 77419551..4253cf7a 100644 --- a/clang/test/Driver/fp-model.c +++ b/clang/test/Driver/fp-model.c @@ -66,6 +66,17 @@ // RUN: | FileCheck --check-prefix=WARN10 %s // WARN10: warning: overriding '-ffp-model=strict' option with '-fdenormal-fp-math=preserve-sign,preserve-sign' [-Woverriding-t-option] +// RUN: %clang -### -ffp-model=fast -ffp-model=strict -c %s 2>&1 | FileCheck \ +// RUN: --check-prefix=WARN11 %s +// WARN11: warning: overriding '-ffp-model=fast' option with '-ffp-model=strict' [-Woverriding-t-option] +// WARN11-NOT: warning: overriding '-ffp-model=strict' option with '-ffp-model=strict' [-Woverriding-t-option] + +// RUN: %clang -### -Ofast -ffp-model=strict -c %s 2>&1 | FileCheck \ +// RUN: --check-prefix=WARN12 %s +// RUN: %clang -### -ffast-math -ffp-model=strict -c %s 2>&1 | FileCheck \ +// RUN: --check-prefix=WARN12 %s +// WARN12-NOT: warning: overriding '-ffp-model=strict' option with '-ffp-model=strict' [-Woverriding-t-option] + // RUN: %clang -### -c %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-NOROUND %s // CHECK-NOROUND: "-cc1" @@ -107,6 +118,13 @@ // CHECK-FPM-STRICT: "-frounding-math" // CHECK-FPM-STRICT: "-ffp-exception-behavior=strict" +// RUN: %clang -### -nostdinc -ffp-model=strict -ffp-model=fast -c %s 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NO-EXCEPT %s +// RUN: %clang -### -nostdinc -ffp-model=strict -ffast-math -c %s 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NO-EXCEPT %s +// RUN: %clang -### -nostdinc -ffp-model=strict -Ofast -c %s 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NO-EXCEPT %s +// CHECK-NO-EXCEPT-NOT: "-ffp-exception-behavior=strict" // RUN: %clang -### -nostdinc -ffp-exception-behavior=strict -c %s 2>&1 \ // RUN: | FileCheck --check-prefix=CHECK-FEB-STRICT %s |