diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 41e0db374130..914742e61286 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-08-10 Richard Guenther + + PR middle-end/54219 + * fold-const.c (fold_ternary_loc): Do not reverse the mask + when canonicalizing it when folding VEC_PERM_EXPR. + 2012-08-10 Bill Schmidt PR middle-end/54211 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 74fbb2a135fc..5e14125eea07 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -14189,7 +14189,7 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type, tree *tsel = XALLOCAVEC (tree, nelts); tree eltype = TREE_TYPE (TREE_TYPE (arg2)); for (i = 0; i < nelts; i++) - tsel[i] = build_int_cst (eltype, sel[nelts - i - 1]); + tsel[i] = build_int_cst (eltype, sel[i]); t = build_vector (TREE_TYPE (arg2), tsel); return build3_loc (loc, VEC_PERM_EXPR, type, op0, op1, t); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 243f5950fcc8..bc8573524a3b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-08-10 Richard Guenther + + PR middle-end/54219 + * gcc.dg/torture/vector-shuffle1.c: New testcase. + 2012-08-10 Bill Schmidt PR middle-end/54211 diff --git a/gcc/testsuite/gcc.dg/torture/vector-shuffle1.c b/gcc/testsuite/gcc.dg/torture/vector-shuffle1.c new file mode 100644 index 000000000000..9fa4f217587a --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/vector-shuffle1.c @@ -0,0 +1,20 @@ +/* PR54219 */ +/* { dg-do run } */ + +extern void abort (void); + +typedef int v2si __attribute__((vector_size(2*sizeof(int)))); + +v2si f(v2si x) +{ + /* This requires canonicalization of the mask to { 1, 0 }. */ + return __builtin_shuffle(x,x, (v2si) { 5, 0 }); +} + +int main() +{ + v2si y = f((v2si) { 1, 2 }); + if (y[0] != 2 || y[1] != 1) + abort (); + return 0; +}