aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2013-04-03 11:49:44 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2013-04-03 09:49:44 +0000
commit6805bd3666a84351794d102894bd4800aeb59d7e (patch)
tree5aa8c1d2bf0947515d0adf4fdb9ba4f18effa4d8
parentda694a7701bc6c2defe09cc590166de096dd26da (diff)
downloadgcc-6805bd3666a84351794d102894bd4800aeb59d7e.zip
gcc-6805bd3666a84351794d102894bd4800aeb59d7e.tar.gz
gcc-6805bd3666a84351794d102894bd4800aeb59d7e.tar.bz2
re PR tree-optimization/56790 (VEC_COND_EXPR not constant folded)
2013-04-03 Marc Glisse <marc.glisse@inria.fr> PR tree-optimization/56790 gcc/ * fold-const.c (fold_ternary_loc) <VEC_COND_EXPR>: Add constant folding. gcc/testsuite/ * g++.dg/ext/pr56790-1.C: New testcase. From-SVN: r197395
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/fold-const.c23
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/pr56790-1.C16
4 files changed, 49 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3377359..512fe4a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2013-04-03 Marc Glisse <marc.glisse@inria.fr>
+ PR tree-optimization/56790
+ * fold-const.c (fold_ternary_loc) <VEC_COND_EXPR>: Add constant folding.
+
+2013-04-03 Marc Glisse <marc.glisse@inria.fr>
+
* simplify-rtx.c (simplify_binary_operation_1) <VEC_SELECT>:
Handle VEC_MERGE.
(simplify_ternary_operation) <VEC_MERGE>: Use unsigned HOST_WIDE_INT
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 905661c..dcf7aa0 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -13924,6 +13924,29 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
return pedantic_omit_one_operand_loc (loc, type, arg1, arg2);
if (integer_zerop (arg0))
return pedantic_omit_one_operand_loc (loc, type, arg2, arg1);
+
+ if ((TREE_CODE (arg1) == VECTOR_CST
+ || TREE_CODE (arg1) == CONSTRUCTOR)
+ && (TREE_CODE (arg2) == VECTOR_CST
+ || TREE_CODE (arg2) == CONSTRUCTOR))
+ {
+ unsigned int nelts = TYPE_VECTOR_SUBPARTS (type), i;
+ unsigned char *sel = XALLOCAVEC (unsigned char, nelts);
+ gcc_assert (nelts == VECTOR_CST_NELTS (arg0));
+ for (i = 0; i < nelts; i++)
+ {
+ tree val = VECTOR_CST_ELT (arg0, i);
+ if (integer_all_onesp (val))
+ sel[i] = i;
+ else if (integer_zerop (val))
+ sel[i] = nelts + i;
+ else /* Currently unreachable. */
+ return NULL_TREE;
+ }
+ tree t = fold_vec_perm (type, arg1, arg2, sel);
+ if (t != NULL_TREE)
+ return t;
+ }
}
if (operand_equal_p (arg1, op2, 0))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9ce315c..b147235 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2013-04-03 Marc Glisse <marc.glisse@inria.fr>
+ PR tree-optimization/56790
+ * g++.dg/ext/pr56790-1.C: New testcase.
+
+2013-04-03 Marc Glisse <marc.glisse@inria.fr>
+
* gcc.target/i386/merge-1.c: New testcase.
* gcc.target/i386/avx2-vpblendd128-1.c: Make it non-trivial.
diff --git a/gcc/testsuite/g++.dg/ext/pr56790-1.C b/gcc/testsuite/g++.dg/ext/pr56790-1.C
new file mode 100644
index 0000000..84feca1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr56790-1.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-ccp1" } */
+
+typedef long vec __attribute__ ((vector_size (2 * sizeof (long))));
+
+vec f (void)
+{
+ vec a = { 5, 7 };
+ vec b = { 11, 13 };
+ vec m = { -1, 0 };
+ return m ? a : b;
+}
+
+/* { dg-final { scan-tree-dump "{ 5, 13 }" "ccp1" } } */
+/* { dg-final { scan-tree-dump-not "VEC_COND_EXPR" "ccp1" } } */
+/* { dg-final { cleanup-tree-dump "ccp1" } } */