From ff27a429389d84c9f608070a2635898fb3077970 Mon Sep 17 00:00:00 2001 From: "J\"orn Rennecke" Date: Wed, 10 Jul 2002 15:08:04 +0000 Subject: [PATCH] cse.c (cse_insn): Supply proper SUBREG_BYTE to simplify_gen_subreg. * cse.c (cse_insn): Supply proper SUBREG_BYTE to simplify_gen_subreg. Get mode from dest. If simplify_gen_subreg fails, try next equivalent. From-SVN: r55368 --- gcc/ChangeLog | 6 ++++++ gcc/cse.c | 19 +++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a4e95896ac..58c05a1c0ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Wed Jul 10 16:06:00 2002 J"orn Rennecke + + * cse.c (cse_insn): Supply proper SUBREG_BYTE to simplify_gen_subreg. + Get mode from dest. + If simplify_gen_subreg fails, try next equivalent. + 2002-07-09 Gabriel Dos Reis * diagnostic.h: #include location.h diff --git a/gcc/cse.c b/gcc/cse.c index 14ffd801bbe..afdc8daa8b0 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -6196,14 +6196,29 @@ cse_insn (insn, libcall_insn) rtx new_src = 0; unsigned src_hash; struct table_elt *src_elt; + int byte = 0; /* Ignore invalid entries. */ if (GET_CODE (elt->exp) != REG && ! exp_equiv_p (elt->exp, elt->exp, 1, 0)) continue; - new_src - = simplify_gen_subreg (new_mode, elt->exp, elt->mode, 0); + /* 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); + /* 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. + It is invalid to construct a SUBREG with a VOIDmode + SUBREG_REG, hence a zero new_src means we can't do + this substitution. */ + if (! new_src) + continue; src_hash = HASH (new_src, new_mode); src_elt = lookup (new_src, src_hash, new_mode); -- 2.30.2