re PR rtl-optimization/11700 ([M68K] ICE in subreg_hard_regno)

PR optimization/11700.
	* simplify-rtx.c (simplify_subreg): Check that the subreg offset
	of a hard register is representable before trying to simplify it
	using subreg_hard_regno.

	* gcc.c-torture/compile/20030903-1.c: New test case.

From-SVN: r71046
This commit is contained in:
Roger Sayle 2003-09-04 01:53:01 +00:00 committed by Roger Sayle
parent 2a3ef884df
commit bcfb807527
4 changed files with 50 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2003-09-03 Roger Sayle <roger@eyesopen.com>
PR optimization/11700.
* simplify-rtx.c (simplify_subreg): Check that the subreg offset
of a hard register is representable before trying to simplify it
using subreg_hard_regno.
2003-09-04 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
* configure.in (gcc_cv_ld_hidden): Disable unless using GNU ld.

View File

@ -3017,10 +3017,12 @@ simplify_subreg (enum machine_mode outermode, rtx op,
#if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
&& REGNO (op) != ARG_POINTER_REGNUM
#endif
&& REGNO (op) != STACK_POINTER_REGNUM)
&& REGNO (op) != STACK_POINTER_REGNUM
&& subreg_offset_representable_p (REGNO (op), innermode,
byte, outermode))
{
int final_regno = subreg_hard_regno (gen_rtx_SUBREG (outermode, op, byte),
0);
rtx tem = gen_rtx_SUBREG (outermode, op, byte);
int final_regno = subreg_hard_regno (tem, 0);
/* ??? We do allow it if the current REG is not valid for
its mode. This is a kludge to work around how float/complex

View File

@ -1,3 +1,8 @@
2003-09-03 Roger Sayle <roger@eyesopen.com>
PR optimization/11700.
* gcc.c-torture/compile/20030903-1.c: New test case.
2003-09-03 Mark Mitchell <mark@codesourcery.com>
PR c++/12053

View File

@ -0,0 +1,33 @@
/* Derived from PR optimization/11700. */
/* The compiler used to ICE during reload for m68k targets. */
void check_complex (__complex__ double, __complex__ double,
__complex__ double, __complex__ int);
void check_float (double, double, double, int);
extern double _Complex conj (double _Complex);
extern double carg (double _Complex __z);
static double minus_zero;
void
conj_test (void)
{
check_complex (conj (({ __complex__ double __retval;
__real__ __retval = (0.0);
__imag__ __retval = (0.0);
__retval; })),
({ __complex__ double __retval;
__real__ __retval = (0.0);
__imag__ __retval = (minus_zero);
__retval; }), 0, 0);
}
void
carg_test (void)
{
check_float (carg (({ __complex__ double __retval;
__real__ __retval = (2.0);
__imag__ __retval = (0);
__retval; })), 0, 0, 0);
}