summaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>2002-07-10 15:08:04 +0000
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>2002-07-10 15:08:04 +0000
commitcdc84acd7d84464c2af6ff856e96f0b96ae24c7a (patch)
tree5b69c0a87297e70404fde5602eb72fcc57841005 /gcc/cse.c
parentcb8927ae52a91e8d5ddfe6dcc3a4e53e55784653 (diff)
downloadgcc-cdc84acd7d84464c2af6ff856e96f0b96ae24c7a.tar.gz
* cse.c (cse_insn): Supply proper SUBREG_BYTE to simplify_gen_subreg.
Get mode from dest. If simplify_gen_subreg fails, try next equivalent. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@55368 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cse.c')
-rw-r--r--gcc/cse.c19
1 files changed, 17 insertions, 2 deletions
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);