This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR54219
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 10 Aug 2012 13:07:33 +0200 (CEST)
- Subject: [PATCH] Fix PR54219
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 <rguenther@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;
+ }