This fixes an error I introduced when making the VECTOR_CST representation
changes.
Bootstrap and regtest pending on x86_64-unknown-linux-gnu.
Richard.
2012-08-10 Richard Guenther rguent...@suse.de
PR middle-end/54219
* fold-const.c (fold_ternary_loc): Do not reverse the mask
when canonicalizing it when folding VEC_PERM_EXPR.
* gcc.dg/torture/vector-shuffle1.c: New testcase.
Index: gcc/fold-const.c
===
*** gcc/fold-const.c(revision 190288)
--- gcc/fold-const.c(working copy)
*** fold_ternary_loc (location_t loc, enum t
*** 14189,14195
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]);
t = build_vector (TREE_TYPE (arg2), tsel);
return build3_loc (loc, VEC_PERM_EXPR, type, op0, op1, t);
}
--- 14189,14195
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[i]);
t = build_vector (TREE_TYPE (arg2), tsel);
return build3_loc (loc, VEC_PERM_EXPR, type, op0, op1, t);
}
Index: gcc/testsuite/gcc.dg/torture/vector-shuffle1.c
===
*** gcc/testsuite/gcc.dg/torture/vector-shuffle1.c (revision 0)
--- gcc/testsuite/gcc.dg/torture/vector-shuffle1.c (working copy)
***
*** 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;
+ }