diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-04-05 19:05:23 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-04-05 19:05:23 +0200 |
commit | 268a0ec4edd31182a527d02f47fab50d60ad845d (patch) | |
tree | 52989561542f7e2f21d718297c1e222a7eb64b4d /gcc/ree.c | |
parent | 02a49e4f9f81edfd3da44295a163f5029fcfef78 (diff) | |
download | gcc-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.c | 20 |
1 files changed, 6 insertions, 14 deletions
@@ -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; |