]> granicus.if.org Git - clang/commitdiff
Revert "Make FP_CONTRACT ON the default."
authorManuel Klimek <klimek@google.com>
Tue, 17 Nov 2015 15:40:10 +0000 (15:40 +0000)
committerManuel Klimek <klimek@google.com>
Tue, 17 Nov 2015 15:40:10 +0000 (15:40 +0000)
This reverts commit r253269.

This leads to assert / segfault triggering on the following reduced example:
float foo(float U, float base, float cell) { return (U = 2 * base) - cell; }

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@253337 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/LangOptions.def
lib/Frontend/CompilerInvocation.cpp
test/CodeGen/aarch64-neon-fma.c
test/CodeGen/aarch64-scalar-fma.c [deleted file]
test/CodeGen/fp-contract-pragma.cpp
test/Driver/clang_f_opts.c

index 8911d8052399df0c67b884afc72a0fd105628791..fdf7e49499b8266e2fb3c197cef4fe0ec3d9f015 100644 (file)
@@ -187,7 +187,7 @@ BENIGN_LANGOPT(DebuggerObjCLiteral , 1, 0, "debugger Objective-C literals and su
 BENIGN_LANGOPT(SpellChecking , 1, 1, "spell-checking")
 LANGOPT(SinglePrecisionConstants , 1, 0, "treating double-precision floating point constants as single precision constants")
 LANGOPT(FastRelaxedMath , 1, 0, "OpenCL fast relaxed math")
-LANGOPT(DefaultFPContract , 1, 1, "FP_CONTRACT")
+LANGOPT(DefaultFPContract , 1, 0, "FP_CONTRACT")
 LANGOPT(NoBitFieldTypeAlign , 1, 0, "bit-field type alignment")
 LANGOPT(HexagonQdsp6Compat , 1, 0, "hexagon-qdsp6 backward compatibility")
 LANGOPT(ObjCAutoRefCount , 1, 0, "Objective-C automated reference counting")
index 68f27ee4a3eccfc39357bc8b1c6436b0545a9f37..91917cf5100143cfe529ef9a888fac2cd51f8e98 100644 (file)
@@ -1336,6 +1336,7 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
     Opts.ZVector = 0;
     Opts.CXXOperatorNames = 1;
     Opts.LaxVectorConversions = 0;
+    Opts.DefaultFPContract = 1;
     Opts.NativeHalfType = 1;
   }
 
index 8126fb21da7361d2ed56f6a49bf894c2683d2510..ac808333365e756fecfc7aa8c1e47e33fccc0e69 100644 (file)
@@ -1,8 +1,5 @@
 // REQUIRES: aarch64-registered-target
-// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -S -O3 \
-// RUN:   -ffp-contract=off -o - %s | FileCheck %s
-// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -S -O3 \
-// RUN:   -o - %s | FileCheck -check-prefix=CHECK-FMA %s
+// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -S -O3 -o - %s | FileCheck %s
 
 // Test new aarch64 intrinsics and types
 
@@ -13,7 +10,8 @@ float32x2_t test_vmla_n_f32(float32x2_t a, float32x2_t b, float32_t c) {
   return vmla_n_f32(a, b, c);
   // CHECK: fmul {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
   // CHECK: fadd {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
-  // CHECK-FMA: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
+  // CHECK-FMA: dup {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
+  // CHECK-FMA: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
 }
 
 float32x4_t test_vmlaq_n_f32(float32x4_t a, float32x4_t b, float32_t c) {
@@ -21,7 +19,8 @@ float32x4_t test_vmlaq_n_f32(float32x4_t a, float32x4_t b, float32_t c) {
   return vmlaq_n_f32(a, b, c);
   // CHECK: fmul {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
   // CHECK: fadd {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
-  // CHECK-FMA: fmla {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
+  // CHECK-FMA: dup {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
+  // CHECK-FMA: fmla {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
 }
 
 float64x2_t test_vmlaq_n_f64(float64x2_t a, float64x2_t b, float64_t c) {
@@ -29,7 +28,8 @@ float64x2_t test_vmlaq_n_f64(float64x2_t a, float64x2_t b, float64_t c) {
   return vmlaq_n_f64(a, b, c);
   // CHECK: fmul {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
   // CHECK: fadd {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
-  // CHECK-FMA: fmla {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
+  // CHECK-FMA: dup {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
+  // CHECK-FMA: fmla {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
 }
 
 float32x4_t test_vmlsq_n_f32(float32x4_t a, float32x4_t b, float32_t c) {
@@ -37,7 +37,8 @@ float32x4_t test_vmlsq_n_f32(float32x4_t a, float32x4_t b, float32_t c) {
   return vmlsq_n_f32(a, b, c);
   // CHECK: fmul {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
   // CHECK: fsub {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
-  // CHECK-FMA: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
+  // CHECK-FMA: dup {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
+  // CHECK-FMA: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
 }
 
 float32x2_t test_vmls_n_f32(float32x2_t a, float32x2_t b, float32_t c) {
@@ -45,7 +46,8 @@ float32x2_t test_vmls_n_f32(float32x2_t a, float32x2_t b, float32_t c) {
   return vmls_n_f32(a, b, c);
   // CHECK: fmul {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
   // CHECK: fsub {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
-  // CHECK-FMA: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
+  // CHECK-FMA: dup {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
+  // CHECK-FMA: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
 }
 
 float64x2_t test_vmlsq_n_f64(float64x2_t a, float64x2_t b, float64_t c) {
@@ -53,7 +55,8 @@ float64x2_t test_vmlsq_n_f64(float64x2_t a, float64x2_t b, float64_t c) {
   return vmlsq_n_f64(a, b, c);
   // CHECK: fmul {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
   // CHECK: fsub {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
-  // CHECK-FMA: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
+  // CHECK-FMA: dup {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
+  // CHECK-FMA: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
 }
 
 float32x2_t test_vmla_lane_f32_0(float32x2_t a, float32x2_t b, float32x2_t v) {
diff --git a/test/CodeGen/aarch64-scalar-fma.c b/test/CodeGen/aarch64-scalar-fma.c
deleted file mode 100644 (file)
index ee4bd50..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-// RUN: %clang_cc1 -triple=aarch64-unknown -Os -ffp-contract=fast -S -o - %s | FileCheck -check-prefix=CHECK-FAST -check-prefix=CHECK-ALL %s
-// RUN: %clang_cc1 -triple=aarch64-unknown -Os -ffp-contract=on -S -o - %s | FileCheck -check-prefix=CHECK-ON -check-prefix=CHECK-ALL %s
-// RUN: %clang_cc1 -triple=aarch64-unknown -Os -ffp-contract=off -S -o - %s | FileCheck -check-prefix=CHECK-OFF -check-prefix=CHECK-ALL %s
-// RUN: %clang_cc1 -triple=aarch64-unknown -Os -S -o - %s | FileCheck -check-prefix=CHECK-ON -check-prefix=CHECK-ALL %s
-// REQUIRES: aarch64-registered-target
-
-float test1(float x, float y, float z) {
-  return x*y + z;
-  // CHECK-ALL-LABEL: test1:
-  // CHECK-FAST: fmadd
-  // CHECK-ON: fmadd
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fadd
-}
-
-double test2(double x, double y, double z) {
-  z -= x*y;
-  return z;
-  // CHECK-ALL-LABEL: test2:
-  // CHECK-FAST: fmsub
-  // CHECK-ON: fmsub
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fsub
-}
-
-float test3(float x, float y, float z) {
-  float tmp = x*y;
-  return tmp + z;
-  // CHECK-ALL-LABEL: test3:
-  // CHECK-FAST: fmadd
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fadd
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fadd
-}
-
-double test4(double x, double y, double z) {
-  double tmp = x*y;
-  return tmp - z;
-  // CHECK-ALL-LABEL: test4:
-  // CHECK-FAST: fnmsub
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fsub
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fsub
-}
-
-#pragma STDC FP_CONTRACT ON
-
-float test5(float x, float y, float z) {
-  return x*y + z;
-  // CHECK-ALL-LABEL: test5:
-  // CHECK-FAST: fmadd
-  // CHECK-ON: fmadd
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fadd
-}
-
-double test6(double x, double y, double z) {
-  z -= x*y;
-  return z;
-  // CHECK-ALL-LABEL: test6:
-  // CHECK-FAST: fmsub
-  // CHECK-ON: fmsub
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fsub
-}
-
-float test7(float x, float y, float z) {
-  float tmp = x*y;
-  return tmp + z;
-  // CHECK-ALL-LABEL: test7:
-  // CHECK-FAST: fmadd
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fadd
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fadd
-}
-
-double test8(double x, double y, double z) {
-  double tmp = x*y;
-  return tmp - z;
-  // CHECK-ALL-LABEL: test8:
-  // CHECK-FAST: fnmsub
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fsub
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fsub
-}
-
-#pragma STDC FP_CONTRACT OFF
-
-float test9(float x, float y, float z) {
-  return x*y + z;
-  // CHECK-ALL-LABEL: test9:
-  // CHECK-FAST: fmadd
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fadd
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fadd
-}
-
-double test10(double x, double y, double z) {
-  z -= x*y;
-  return z;
-  // CHECK-ALL-LABEL: test10:
-  // CHECK-FAST: fmsub
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fsub
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fsub
-}
-
-float test11(float x, float y, float z) {
-  float tmp = x*y;
-  return tmp + z;
-  // CHECK-ALL-LABEL: test11:
-  // CHECK-FAST: fmadd
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fadd
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fadd
-}
-
-double test12(double x, double y, double z) {
-  double tmp = x*y;
-  return tmp - z;
-  // CHECK-ALL-LABEL: test12:
-  // CHECK-FAST: fnmsub
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fsub
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fsub
-}
-
-#pragma STDC FP_CONTRACT DEFAULT
-
-float test17(float x, float y, float z) {
-  return x*y + z;
-  // CHECK-ALL-LABEL: test17:
-  // CHECK-FAST: fmadd
-  // CHECK-ON: fmadd
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fadd
-}
-
-double test18(double x, double y, double z) {
-  z -= x*y;
-  return z;
-  // CHECK-ALL-LABEL: test18:
-  // CHECK-FAST: fmsub
-  // CHECK-ON: fmsub
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fsub
-}
-
-float test19(float x, float y, float z) {
-  float tmp = x*y;
-  return tmp + z;
-  // CHECK-ALL-LABEL: test19:
-  // CHECK-FAST: fmadd
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fadd
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fadd
-}
-
-double test20(double x, double y, double z) {
-  double tmp = x*y;
-  return tmp - z;
-  // CHECK-ALL-LABEL: test20:
-  // CHECK-FAST: fnmsub
-  // CHECK-ON: fmul
-  // CHECK-ON-NEXT: fsub
-  // CHECK-OFF: fmul
-  // CHECK-OFF-NEXT: fsub
-}
index b47bce08869e4cf4cc158c9ff062fd4fb28b7967..b4e24b9e6824ea1e7aaf460cfe1be0beaff99e72 100644 (file)
@@ -1,7 +1,5 @@
 // RUN: %clang_cc1 -O3 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s
 
-#pragma STDC FP_CONTRACT OFF
-
 // Is FP_CONTRACT is honored in a simple case?
 float fp_contract_1(float a, float b, float c) {
 // CHECK: _Z13fp_contract_1fff
index 48e7e0cafed2c1fcd3b2311d183aec1d7aa097a8..25a1930bdd6d5e0c5c1bf437f1edc96c509bd7c5 100644 (file)
 // RUN: %clang -### -S -ffp-contract=fast %s 2>&1 | FileCheck -check-prefix=FP-CONTRACT-FAST-CHECK %s
 // RUN: %clang -### -S -ffast-math %s 2>&1 | FileCheck -check-prefix=FP-CONTRACT-FAST-CHECK %s
 // RUN: %clang -### -S -ffp-contract=off %s 2>&1 | FileCheck -check-prefix=FP-CONTRACT-OFF-CHECK %s
-// RUN: %clang -### -S -ffp-contract=on %s 2>&1 | FileCheck -check-prefix=FP-CONTRACT-ON-CHECK %s
 // FP-CONTRACT-FAST-CHECK: -ffp-contract=fast
 // FP-CONTRACT-OFF-CHECK: -ffp-contract=off
-// FP-CONTRACT-ON-CHECK: -ffp-contract=on
 
 // RUN: %clang -### -S -funroll-loops %s 2>&1 | FileCheck -check-prefix=CHECK-UNROLL-LOOPS %s
 // RUN: %clang -### -S -fno-unroll-loops %s 2>&1 | FileCheck -check-prefix=CHECK-NO-UNROLL-LOOPS %s