2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-24 14:50:37 +08:00
Jakub Jelinek e34153b0e2 expansion: Fix up infinite recursion due to double-word modulo optimization
Jeff has reported that my earlier patch broke rl78-elf, e.g. with
unsigned short foo (unsigned short x) { return x % 7; }
when compiled with -O2 -mg14.  The problem is that rl78 is a BITS_PER_WORD
== 8 target which doesn't have 8-bit modulo or divmod optab, but has instead
16-bit divmod, so my patch attempted to optimize it, then called
expand_divmod to do 8-bit modulo and that in turn tried to do 16-bit modulo
again.

The following patch fixes it in two ways.
One is to not perform the optimization when we have {u,s}divmod_optab
handler for the double-word mode, in that case it is IMHO better to just
do whatever we used to do before.  This alone should fix the infinite
recursion.  But I'd be afraid some other target might have similar problem
and might not have a divmod pattern, but only say a library call.
So the patch also introduces a methods argument to expand_divmod such that
normally we allow everything that was allowed before (using libcalls and
widening), but when called from these expand_doubleword*mod routines we
restrict it to no widening and no libcalls.

2020-12-02  Jakub Jelinek  <jakub@redhat.com>

	* expmed.h (expand_divmod): Only declare if GCC_OPTABS_H is defined.
	Add enum optabs_method argument defaulted to OPTAB_LIB_WIDEN.
	* expmed.c: Include expmed.h after optabs.h.
	(expand_divmod): Add methods argument, if it is not OPTAB_{,LIB_}WIDEN,
	don't choose a wider mode, and pass it to other calls instead of
	hardcoded OPTAB_LIB_WIDEN.  Avoid emitting libcalls if not
	OPTAB_LIB or OPTAB_LIB_WIDEN.
	* optabs.c: Include expmed.h after optabs.h.
	(expand_doubleword_mod, expand_doubleword_divmod): Pass OPTAB_DIRECT
	as last argument to expand_divmod.
	(expand_binop): Punt if {s,u}divmod_optab has handler for double-word
	int_mode.
	* expr.c: Include expmed.h after optabs.h.
	* explow.c: Include expmed.h after optabs.h.
2020-12-02 11:40:47 +01:00
2020-11-26 00:16:41 +00:00
2020-12-01 00:16:38 +00:00
2020-11-19 00:16:30 +00:00
2020-10-30 00:16:29 +00:00
2020-09-25 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-12-02 00:16:41 +00:00
2020-11-30 00:16:27 +00:00
2020-12-01 00:16:38 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-26 00:16:41 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-12-01 00:16:38 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-30 00:16:27 +00:00
2020-11-16 12:52:43 +01:00
2020-11-30 00:16:27 +00:00

This directory contains the GNU Compiler Collection (GCC).

The GNU Compiler Collection is free software.  See the files whose
names start with COPYING for copying permission.  The manuals, and
some of the runtime libraries, are under different terms; see the
individual source files for details.

The directory INSTALL contains copies of the installation information
as HTML and plain text.  The source of this information is
gcc/doc/install.texi.  The installation information includes details
of what is included in the GCC sources and what files GCC installs.

See the file gcc/doc/gcc.texi (together with other files that it
includes) for usage and porting information.  An online readable
version of the manual is in the files gcc/doc/gcc.info*.

See http://gcc.gnu.org/bugs/ for how to report bugs usefully.

Copyright years on GCC source files may be listed using range
notation, e.g., 1987-2012, indicating that every year in the range,
inclusive, is a copyrightable year that could otherwise be listed
individually.
Description
No description provided
Readme 2.1 GiB
Languages
C++ 31.9%
C 31.3%
Ada 12%
D 6.5%
Go 6.4%
Other 11.5%