r216688 - in /trunk/gcc: ChangeLog config/rs600...

jsm28@gcc.gnu.org jsm28@gcc.gnu.org
Sat Oct 25 00:23:00 GMT 2014


Author: jsm28
Date: Sat Oct 25 00:23:17 2014
New Revision: 216688

URL: https://gcc.gnu.org/viewcvs?rev=216688&root=gcc&view=rev
Log:
Only allow e500 double in SPE_SIMD_REGNO_P registers.

rs6000_hard_regno_nregs_internal allows SPE vectors in single
registers satisfying SPE_SIMD_REGNO_P (i.e. register numbers 0 to
31).  However, the corresponding test for e500 double treats all
registers as being able to store a 64-bit value, rather than just
those GPRs.

Logically this inconsistency is wrong; in addition, it causes problems
unwinding from signal handlers.  linux-unwind.h uses
ARG_POINTER_REGNUM as a place to store the return address from a
signal handler, but this logic in rs6000_hard_regno_nregs_internal
results in that being considered an 8-byte register, resulting in
assertion failures.
(<https://gcc.gnu.org/ml/gcc-patches/2014-09/msg02625.html> first
needs to be applied for unwinding to work in general on e500.)  This
patch makes rs6000_hard_regno_nregs_internal handle the e500 double
case consistently with SPE vectors.

Tested with no regressions with cross to powerpc-linux-gnuspe (given
the aforementioned patch applied).  Failures of signal handling
unwinding tests such as gcc.dg/cleanup-{8,9,10,11}.c are fixed by this
patch.

	* config/rs6000/rs6000.c (rs6000_hard_regno_nregs_internal): Do
	not allow e500 double in registers not satisyfing
	SPE_SIMD_REGNO_P.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/rs6000/rs6000.c



More information about the Gcc-cvs mailing list