On Mon, 30 May 2016, Prathamesh Kulkarni wrote:
> The attached patch ICE's during bootstrap for x86_64, and is reproducible with
> following case with -m32 -O2:
>
> typedef long long type;
>
> type f(type x, type y)
> {
> type q = x / y;
> type r = x % y;
> return q + r;
> }
>
> The ICE happens because the test-case hits
> gcc_assert (unsignedp);
> in default_expand_divmod_libfunc ().
That's of course your function (and ICE).
> Surprisingly, optab_libfunc (sdivmod_optab, DImode) returns optab_libfunc
> with name "__divmoddi4" although __divmoddi4() is nowhere defined in
> libgcc for x86.
> (I verified that by forcing the patch to generate call to __divmoddi4,
> which results in undefined reference to __divmoddi4).
>
> This happens because in optabs.def we have:
> OPTAB_NL(sdivmod_optab, "divmod$a4", UNKNOWN, "divmod", '4', gen_int_libfunc)
>
> and gen_int_libfunc generates "__divmoddi4" on first call to optab_libfunc
> and sets optab_libfunc (sdivmod_optab, DImode) to "__divmoddi4".
> I wonder if we should remove gen_int_libfunc entry in optabs.def for
> sdivmod_optab ?
Hum, not sure - you might want to look at expand_divmod (though that
always just computes one part of the result in the end).
Joseph - do you know sth about why there's not a full set of divmod
libfuncs in libgcc?
Thanks,
Richard.