From: Richard Henderson Date: Tue, 17 Feb 1998 21:55:52 +0000 (-0800) Subject: combine.c (simplify_rtx): Obey CLASS_CANNOT_CHANGE_SIZE when simplifying a subreg... X-Git-Tag: prereleases/egcs-1.0.2-prerelease~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5d1f565be19cef6ab6e71cb0c56915a77155bd90;p=thirdparty%2Fgcc.git combine.c (simplify_rtx): Obey CLASS_CANNOT_CHANGE_SIZE when simplifying a subreg of a hard reg. * combine.c (simplify_rtx): Obey CLASS_CANNOT_CHANGE_SIZE when simplifying a subreg of a hard reg. (expand_compound_operation): Likewise. (force_to_mode): Likewise. From-SVN: r18053 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8174fd56a162..1e51a0836d4c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Tue Feb 17 22:56:14 1998 Richard Henderson + + * combine.c (simplify_rtx): Obey CLASS_CANNOT_CHANGE_SIZE when + simplifying a subreg of a hard reg. + (expand_compound_operation): Likewise. + (force_to_mode): Likewise. + Sun Feb 15 21:07:48 1998 Jeffrey A Law (law@cygnus.com) * arm/netbsd.h (DWARF2_UNWIND_INFO): Define as zero for now. diff --git a/gcc/combine.c b/gcc/combine.c index 2fd6246e2ef3..bc37d61c7a2f 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -3367,6 +3367,13 @@ simplify_rtx (x, op0_mode, last, in_dest) if (GET_CODE (SUBREG_REG (x)) == REG && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER +#ifdef CLASS_CANNOT_CHANGE_SIZE + && (! (TEST_HARD_REG_BIT + (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE], + REGNO (SUBREG_REG (x)))) + || (GET_MODE_SIZE (mode) + == GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))) +#endif && REGNO (SUBREG_REG (x)) != FRAME_POINTER_REGNUM #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM && REGNO (SUBREG_REG (x)) != HARD_FRAME_POINTER_REGNUM @@ -4979,6 +4986,20 @@ expand_compound_operation (x) int modewidth; rtx tem; +#ifdef CLASS_CANNOT_CHANGE_SIZE + /* When dealing with hard regs that cannot change size, don't even try + expanding to shifts, since we wind up violating the rule. */ + if (GET_RTX_CLASS (GET_CODE (x)) == '1' + && GET_CODE (XEXP (x, 0)) == REG + && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER + && (TEST_HARD_REG_BIT + (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE], + REGNO (SUBREG_REG (x)))) + && (GET_MODE_SIZE (GET_MODE (x)) + != GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))) + return x; +#endif + switch (GET_CODE (x)) { case ZERO_EXTEND: @@ -6085,6 +6106,17 @@ force_to_mode (x, mode, mask, reg, just_select) break; case SUBREG: +#ifdef CLASS_CANNOT_CHANGE_SIZE + if (GET_CODE (SUBREG_REG (x)) == REG + && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER + && (TEST_HARD_REG_BIT + (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE], + REGNO (SUBREG_REG (x)))) + && (GET_MODE_SIZE (GET_MODE (x)) + != GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))) + return x; +#endif + if (subreg_lowpart_p (x) /* We can ignore the effect of this SUBREG if it narrows the mode or if the constant masks to zero all the bits the mode doesn't