diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2013-04-03 11:49:44 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2013-04-03 09:49:44 +0000 |
commit | 6805bd3666a84351794d102894bd4800aeb59d7e (patch) | |
tree | 5aa8c1d2bf0947515d0adf4fdb9ba4f18effa4d8 /gcc | |
parent | da694a7701bc6c2defe09cc590166de096dd26da (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fold-const.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/pr56790-1.C | 16 |
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" } } */ |