On Fri, Jan 4, 2019 at 12:00 AM Jakub Jelinek <ja...@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 <ja...@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