From bcfb807527a1ae01d056ce4a7e70ca0b4b86b35e Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Thu, 4 Sep 2003 01:53:01 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 ++++ gcc/simplify-rtx.c | 8 +++-- gcc/testsuite/ChangeLog | 5 +++ .../gcc.c-torture/compile/20030903-1.c | 33 +++++++++++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20030903-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d54b34e115..d4327192853 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-09-03 Roger Sayle + + 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 * configure.in (gcc_cv_ld_hidden): Disable unless using GNU ld. diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 919bea6aae2..6ace3480911 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a6d708c98fa..d417f839c70 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-09-03 Roger Sayle + + PR optimization/11700. + * gcc.c-torture/compile/20030903-1.c: New test case. + 2003-09-03 Mark Mitchell PR c++/12053 diff --git a/gcc/testsuite/gcc.c-torture/compile/20030903-1.c b/gcc/testsuite/gcc.c-torture/compile/20030903-1.c new file mode 100644 index 00000000000..fa4d30db6c0 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20030903-1.c @@ -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); +} + -- 2.30.2