aboutsummaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-09-04 16:03:31 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-09-04 16:03:31 -0700
commit9beb7d208292359f61d839fefa95153590df4200 (patch)
tree1fe61930dee048810002f4d43ff864b113cc9cf3 /gcc/cse.c
parenta038cc83d66e70c608995e066de22ced97b8ad38 (diff)
downloadgcc-9beb7d208292359f61d839fefa95153590df4200.zip
gcc-9beb7d208292359f61d839fefa95153590df4200.tar.gz
gcc-9beb7d208292359f61d839fefa95153590df4200.tar.bz2
cse.c (cse_insn): Avoid subreg games if the equivalence is already in the proper mode.
* cse.c (cse_insn): Avoid subreg games if the equivalence is already in the proper mode. From-SVN: r56819
Diffstat (limited to 'gcc/cse.c')
-rw-r--r--gcc/cse.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index afdc8da..7f0365a 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -6203,14 +6203,23 @@ cse_insn (insn, libcall_insn)
&& ! exp_equiv_p (elt->exp, elt->exp, 1, 0))
continue;
- /* Calculate big endian correction for the SUBREG_BYTE
- (or equivalent). We have already checked that M1
- ( GET_MODE (dest) ) is not narrower than M2 (new_mode). */
- if (BYTES_BIG_ENDIAN)
- byte = (GET_MODE_SIZE (GET_MODE (dest))
- - GET_MODE_SIZE (new_mode));
- new_src = simplify_gen_subreg (new_mode, elt->exp,
- GET_MODE (dest), byte);
+ /* We may have already been playing subreg games. If the
+ mode is already correct for the destination, use it. */
+ if (GET_MODE (elt->exp) == new_mode)
+ new_src = elt->exp;
+ else
+ {
+ /* Calculate big endian correction for the SUBREG_BYTE.
+ We have already checked that M1 (GET_MODE (dest))
+ is not narrower than M2 (new_mode). */
+ if (BYTES_BIG_ENDIAN)
+ byte = (GET_MODE_SIZE (GET_MODE (dest))
+ - GET_MODE_SIZE (new_mode));
+
+ new_src = simplify_gen_subreg (new_mode, elt->exp,
+ GET_MODE (dest), byte);
+ }
+
/* The call to simplify_gen_subreg fails if the value
is VOIDmode, yet we can't do any simplification, e.g.
for EXPR_LISTs denoting function call results.