aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/vector-shuffle1.c20
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 41e0db3..914742e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
2012-08-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR middle-end/54211
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 74fbb2a..5e14125 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 243f595..bc85735 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-08-10 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/54219
+ * gcc.dg/torture/vector-shuffle1.c: New testcase.
+
2012-08-10 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
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 0000000..9fa4f21
--- /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;
+}