aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2002-05-25 19:47:11 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2002-05-25 19:47:11 +0000
commit8c1d52a397e0ebed0a96dfab417da25b3af2234d (patch)
treebbe22fe8bced34436020445211c14da426966409 /gcc/combine.c
parentb47cae3dee210a9b985e18e2b6211ea8ce9c5d88 (diff)
downloadgcc-8c1d52a397e0ebed0a96dfab417da25b3af2234d.zip
gcc-8c1d52a397e0ebed0a96dfab417da25b3af2234d.tar.gz
gcc-8c1d52a397e0ebed0a96dfab417da25b3af2234d.tar.bz2
* combine.c (simplify_set): Remove an unnecessary subreg.
From-SVN: r53873
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index f3cb90f..e1581da 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -5160,6 +5160,30 @@ simplify_set (x)
src = SET_SRC (x), dest = SET_DEST (x);
}
+#ifdef HAVE_cc0
+ /* If we have (set (cc0) (subreg ...)), we try to remove the subreg
+ in SRC. */
+ if (dest == cc0_rtx
+ && GET_CODE (src) == SUBREG
+ && subreg_lowpart_p (src)
+ && (GET_MODE_BITSIZE (GET_MODE (src))
+ < GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (src)))))
+ {
+ rtx inner = SUBREG_REG (src);
+ enum machine_mode inner_mode = GET_MODE (inner);
+
+ /* Here we make sure that we don't have a sign bit on. */
+ if (GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_WIDE_INT
+ && (nonzero_bits (inner, inner_mode)
+ < ((unsigned HOST_WIDE_INT) 1
+ << (GET_MODE_BITSIZE (inner_mode) - 1))))
+ {
+ SUBST (SET_SRC (x), inner);
+ src = SET_SRC (x);
+ }
+ }
+#endif
+
#ifdef LOAD_EXTEND_OP
/* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
would require a paradoxical subreg. Replace the subreg with a