re PR c/89520 (ICE tree check: accessed operand 4 of call_expr with 3 operands in...
authorJakub Jelinek <jakub@redhat.com>
Thu, 28 Feb 2019 07:16:38 +0000 (08:16 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 28 Feb 2019 07:16:38 +0000 (08:16 +0100)
PR c/89520
* convert.c (convert_to_real_1, convert_to_integer_1): Punt for
builtins if they don't have a single scalar floating point argument.
Formatting fixes.

* gcc.dg/pr89520-1.c: New test.
* gcc.dg/pr89520-2.c: New test.

From-SVN: r269273

gcc/ChangeLog
gcc/convert.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr89520-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr89520-2.c [new file with mode: 0644]

index d7e81db4a12c10e42a815f5abe5c05658d5eb167..f9b71975e1084e5d615711a5f5e6cca3001d22af 100644 (file)
@@ -1,3 +1,10 @@
+2019-02-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/89520
+       * convert.c (convert_to_real_1, convert_to_integer_1): Punt for
+       builtins if they don't have a single scalar floating point argument.
+       Formatting fixes.
+
 2019-02-27  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        PR rtl-optimization/89490
index 1a3353c870768a33fe22480ec97c7d3e0c504075..32d475524d793ca66d3bab51db4a46e6878694b9 100644 (file)
@@ -216,12 +216,15 @@ convert_to_real_1 (tree type, tree expr, bool fold_p)
          CASE_MATHFN (FABS)
          CASE_MATHFN (LOGB)
 #undef CASE_MATHFN
+           if (call_expr_nargs (expr) != 1
+               || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (expr, 0))))
+             break;
            {
              tree arg0 = strip_float_extensions (CALL_EXPR_ARG (expr, 0));
              tree newtype = type;
 
-             /* We have (outertype)sqrt((innertype)x).  Choose the wider mode from
-                the both as the safe type for operation.  */
+             /* We have (outertype)sqrt((innertype)x).  Choose the wider mode
+                from the both as the safe type for operation.  */
              if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type))
                newtype = TREE_TYPE (arg0);
 
@@ -618,7 +621,8 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
        CASE_FLT_FN (BUILT_IN_ROUND):
        CASE_FLT_FN_FLOATN_NX (BUILT_IN_ROUND):
          /* Only convert in ISO C99 mode and with -fno-math-errno.  */
-         if (!targetm.libc_has_function (function_c99_misc) || flag_errno_math)
+         if (!targetm.libc_has_function (function_c99_misc)
+             || flag_errno_math)
            break;
          if (outprec < TYPE_PRECISION (integer_type_node)
              || (outprec == TYPE_PRECISION (integer_type_node)
@@ -641,7 +645,8 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
        CASE_FLT_FN (BUILT_IN_RINT):
        CASE_FLT_FN_FLOATN_NX (BUILT_IN_RINT):
          /* Only convert in ISO C99 mode and with -fno-math-errno.  */
-         if (!targetm.libc_has_function (function_c99_misc) || flag_errno_math)
+         if (!targetm.libc_has_function (function_c99_misc)
+             || flag_errno_math)
            break;
          if (outprec < TYPE_PRECISION (integer_type_node)
              || (outprec == TYPE_PRECISION (integer_type_node)
@@ -657,14 +662,20 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
 
        CASE_FLT_FN (BUILT_IN_TRUNC):
        CASE_FLT_FN_FLOATN_NX (BUILT_IN_TRUNC):
-         return convert_to_integer_1 (type, CALL_EXPR_ARG (s_expr, 0), dofold);
+         if (call_expr_nargs (s_expr) != 1
+             || !SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (s_expr, 0))))
+           break;
+         return convert_to_integer_1 (type, CALL_EXPR_ARG (s_expr, 0),
+                                      dofold);
 
        default:
          break;
        }
 
-      if (fn)
-        {
+      if (fn
+         && call_expr_nargs (s_expr) == 1
+         && SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (s_expr, 0))))
+       {
          tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0));
          return convert_to_integer_1 (type, newexpr, dofold);
        }
@@ -694,7 +705,9 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
          break;
        }
 
-      if (fn)
+      if (fn
+         && call_expr_nargs (s_expr) == 1
+         && SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (s_expr, 0))))
         {
          tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0));
          return convert_to_integer_1 (type, newexpr, dofold);
index 0b126baf7b26a230fc03cc03d2e506a9050d8c6b..21642dec1c1f86641e64af0518e01d246bc599d8 100644 (file)
@@ -1,3 +1,9 @@
+2019-02-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/89520
+       * gcc.dg/pr89520-1.c: New test.
+       * gcc.dg/pr89520-2.c: New test.
+
 2019-02-27  Marek Polacek  <polacek@redhat.com>
 
        PR c++/88857 - ICE with value-initialization of argument in template.
diff --git a/gcc/testsuite/gcc.dg/pr89520-1.c b/gcc/testsuite/gcc.dg/pr89520-1.c
new file mode 100644 (file)
index 0000000..128e835
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR c/89520 */
+/* { dg-do compile } */
+/* { dg-options "-Ofast -w" } */
+
+#define A(name) __typeof (__builtin_##name (0)) name (); long name##1 () { return name (); }
+#define B(name) A(name) A(name##f) A(name##l)
+B (ceil)
+B (floor)
+B (round)
+B (trunc)
+B (nearbyint)
+B (rint)
+B (logb)
diff --git a/gcc/testsuite/gcc.dg/pr89520-2.c b/gcc/testsuite/gcc.dg/pr89520-2.c
new file mode 100644 (file)
index 0000000..8edafa7
--- /dev/null
@@ -0,0 +1,42 @@
+/* PR c/89520 */
+/* { dg-do compile } */
+/* { dg-options "-Ofast -w" } */
+
+#define A(name) __typeof (__builtin_##name (0)) name (); \
+  float name##1 () { return name (); } \
+  double name##2 () { return name (); }
+#define B(name) A(name) A(name##l)
+B (cosh)
+B (exp)
+B (exp10)
+B (exp2)
+B (expm1)
+B (gamma)
+B (j0)
+B (j1)
+B (lgamma)
+B (pow10)
+B (sinh)
+B (tgamma)
+B (y0)
+B (y1)
+B (acos)
+B (acosh)
+B (asin)
+B (asinh)
+B (atan)
+B (atanh)
+B (cbrt)
+B (cos)
+B (erf)
+B (erfc)
+B (log)
+B (log10)
+B (log2)
+B (log1p)
+B (sin)
+B (tan)
+B (tanh)
+B (sqrt)
+B (fabs)
+B (logb)