diff options
author | Richard Henderson <rth@cygnus.com> | 1998-02-17 13:54:24 -0800 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1998-02-17 14:54:24 -0700 |
commit | 15941d29c876e99179d1184c82100edc6dde4d2a (patch) | |
tree | b858b5b177590b137ed147ae1f5109f540493519 /gcc/combine.c | |
parent | d84a12e2de3b034e416eba9f808be56e309bc30d (diff) | |
download | gcc-15941d29c876e99179d1184c82100edc6dde4d2a.zip gcc-15941d29c876e99179d1184c82100edc6dde4d2a.tar.gz gcc-15941d29c876e99179d1184c82100edc6dde4d2a.tar.bz2 |
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: r18052
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index 81f4d9b..dc8cc63 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -3483,6 +3483,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 @@ -5106,6 +5113,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: @@ -6222,6 +6243,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 |