aboutsummaryrefslogtreecommitdiff
path: root/gcc/ree.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-01-10 22:27:52 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-01-10 22:27:52 +0100
commit0d6d7b9a20f3ed4370214a03f1ee26bdda4ad4e9 (patch)
treecad3c186a3ee0f3eed1611177a46ae7210b7b3ab /gcc/ree.c
parent110132c1311c283a0d8add6e4457c7f262e79a9a (diff)
downloadgcc-0d6d7b9a20f3ed4370214a03f1ee26bdda4ad4e9.zip
gcc-0d6d7b9a20f3ed4370214a03f1ee26bdda4ad4e9.tar.gz
gcc-0d6d7b9a20f3ed4370214a03f1ee26bdda4ad4e9.tar.bz2
re PR rtl-optimization/59754 ([ree.c] Incorrect merge while working with vector registers)
PR rtl-optimization/59754 * ree.c (combine_reaching_defs): Disallow !SCALAR_INT_MODE_P modes in the REGNO != REGNO case. From-SVN: r206542
Diffstat (limited to 'gcc/ree.c')
-rw-r--r--gcc/ree.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/ree.c b/gcc/ree.c
index 1c4f3ad..01ccd69 100644
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -702,6 +702,18 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state)
if (state->modified[INSN_UID (cand->insn)].kind != EXT_MODIFIED_NONE)
return false;
+ /* Transformation of
+ (set (reg1) (expression))
+ (set (reg2) (any_extend (reg1)))
+ into
+ (set (reg2) (any_extend (expression)))
+ (set (reg1) (reg2))
+ is only valid for scalar integral modes, as it relies on the low
+ subreg of reg1 to have the value of (expression), which is not true
+ e.g. for vector modes. */
+ if (!SCALAR_INT_MODE_P (GET_MODE (SET_DEST (PATTERN (cand->insn)))))
+ return false;
+
/* There's only one reaching def. */
rtx def_insn = state->defs_list[0];