Commit 268a0ec4 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 02a49e4f
2016-04-05 Jakub Jelinek <jakub@redhat.com>
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.
2016-04-05 Marc Glisse <marc.glisse@inria.fr> 2016-04-05 Marc Glisse <marc.glisse@inria.fr>
Jakub Jelinek <jakub@redhat.com> Jakub Jelinek <jakub@redhat.com>
......
...@@ -1025,11 +1025,11 @@ add_removable_extension (const_rtx expr, rtx_insn *insn, ...@@ -1025,11 +1025,11 @@ add_removable_extension (const_rtx expr, rtx_insn *insn,
return; return;
} }
/* For vector mode extensions, ensure that all uses of the /* For vector mode extensions, ensure that all uses of the
XEXP (src, 0) register are the same extension (both code XEXP (src, 0) register are in insn or debug insns, as unlike
and to which mode), as unlike integral extensions lowpart integral extensions lowpart subreg of the sign/zero extended
subreg of the sign/zero extended register are not equal register are not equal to the original register, so we have
to the original register, so we have to change all uses or to change all uses or none and the current code isn't able
none. */ to change them all at once in one transaction. */
else if (VECTOR_MODE_P (GET_MODE (XEXP (src, 0)))) else if (VECTOR_MODE_P (GET_MODE (XEXP (src, 0))))
{ {
if (idx == 0) if (idx == 0)
...@@ -1046,15 +1046,7 @@ add_removable_extension (const_rtx expr, rtx_insn *insn, ...@@ -1046,15 +1046,7 @@ add_removable_extension (const_rtx expr, rtx_insn *insn,
break; break;
} }
rtx_insn *use_insn = DF_REF_INSN (ref_link->ref); rtx_insn *use_insn = DF_REF_INSN (ref_link->ref);
const_rtx use_set; if (use_insn != insn && !DEBUG_INSN_P (use_insn))
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)))
{ {
idx = -1U; idx = -1U;
break; break;
......
2016-04-05 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/70542
* gcc.dg/torture/pr70542.c: New test.
* gcc.target/i386/avx2-pr70542.c: New test.
2016-04-05 Zdenek Sojka <zsojka@seznam.cz> 2016-04-05 Zdenek Sojka <zsojka@seznam.cz>
PR tree-optimization/70509 PR tree-optimization/70509
......
/* PR rtl-optimization/70542 */
/* { dg-do run } */
int a[113], d[113];
short b[113], c[113], e[113];
int
main ()
{
int i;
long j;
for (i = 0; i < 113; ++i)
{
a[i] = -636544305;
b[i] = -31804;
}
for (j = 1; j <= 112; ++j)
{
c[j] = b[j] >> ((a[j] & 1587842570) - 1510214139);
if (a[j])
d[j] = j;
e[j] = 7 << ((2312631697 - b[j]) - 2312663500);
}
asm volatile ("" : : : "memory");
if (c[0] || d[0] || e[0])
__builtin_abort ();
for (i = 1; i <= 112; ++i)
if (c[i] != -1 || d[i] != i || e[i] != 14)
__builtin_abort ();
return 0;
}
/* PR tree-optimization/70542 */
/* { dg-do run } */
/* { dg-options "-O3 -mavx2" } */
/* { dg-require-effective-target avx2 } */
#include "avx2-check.h"
#define main() do_main ()
#include "../../gcc.dg/torture/pr70542.c"
static void
avx2_test (void)
{
do_main ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment