summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1998-02-17 13:55:52 -0800
committerJeff Law <law@gcc.gnu.org>1998-02-17 14:55:52 -0700
commit5d1f565be19cef6ab6e71cb0c56915a77155bd90 (patch)
treeb63efd1c97eb618be4eda2f9f64e070fe5ba0cd2
parent3c1fb6619fb355cb2e6cbb5cab89888edd40dbf7 (diff)
downloadgcc-5d1f565be19cef6ab6e71cb0c56915a77155bd90.tar.gz
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
-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 8174fd56a16..1e51a0836d4 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.
+
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 2fd6246e2ef..bc37d61c7a2 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