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; + }