]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
convert.c (convert_to_real): Guard those unsafe math function convertions with flag_u...
authorCong Hou <congh@google.com>
Thu, 24 Oct 2013 18:10:38 +0000 (14:10 -0400)
committerCong Hou <congh@gcc.gnu.org>
Thu, 24 Oct 2013 18:10:38 +0000 (14:10 -0400)
2013-10-24  Cong Hou  <congh@google.com>

    * convert.c (convert_to_real): Guard those unsafe math function
      convertions with flag_unsafe_math_optimizations.  Handle sqrt()
      specially.

2013-10-24  Cong Hou  <congh@google.com>

    * gcc.c-torture/execute/20030125-1.c: Update.

From-SVN: r204028

gcc/ChangeLog
gcc/convert.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20030125-1.c

index eb381b4daa8dbb663d7a9813e2707b54e265a4ea..4731f1c77e94dddee43746cadc44d62c89efd91f 100644 (file)
@@ -1,3 +1,9 @@
+2013-10-24  Cong Hou  <congh@google.com>
+
+       * convert.c (convert_to_real): Guard those unsafe math function
+       convertions with flag_unsafe_math_optimizations.  Handle sqrt()
+       specially. 
+
 2013-10-24  Markus Trippelsdorf  <markus@trippelsdorf.de>
        
        PR ipa/58712
index b07f0efe82078a7622c18b6785d2b482c4d05d80..a2f2a334dbf85ed0335f834c76ae1990ac3df740 100644 (file)
@@ -135,16 +135,19 @@ convert_to_real (tree type, tree expr)
          CASE_MATHFN (COS)
          CASE_MATHFN (ERF)
          CASE_MATHFN (ERFC)
-         CASE_MATHFN (FABS)
          CASE_MATHFN (LOG)
          CASE_MATHFN (LOG10)
          CASE_MATHFN (LOG2)
          CASE_MATHFN (LOG1P)
-         CASE_MATHFN (LOGB)
          CASE_MATHFN (SIN)
-         CASE_MATHFN (SQRT)
          CASE_MATHFN (TAN)
          CASE_MATHFN (TANH)
+           /* The above functions are not safe to do this conversion.  */
+           if (!flag_unsafe_math_optimizations)
+             break;
+         CASE_MATHFN (SQRT)
+         CASE_MATHFN (FABS)
+         CASE_MATHFN (LOGB)
 #undef CASE_MATHFN
            {
              tree arg0 = strip_float_extensions (CALL_EXPR_ARG (expr, 0));
@@ -155,13 +158,44 @@ convert_to_real (tree type, tree expr)
              if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type))
                newtype = TREE_TYPE (arg0);
 
+             /* We consider to convert
+
+                    (T1) sqrtT2 ((T2) exprT3)
+                to
+                    (T1) sqrtT4 ((T4) exprT3)
+
+                 , where T1 is TYPE, T2 is ITYPE, T3 is TREE_TYPE (ARG0),
+                and T4 is NEWTYPE.  All those types are of floating point types.
+                T4 (NEWTYPE) should be narrower than T2 (ITYPE). This conversion
+                is safe only if P1 >= P2*2+2, where P1 and P2 are precisions of
+                T2 and T4.  See the following URL for a reference:
+                http://stackoverflow.com/questions/9235456/determining-
+                 floating-point-square-root
+                */
+             if ((fcode == BUILT_IN_SQRT || fcode == BUILT_IN_SQRTL)
+                 && !flag_unsafe_math_optimizations)
+               {
+                 /* The following conversion is unsafe even the precision condition
+                    below is satisfied:
+
+                    (float) sqrtl ((long double) double_val) -> (float) sqrt (double_val)
+                   */
+                 if (TYPE_MODE (type) != TYPE_MODE (newtype))
+                   break;
+
+                 int p1 = REAL_MODE_FORMAT (TYPE_MODE (itype))->p;
+                 int p2 = REAL_MODE_FORMAT (TYPE_MODE (newtype))->p;
+                 if (p1 < p2 * 2 + 2)
+                   break;
+               }
+
              /* Be careful about integer to fp conversions.
                 These may overflow still.  */
              if (FLOAT_TYPE_P (TREE_TYPE (arg0))
                  && TYPE_PRECISION (newtype) < TYPE_PRECISION (itype)
                  && (TYPE_MODE (newtype) == TYPE_MODE (double_type_node)
                      || TYPE_MODE (newtype) == TYPE_MODE (float_type_node)))
-               {
+               {
                  tree fn = mathfn_built_in (newtype, fcode);
 
                  if (fn)
index d2c2cd645240d8626c8f4d08958f9da17b16d7cd..02a436a5c36d1053fbe3ec786df7bd167adffe32 100644 (file)
@@ -1,3 +1,7 @@
+2013-10-24  Cong Hou  <congh@google.com>
+
+       * gcc.c-torture/execute/20030125-1.c: Update.
+
 2013-08-24  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/44646
index 8eb9a4211a8649106f53a5626300848664e1e996..28cfbd10b4ca1c3d69ce2e921fb453cd27f421f8 100644 (file)
@@ -44,11 +44,11 @@ __attribute__ ((noinline))
 double
 sin(double a)
 {
-       abort ();
+       return a;
 }
 __attribute__ ((noinline))
 float
 sinf(float a)
 {
-       return a;
+       abort ();
 }