]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/33135 ([SH] -ffinite-math-only should not be on by default)
authorOleg Endo <olegendo@gcc.gnu.org>
Wed, 18 Jul 2012 07:49:50 +0000 (07:49 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Wed, 18 Jul 2012 07:49:50 +0000 (07:49 +0000)
PR target/33135
* config/sh/sh.opt (mieee): Use Var instead of Mask.  Correct
description.
* config/sh/sh.c (sh_option_override): Do not change
flag_finite_math_only.  Set TARGET_IEEE to complement of
flag_finite_math_only.
* doc/invoke.texi (SH options): Add mno-ieee.  Correct description
of mieee and mno-ieee behavior.

PR target/33135
* gcc.target/sh/pr33135-1.c: New.
* gcc.target/sh/pr33135-2.c: New.
* gcc.target/sh/pr33135-3.c: New.
* gcc.target/sh/pr33135-4.c: New.

From-SVN: r189602

gcc/ChangeLog
gcc/config/sh/sh.c
gcc/config/sh/sh.opt
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/sh/pr33135-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/sh/pr33135-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/sh/pr33135-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/sh/pr33135-4.c [new file with mode: 0644]

index c080dfe10925b5f20344c50f589389e09f172e79..4507857878372b82e600c45ca1f6c91d4e99717b 100644 (file)
@@ -1,3 +1,14 @@
+2012-07-18  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/33135
+       * config/sh/sh.opt (mieee): Use Var instead of Mask.  Correct
+       description.
+       * config/sh/sh.c (sh_option_override): Do not change 
+       flag_finite_math_only.  Set TARGET_IEEE to complement of
+       flag_finite_math_only.
+       * doc/invoke.texi (SH options): Add mno-ieee.  Correct description
+       of mieee and mno-ieee behavior.
+
 2012-07-18  Steven Bosscher  <steven@gcc.gnu.org>
 
        * graphite-poly.c (print_pbb_body): Fixup dump_bb call.
index 72043a06f8decb685f122daf37c63ec781830052..df39858e66b664979d50fe64eb11e5d91e581d9a 100644 (file)
@@ -599,11 +599,6 @@ sh_option_override (void)
   SUBTARGET_OVERRIDE_OPTIONS;
   if (optimize > 1 && !optimize_size)
     target_flags |= MASK_SAVE_ALL_TARGET_REGS;
-  if (flag_finite_math_only == 2)
-    flag_finite_math_only
-      = !flag_signaling_nans && TARGET_SH2E && ! TARGET_IEEE;
-  if (TARGET_SH2E && !flag_finite_math_only)
-    target_flags |= MASK_IEEE;
   sh_cpu = PROCESSOR_SH1;
   assembler_dialect = 0;
   if (TARGET_SH2)
@@ -889,6 +884,11 @@ sh_option_override (void)
                 && flag_unsafe_math_optimizations
                 && flag_finite_math_only;
 
+  /* If the -mieee option was not explicitly set by the user, turn it on
+     unless -ffinite-math-only was specified.  See also PR 33135.  */
+  if (! global_options_set.x_TARGET_IEEE)
+    TARGET_IEEE = ! flag_finite_math_only;
+
   if (sh_fixed_range_str)
     sh_fix_range (sh_fixed_range_str);
 
index 76e66e288995f24dcbd02fabf1b4a35cc8572261..fabf9b5b93268de234afa1f7ee5364cf2c3cc4b7 100644 (file)
@@ -266,8 +266,8 @@ Target Report RejectNegative Mask(HITACHI)
 Follow Renesas (formerly Hitachi) / SuperH calling conventions
 
 mieee
-Target Report Mask(IEEE)
-Increase the IEEE compliance for floating-point code
+Target Var(TARGET_IEEE)
+Increase the IEEE compliance for floating-point comparisons
 
 mindexed-addressing
 Target Report Mask(ALLOW_INDEXED_ADDRESS) Condition(SUPPORT_ANY_SH5_32MEDIA)
index ca313bea9f198606a8ed4b62c9a7e7ce02304c24..1207f85127cf75f5c415634a84620535066f2ae7 100644 (file)
@@ -881,8 +881,8 @@ See RS/6000 and PowerPC Options.
 -m5-compact  -m5-compact-nofpu @gol
 -mb  -ml  -mdalign  -mrelax @gol
 -mbigtable -mfmovd -mhitachi -mrenesas -mno-renesas -mnomacsave @gol
--mieee  -mbitops  -misize  -minline-ic_invalidate -mpadstruct  -mspace @gol
--mprefergot  -musermode -multcost=@var{number} -mdiv=@var{strategy} @gol
+-mieee -mno-ieee -mbitops  -misize  -minline-ic_invalidate -mpadstruct @gol
+-mspace -mprefergot  -musermode -multcost=@var{number} -mdiv=@var{strategy} @gol
 -mdivsi3_libfunc=@var{name} -mfixed-range=@var{register-range} @gol
 -mindexed-addressing -mgettrcost=@var{number} -mpt-fixed @gol
 -maccumulate-outgoing-args -minvalid-symbols -msoft-atomic -mhard-atomic @gol
@@ -18099,13 +18099,15 @@ Mark the @code{MAC} register as call-clobbered, even if
 @option{-mhitachi} is given.
 
 @item -mieee
+@item -mno-ieee
 @opindex mieee
-Increase IEEE compliance of floating-point code.
-At the moment, this is equivalent to @option{-fno-finite-math-only}.
-When generating 16-bit SH opcodes, getting IEEE-conforming results for
-comparisons of NANs / infinities incurs extra overhead in every
-floating-point comparison, therefore the default is set to
-@option{-ffinite-math-only}.
+@opindex mnoieee
+Control the IEEE compliance of floating-point comparisons, which affects the
+handling of cases where the result of a comparison is unordered.  By default
+@option{-mieee} is implicitly enabled.  If @option{-ffinite-math-only} is
+enabled @option{-mno-ieee} is implicitly set, which results in faster
+floating-point greater-equal and less-equal comparisons.  The implcit settings
+can be overridden by specifying either @option{-mieee} or @option{-mno-ieee}.
 
 @item -minline-ic_invalidate
 @opindex minline-ic_invalidate
index ac9f86b1ae94cf5b32d6b507be0d492ca1e45443..4c95a402bd969a93e27edc67a86f741176c703ec 100644 (file)
@@ -1,3 +1,11 @@
+2012-07-18  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/33135
+       * gcc.target/sh/pr33135-1.c: New.
+       * gcc.target/sh/pr33135-2.c: New.
+       * gcc.target/sh/pr33135-3.c: New.
+       * gcc.target/sh/pr33135-4.c: New.
+
 2012-07-17  Jason Merrill  <jason@redhat.com>
 
        PR c++/53995
diff --git a/gcc/testsuite/gcc.target/sh/pr33135-1.c b/gcc/testsuite/gcc.target/sh/pr33135-1.c
new file mode 100644 (file)
index 0000000..6c28e8c
--- /dev/null
@@ -0,0 +1,32 @@
+/* Check that fcmp/eq and fcmp/gt instructions are generated by default
+   (implicit -mieee).  */
+/* { dg-do compile { target "sh*-*-*" } } */
+/* { dg-options "-O1" } */
+/* { dg-skip-if "" { "sh*-*-*" } { "-m1" "-m2" "-m3" "-m4al" "*nofpu" "-m4-340*" "-m4-400*" "-m4-500*" "-m5*" } { "" } }  */
+/* { dg-final { scan-assembler-times "fcmp/eq" 4 } } */
+/* { dg-final { scan-assembler-times "fcmp/gt" 4 } } */
+
+int
+test_00 (float a, float b)
+{
+  return a <= b;
+}
+
+int
+test_01 (float a, float b)
+{
+  return a >= b;
+}
+
+int
+test_02 (double a, double b)
+{
+  return a <= b;
+}
+
+int
+test_03 (double a, double b)
+{
+  return a >= b;
+}
+
diff --git a/gcc/testsuite/gcc.target/sh/pr33135-2.c b/gcc/testsuite/gcc.target/sh/pr33135-2.c
new file mode 100644 (file)
index 0000000..37c4035
--- /dev/null
@@ -0,0 +1,32 @@
+/* Check that only the fcmp/gt instruction is generated when specifying
+   -ffinite-math-only (implicit -mno-ieee).  */
+/* { dg-do compile { target "sh*-*-*" } } */
+/* { dg-options "-O1 -ffinite-math-only" } */
+/* { dg-skip-if "" { "sh*-*-*" } { "-m1" "-m2" "-m3" "-m4al" "*nofpu" "-m4-340*" "-m4-400*" "-m4-500*" "-m5*" } { "" } }  */
+/* { dg-final { scan-assembler-not "fcmp/eq" } } */
+/* { dg-final { scan-assembler-times "fcmp/gt" 4 } } */
+
+int
+test_00 (float a, float b)
+{
+  return a <= b;
+}
+
+int
+test_01 (float a, float b)
+{
+  return a >= b;
+}
+
+int
+test_02 (double a, double b)
+{
+  return a <= b;
+}
+
+int
+test_03 (double a, double b)
+{
+  return a >= b;
+}
+
diff --git a/gcc/testsuite/gcc.target/sh/pr33135-3.c b/gcc/testsuite/gcc.target/sh/pr33135-3.c
new file mode 100644 (file)
index 0000000..cbda922
--- /dev/null
@@ -0,0 +1,32 @@
+/* Check that fcmp/eq and fcmp/gt instructions are generated when specifying
+   -ffinite-math-only and -mieee.  */
+/* { dg-do compile { target "sh*-*-*" } } */
+/* { dg-options "-O1 -ffinite-math-only -mieee" } */
+/* { dg-skip-if "" { "sh*-*-*" } { "-m1" "-m2" "-m3" "-m4al" "*nofpu" "-m4-340*" "-m4-400*" "-m4-500*" "-m5*" } { "" } }  */
+/* { dg-final { scan-assembler-times "fcmp/eq" 4 } } */
+/* { dg-final { scan-assembler-times "fcmp/gt" 4 } } */
+
+int
+test_00 (float a, float b)
+{
+  return a <= b;
+}
+
+int
+test_01 (float a, float b)
+{
+  return a >= b;
+}
+
+int
+test_02 (double a, double b)
+{
+  return a <= b;
+}
+
+int
+test_03 (double a, double b)
+{
+  return a >= b;
+}
+
diff --git a/gcc/testsuite/gcc.target/sh/pr33135-4.c b/gcc/testsuite/gcc.target/sh/pr33135-4.c
new file mode 100644 (file)
index 0000000..3e4aa51
--- /dev/null
@@ -0,0 +1,32 @@
+/* Check that only the fcmp/gt instruction is generated when specifying
+   -fno-finite-math-only and -mno-ieee.  */
+/* { dg-do compile { target "sh*-*-*" } } */
+/* { dg-options "-O1 -fno-finite-math-only -mno-ieee" } */
+/* { dg-skip-if "" { "sh*-*-*" } { "-m1" "-m2" "-m3" "-m4al" "*nofpu" "-m4-340*" "-m4-400*" "-m4-500*" "-m5*" } { "" } }  */
+/* { dg-final { scan-assembler-not "fcmp/eq" } } */
+/* { dg-final { scan-assembler-times "fcmp/gt" 4 } } */
+
+int
+test_00 (float a, float b)
+{
+  return a <= b;
+}
+
+int
+test_01 (float a, float b)
+{
+  return a >= b;
+}
+
+int
+test_02 (double a, double b)
+{
+  return a <= b;
+}
+
+int
+test_03 (double a, double b)
+{
+  return a >= b;
+}
+