aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1998-02-17 13:54:24 -0800
committerJeff Law <law@gcc.gnu.org>1998-02-17 14:54:24 -0700
commit15941d29c876e99179d1184c82100edc6dde4d2a (patch)
treeb858b5b177590b137ed147ae1f5109f540493519 /gcc
parentd84a12e2de3b034e416eba9f808be56e309bc30d (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/combine.c32
2 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3733a2a..757b6aa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+Tue Feb 17 22:56:14 1998 Richard Henderson <rth@cygnus.com>
+
+ * 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.
+
Tue Feb 17 22:37:22 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* Makefile.in (gcc.o): Depend on system.h, in accordance with last
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