On March 11, 2019 11:32:38 PM GMT+01:00, Jakub Jelinek <ja...@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 <ja...@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