From 6805bd3666a84351794d102894bd4800aeb59d7e Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Wed, 3 Apr 2013 11:49:44 +0200 Subject: [PATCH] re PR tree-optimization/56790 (VEC_COND_EXPR not constant folded) 2013-04-03 Marc Glisse PR tree-optimization/56790 gcc/ * fold-const.c (fold_ternary_loc) : Add constant folding. gcc/testsuite/ * g++.dg/ext/pr56790-1.C: New testcase. From-SVN: r197395 --- gcc/ChangeLog | 5 +++++ gcc/fold-const.c | 23 +++++++++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ext/pr56790-1.C | 16 ++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/pr56790-1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 33773594e29..512fe4abbaa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-04-03 Marc Glisse + + PR tree-optimization/56790 + * fold-const.c (fold_ternary_loc) : Add constant folding. + 2013-04-03 Marc Glisse * simplify-rtx.c (simplify_binary_operation_1) : diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 905661cf7e6..dcf7aa0d6a5 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 9ce315c5cf4..b147235b908 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-04-03 Marc Glisse + + PR tree-optimization/56790 + * g++.dg/ext/pr56790-1.C: New testcase. + 2013-04-03 Marc Glisse * gcc.target/i386/merge-1.c: New testcase. 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 00000000000..84feca19c7d --- /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" } } */ -- 2.30.2