re PR tree-optimization/51074 (No constant folding performed for VEC_PERM_EXPR, VEC_INTERLEAVE*EXPR, VEC_EXTRACT*EXPR)

PR tree-optimization/51074
	* fold-const.c (fold_binary_loc): Fix up VEC_INTERLEAVE_*_EXPR
	handling for BYTES_BIG_ENDIAN.
	* optabs.c (can_vec_perm_for_code_p): Likewise.

	* gcc.dg/vect/pr51074.c: New test.

From-SVN: r181627
This commit is contained in:
Jakub Jelinek 2011-11-22 17:57:33 +01:00 committed by Jakub Jelinek
parent 3945f48ca7
commit 32ef15bd33
5 changed files with 42 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2011-11-22 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/51074
* fold-const.c (fold_binary_loc): Fix up VEC_INTERLEAVE_*_EXPR
handling for BYTES_BIG_ENDIAN.
* optabs.c (can_vec_perm_for_code_p): Likewise.
2011-11-22 Michael Matz <matz@suse.de>
PR other/51125

View File

@ -13483,10 +13483,12 @@ fold_binary_loc (location_t loc,
sel[i] = i * 2 + 1;
break;
case VEC_INTERLEAVE_HIGH_EXPR:
sel[i] = (i + nelts) / 2 + ((i & 1) ? nelts : 0);
sel[i] = (i + (BYTES_BIG_ENDIAN ? 0 : nelts)) / 2
+ ((i & 1) ? nelts : 0);
break;
case VEC_INTERLEAVE_LOW_EXPR:
sel[i] = i / 2 + ((i & 1) ? nelts : 0);
sel[i] = (i + (BYTES_BIG_ENDIAN ? nelts : 0)) / 2
+ ((i & 1) ? nelts : 0);
break;
default:
gcc_unreachable ();

View File

@ -6932,9 +6932,9 @@ can_vec_perm_for_code_p (enum tree_code code, enum machine_mode mode,
break;
case VEC_INTERLEAVE_HIGH_EXPR:
alt = nelt / 2;
/* FALLTHRU */
case VEC_INTERLEAVE_LOW_EXPR:
if ((BYTES_BIG_ENDIAN != 0) ^ (code == VEC_INTERLEAVE_HIGH_EXPR))
alt = nelt / 2;
for (i = 0; i < nelt / 2; ++i)
{
data[i * 2] = i + alt;

View File

@ -1,3 +1,8 @@
2011-11-22 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/51074
* gcc.dg/vect/pr51074.c: New test.
2011-11-22 Dodji Seketeli <dodji@redhat.com>
PR c++/51143

View File

@ -0,0 +1,24 @@
/* PR tree-optimization/51074 */
#include "tree-vect.h"
struct S { int a, b; } s[8];
int
main ()
{
int i;
check_vect ();
for (i = 0; i < 8; i++)
{
s[i].b = 0;
s[i].a = i;
}
asm volatile ("" : : : "memory");
for (i = 0; i < 8; i++)
if (s[i].b != 0 || s[i].a != i)
abort ();
return 0;
}
/* { dg-final { cleanup-tree-dump "vect" } } */