diff mbox series

Fix ICE in x86 DIVMOD libfunc expansion (PR target/88594)

Message ID 20190103230009.GW30353@tucnak
State New
Headers show
Series Fix ICE in x86 DIVMOD libfunc expansion (PR target/88594) | expand

Commit Message

Jakub Jelinek Jan. 3, 2019, 11 p.m. UTC
Hi!

The following testcase ICEs, because during DIVMOD discovery a is still not
known to be a constant (otherwise we wouldn't create a DIVMOD), but later on
before expansion it is replaced with 17 and ix86_expand_divmod_libfunc
calls emit_library_call_value with GET_MODE (op1) as the mode for the
argument, which is thus VOIDmode, while we want to say that even when the
argument is VOIDmode, the argument is TImode.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2019-01-03  Jakub Jelinek  <jakub@redhat.com>

	PR target/88594
	* config/i386/i386.c (ix86_expand_divmod_libfunc): Use mode instead
	of GET_MODE (opN) as modes of the libcall arguments.

	* gcc.dg/pr88594.c: New test.


	Jakub

Comments

Uros Bizjak Jan. 4, 2019, 7:21 a.m. UTC | #1
On Fri, Jan 4, 2019 at 12:00 AM Jakub Jelinek <jakub@redhat.com> wrote:
>
> Hi!
>
> The following testcase ICEs, because during DIVMOD discovery a is still not
> known to be a constant (otherwise we wouldn't create a DIVMOD), but later on
> before expansion it is replaced with 17 and ix86_expand_divmod_libfunc
> calls emit_library_call_value with GET_MODE (op1) as the mode for the
> argument, which is thus VOIDmode, while we want to say that even when the
> argument is VOIDmode, the argument is TImode.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?
>
> 2019-01-03  Jakub Jelinek  <jakub@redhat.com>
>
>         PR target/88594
>         * config/i386/i386.c (ix86_expand_divmod_libfunc): Use mode instead
>         of GET_MODE (opN) as modes of the libcall arguments.
>
>         * gcc.dg/pr88594.c: New test.

OK for trunk and release branches.

Thanks,
Uros.

> --- gcc/config/i386/i386.c.jj   2019-01-03 14:32:43.050093691 +0100
> +++ gcc/config/i386/i386.c      2019-01-03 20:15:11.351392235 +0100
> @@ -51002,9 +51002,7 @@ ix86_expand_divmod_libfunc (rtx libfunc,
>    rtx rem = assign_386_stack_local (mode, SLOT_TEMP);
>
>    rtx quot = emit_library_call_value (libfunc, NULL_RTX, LCT_NORMAL,
> -                                     mode,
> -                                     op0, GET_MODE (op0),
> -                                     op1, GET_MODE (op1),
> +                                     mode, op0, mode, op1, mode,
>                                       XEXP (rem, 0), Pmode);
>    *quot_p = quot;
>    *rem_p = rem;
> --- gcc/testsuite/gcc.dg/pr88594.c.jj   2019-01-03 20:29:58.177819386 +0100
> +++ gcc/testsuite/gcc.dg/pr88594.c      2019-01-03 20:29:34.209213935 +0100
> @@ -0,0 +1,16 @@
> +/* PR target/88594 */
> +/* { dg-do compile { target int128 } } */
> +/* { dg-options "-O2 -fno-tree-dominator-opts -fno-tree-forwprop -fno-tree-vrp" } */
> +
> +__int128
> +foo (__int128 x, __int128 *y)
> +{
> +  int a;
> +  __int128 z, r;
> +  for (a = 0; a < 17; ++a)
> +    ;
> +  z = x / a;
> +  r = x % a;
> +  *y = z;
> +  return r;
> +}
>
>         Jakub
diff mbox series

Patch

--- gcc/config/i386/i386.c.jj	2019-01-03 14:32:43.050093691 +0100
+++ gcc/config/i386/i386.c	2019-01-03 20:15:11.351392235 +0100
@@ -51002,9 +51002,7 @@  ix86_expand_divmod_libfunc (rtx libfunc,
   rtx rem = assign_386_stack_local (mode, SLOT_TEMP);
 
   rtx quot = emit_library_call_value (libfunc, NULL_RTX, LCT_NORMAL,
-				      mode,
-				      op0, GET_MODE (op0),
-				      op1, GET_MODE (op1),
+				      mode, op0, mode, op1, mode,
 				      XEXP (rem, 0), Pmode);
   *quot_p = quot;
   *rem_p = rem;
--- gcc/testsuite/gcc.dg/pr88594.c.jj	2019-01-03 20:29:58.177819386 +0100
+++ gcc/testsuite/gcc.dg/pr88594.c	2019-01-03 20:29:34.209213935 +0100
@@ -0,0 +1,16 @@ 
+/* PR target/88594 */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fno-tree-forwprop -fno-tree-vrp" } */
+
+__int128
+foo (__int128 x, __int128 *y)
+{
+  int a;
+  __int128 z, r;
+  for (a = 0; a < 17; ++a)
+    ;
+  z = x / a;
+  r = x % a;
+  *y = z;
+  return r;
+}