* [PATCH] Fix ICE with invalid lround etc. builtin calls (PR middle-end/89663)
@ 2019-03-11 22:33 Jakub Jelinek
2019-03-12 6:20 ` Richard Biener
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2019-03-11 22:33 UTC (permalink / raw)
To: Richard Biener, Jeff Law; +Cc: gcc-patches
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?
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
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Fix ICE with invalid lround etc. builtin calls (PR middle-end/89663)
2019-03-11 22:33 [PATCH] Fix ICE with invalid lround etc. builtin calls (PR middle-end/89663) Jakub Jelinek
@ 2019-03-12 6:20 ` Richard Biener
0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2019-03-12 6:20 UTC (permalink / raw)
To: Jakub Jelinek, Jeff Law; +Cc: gcc-patches
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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-03-12 6:13 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-11 22:33 [PATCH] Fix ICE with invalid lround etc. builtin calls (PR middle-end/89663) Jakub Jelinek
2019-03-12 6:20 ` Richard Biener
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).