diff options
author | Kazu Hirata <kazu@cs.umass.edu> | 2002-05-25 19:47:11 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@gcc.gnu.org> | 2002-05-25 19:47:11 +0000 |
commit | 8c1d52a397e0ebed0a96dfab417da25b3af2234d (patch) | |
tree | bbe22fe8bced34436020445211c14da426966409 /gcc/combine.c | |
parent | b47cae3dee210a9b985e18e2b6211ea8ce9c5d88 (diff) | |
download | gcc-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.c | 24 |
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 |