aboutsummaryrefslogtreecommitdiff
path: root/gcc/ree.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-04-05 19:05:23 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-04-05 19:05:23 +0200
commit268a0ec4edd31182a527d02f47fab50d60ad845d (patch)
tree52989561542f7e2f21d718297c1e222a7eb64b4d /gcc/ree.c
parent02a49e4f9f81edfd3da44295a163f5029fcfef78 (diff)
downloadgcc-268a0ec4edd31182a527d02f47fab50d60ad845d.zip
gcc-268a0ec4edd31182a527d02f47fab50d60ad845d.tar.gz
gcc-268a0ec4edd31182a527d02f47fab50d60ad845d.tar.bz2
re PR rtl-optimization/70542 (Wrong code with -O3 -mavx2.)
PR rtl-optimization/70542 * ree.c (add_removable_extension): For VECTOR_MODE_P punt if there are any uses other than insn or debug insns. * gcc.dg/torture/pr70542.c: New test. * gcc.target/i386/avx2-pr70542.c: New test. From-SVN: r234756
Diffstat (limited to 'gcc/ree.c')
-rw-r--r--gcc/ree.c20
1 files changed, 6 insertions, 14 deletions
diff --git a/gcc/ree.c b/gcc/ree.c
index 13a7a05..4627b4f 100644
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -1025,11 +1025,11 @@ add_removable_extension (const_rtx expr, rtx_insn *insn,
return;
}
/* For vector mode extensions, ensure that all uses of the
- XEXP (src, 0) register are the same extension (both code
- and to which mode), as unlike integral extensions lowpart
- subreg of the sign/zero extended register are not equal
- to the original register, so we have to change all uses or
- none. */
+ XEXP (src, 0) register are in insn or debug insns, as unlike
+ integral extensions lowpart subreg of the sign/zero extended
+ register are not equal to the original register, so we have
+ to change all uses or none and the current code isn't able
+ to change them all at once in one transaction. */
else if (VECTOR_MODE_P (GET_MODE (XEXP (src, 0))))
{
if (idx == 0)
@@ -1046,15 +1046,7 @@ add_removable_extension (const_rtx expr, rtx_insn *insn,
break;
}
rtx_insn *use_insn = DF_REF_INSN (ref_link->ref);
- const_rtx use_set;
- if (use_insn == insn || DEBUG_INSN_P (use_insn))
- continue;
- if (!(use_set = single_set (use_insn))
- || !REG_P (SET_DEST (use_set))
- || GET_MODE (SET_DEST (use_set)) != GET_MODE (dest)
- || GET_CODE (SET_SRC (use_set)) != code
- || !rtx_equal_p (XEXP (SET_SRC (use_set), 0),
- XEXP (src, 0)))
+ if (use_insn != insn && !DEBUG_INSN_P (use_insn))
{
idx = -1U;
break;