[PATCH] Fix ICE with invalid lround etc. builtin calls (PR middle-end/89663)

Richard Biener rguenther@suse.de
Tue Mar 12 06:20:00 GMT 2019


On March 11, 2019 11:32:38 PM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>All other expand_builtin* calls in builtins.c return NULL or return
>const0_rtx or return without ICEing when arg validation fails, but
>these
>two and as the testcases show, it can happen on invalid (at runtime)
>testcases.  Fixed thusly, bootstrapped/regtested on x86_64-linux and
>i686-linux, ok for trunk?

OK. 

Richard. 

>2019-03-11  Jakub Jelinek  <jakub@redhat.com>
>
>	PR middle-end/89663
>	* builtins.c (expand_builtin_int_roundingfn,
>	expand_builtin_int_roundingfn_2): Return NULL_RTX instead of
>	gcc_unreachable if validate_arglist fails.
>
>	* gcc.c-torture/compile/pr89663-1.c: New test.
>	* gcc.c-torture/compile/pr89663-2.c: New test.
>
>--- gcc/builtins.c.jj	2019-03-08 11:45:27.547465385 +0100
>+++ gcc/builtins.c	2019-03-11 20:33:43.990536154 +0100
>@@ -2692,7 +2692,7 @@ expand_builtin_int_roundingfn (tree exp,
>   tree arg;
> 
>   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
>-    gcc_unreachable ();
>+    return NULL_RTX;
> 
>   arg = CALL_EXPR_ARG (exp, 0);
> 
>@@ -2828,7 +2828,7 @@ expand_builtin_int_roundingfn_2 (tree ex
>   enum built_in_function fallback_fn = BUILT_IN_NONE;
> 
>   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
>-     gcc_unreachable ();
>+    return NULL_RTX;
> 
>   arg = CALL_EXPR_ARG (exp, 0);
> 
>--- gcc/testsuite/gcc.c-torture/compile/pr89663-1.c.jj	2019-03-11
>20:52:42.205972807 +0100
>+++ gcc/testsuite/gcc.c-torture/compile/pr89663-1.c	2019-03-11
>20:52:11.839469897 +0100
>@@ -0,0 +1,81 @@
>+/* PR middle-end/89663 */
>+
>+int irint ();
>+long lrint ();
>+long long llrint ();
>+int iround ();
>+long lround ();
>+long long llround ();
>+int iceil ();
>+long lceil ();
>+long long llceil ();
>+int ifloor ();
>+long lfloor ();
>+long long llfloor ();
>+int irintf ();
>+long lrintf ();
>+long long llrintf ();
>+int iroundf ();
>+long lroundf ();
>+long long llroundf ();
>+int iceilf ();
>+long lceilf ();
>+long long llceilf ();
>+int ifloorf ();
>+long lfloorf ();
>+long long llfloorf ();
>+int irintl ();
>+long lrintl ();
>+long long llrintl ();
>+int iroundl ();
>+long lroundl ();
>+long long llroundl ();
>+int iceill ();
>+long lceill ();
>+long long llceill ();
>+int ifloorl ();
>+long lfloorl ();
>+long long llfloorl ();
>+
>+void
>+foo (long long *p)
>+{
>+  int n = 0;
>+#define T(f) p[n++] = f (1);
>+  T (irint)
>+  T (lrint)
>+  T (llrint)
>+  T (iround)
>+  T (lround)
>+  T (llround)
>+  T (iceil)
>+  T (lceil)
>+  T (llceil)
>+  T (ifloor)
>+  T (lfloor)
>+  T (llfloor)
>+  T (irintf)
>+  T (lrintf)
>+  T (llrintf)
>+  T (iroundf)
>+  T (lroundf)
>+  T (llroundf)
>+  T (iceilf)
>+  T (lceilf)
>+  T (llceilf)
>+  T (ifloorf)
>+  T (lfloorf)
>+  T (llfloorf)
>+  T (irintl)
>+  T (lrintl)
>+  T (llrintl)
>+  T (iroundl)
>+  T (lroundl)
>+  T (llroundl)
>+  T (iceill)
>+  T (lceill)
>+  T (llceill)
>+  T (ifloorl)
>+  T (lfloorl)
>+  T (llfloorl)
>+}
>--- gcc/testsuite/gcc.c-torture/compile/pr89663-2.c.jj	2019-03-11
>20:52:45.262922766 +0100
>+++ gcc/testsuite/gcc.c-torture/compile/pr89663-2.c	2019-03-11
>20:51:26.556211180 +0100
>@@ -0,0 +1,82 @@
>+/* PR middle-end/89663 */
>+
>+int irint (double);
>+long lrint (double);
>+long long llrint (double);
>+int iround (double);
>+long lround (double);
>+long long llround (double);
>+int iceil (double);
>+long lceil (double);
>+long long llceil (double);
>+int ifloor (double);
>+long lfloor (double);
>+long long llfloor (double);
>+int irintf (float);
>+long lrintf (float);
>+long long llrintf (float);
>+int iroundf (float);
>+long lroundf (float);
>+long long llroundf (float);
>+int iceilf (float);
>+long lceilf (float);
>+long long llceilf (float);
>+int ifloorf (float);
>+long lfloorf (float);
>+long long llfloorf (float);
>+int irintl (long double);
>+long lrintl (long double);
>+long long llrintl (long double);
>+int iroundl (long double);
>+long lroundl (long double);
>+long long llroundl (long double);
>+int iceill (long double);
>+long lceill (long double);
>+long long llceill (long double);
>+int ifloorl (long double);
>+long lfloorl (long double);
>+long long llfloorl (long double);
>+
>+void
>+foo (long long *p)
>+{
>+  int (*fn) (int);
>+  int n = 0;
>+#define T(f) fn = (int (*) (int)) f; p[n++] = fn (1);
>+  T (irint)
>+  T (lrint)
>+  T (llrint)
>+  T (iround)
>+  T (lround)
>+  T (llround)
>+  T (iceil)
>+  T (lceil)
>+  T (llceil)
>+  T (ifloor)
>+  T (lfloor)
>+  T (llfloor)
>+  T (irintf)
>+  T (lrintf)
>+  T (llrintf)
>+  T (iroundf)
>+  T (lroundf)
>+  T (llroundf)
>+  T (iceilf)
>+  T (lceilf)
>+  T (llceilf)
>+  T (ifloorf)
>+  T (lfloorf)
>+  T (llfloorf)
>+  T (irintl)
>+  T (lrintl)
>+  T (llrintl)
>+  T (iroundl)
>+  T (lroundl)
>+  T (llroundl)
>+  T (iceill)
>+  T (lceill)
>+  T (llceill)
>+  T (ifloorl)
>+  T (lfloorl)
>+  T (llfloorl)
>+}
>
>	Jakub



More information about the Gcc-patches mailing list