diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1997-08-02 13:48:13 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1997-08-02 13:48:13 -0400 |
commit | 5a03c8c4016a7a702d6de2d308bca153a6befb5d (patch) | |
tree | 8bcd80fc445b7119da11aac7fcb1335519c1d82f /gcc | |
parent | eadceb598a8e7ec27f6a0c44c6f2e4200c40a482 (diff) | |
download | gcc-5a03c8c4016a7a702d6de2d308bca153a6befb5d.zip gcc-5a03c8c4016a7a702d6de2d308bca153a6befb5d.tar.gz gcc-5a03c8c4016a7a702d6de2d308bca153a6befb5d.tar.bz2 |
(cse_insn): Ignore paradoxical SUBREGs unless we are looking for such.
From-SVN: r14625
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cse.c | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -6773,6 +6773,18 @@ cse_insn (insn, in_libcall_block) if (code != REG && ! exp_equiv_p (p->exp, p->exp, 1, 0)) continue; + /* Also skip paradoxical subregs, unless that's what we're + looking for. */ + if (code == SUBREG + && (GET_MODE_SIZE (GET_MODE (p->exp)) + > GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp)))) + && ! (src != 0 + && GET_CODE (src) == SUBREG + && GET_MODE (src) == GET_MODE (p->exp) + && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))) + < GET_MODE_SIZE (GET_MODE (SUBREG_REG (p->exp)))))) + continue; + if (src && GET_CODE (src) == code && rtx_equal_p (src, p->exp)) src = 0; else if (src_folded && GET_CODE (src_folded) == code @@ -6846,6 +6858,25 @@ cse_insn (insn, in_libcall_block) while (elt && GET_CODE (elt->exp) != REG && ! exp_equiv_p (elt->exp, elt->exp, 1, 0)) elt = elt->next_same_value; + + /* A paradoxical subreg would be bad here: it'll be the right + size, but later may be adjusted so that the upper bits aren't + what we want. So reject it. */ + if (elt != 0 + && GET_CODE (elt->exp) == SUBREG + && (GET_MODE_SIZE (GET_MODE (elt->exp)) + > GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp)))) + /* It is okay, though, if the rtx we're trying to match + will ignore any of the bits we can't predict. */ + && ! (src != 0 + && GET_CODE (src) == SUBREG + && GET_MODE (src) == GET_MODE (elt->exp) + && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))) + < GET_MODE_SIZE (GET_MODE (SUBREG_REG (elt->exp)))))) + { + elt = elt->next_same_value; + continue; + } if (elt) src_elt_cost = elt->cost; |