diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-09-03 19:31:38 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2012-09-03 17:31:38 +0000 |
commit | aa369472a27746c266746fac3f3568b173654a95 (patch) | |
tree | 72fdc7be9d4380c6964688c8dc44c6e68fa55389 | |
parent | 197ce79334cbe9acc9bb627b134dd60c28afc3e5 (diff) | |
download | gcc-aa369472a27746c266746fac3f3568b173654a95.zip gcc-aa369472a27746c266746fac3f3568b173654a95.tar.gz gcc-aa369472a27746c266746fac3f3568b173654a95.tar.bz2 |
fold-const.c (fold_ternary_loc): Constant-propagate after removing dead operands.
2012-09-03 Marc Glisse <marc.glisse@inria.fr>
gcc/
* fold-const.c (fold_ternary_loc): Constant-propagate after
removing dead operands.
gcc/testsuite/
* gcc.dg/fold-perm.c: Improve test.
From-SVN: r190901
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/fold-const.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fold-perm.c | 3 |
4 files changed, 21 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa72f0b..bad3763 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-09-03 Marc Glisse <marc.glisse@inria.fr> + + * fold-const.c (fold_ternary_loc): Constant-propagate after + removing dead operands. + 2012-09-03 Michael Matz <matz@suse.de> PR tree-optimization/46590 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index b386bb2..2bf5179 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -14196,16 +14196,6 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type, return op1; } - if ((TREE_CODE (arg0) == VECTOR_CST - || TREE_CODE (arg0) == CONSTRUCTOR) - && (TREE_CODE (arg1) == VECTOR_CST - || TREE_CODE (arg1) == CONSTRUCTOR)) - { - t = fold_vec_perm (type, arg0, arg1, sel); - if (t != NULL_TREE) - return t; - } - if (all_in_vec0) op1 = op0; else if (all_in_vec1) @@ -14216,6 +14206,16 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type, need_mask_canon = true; } + if ((TREE_CODE (op0) == VECTOR_CST + || TREE_CODE (op0) == CONSTRUCTOR) + && (TREE_CODE (op1) == VECTOR_CST + || TREE_CODE (op1) == CONSTRUCTOR)) + { + t = fold_vec_perm (type, op0, op1, sel); + if (t != NULL_TREE) + return t; + } + if (op0 == op1 && !single_arg) changed = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dcce082..2a24cbc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-09-03 Marc Glisse <marc.glisse@inria.fr> + + * gcc.dg/fold-perm.c: Improve test. + 2012-09-03 Tobias Burnus <burnus@net-b.de> PR fortran/51632 diff --git a/gcc/testsuite/gcc.dg/fold-perm.c b/gcc/testsuite/gcc.dg/fold-perm.c index 7396c1d..2270c7b 100644 --- a/gcc/testsuite/gcc.dg/fold-perm.c +++ b/gcc/testsuite/gcc.dg/fold-perm.c @@ -3,11 +3,12 @@ typedef int veci __attribute__ ((vector_size (4 * sizeof (int)))); -void fun (veci *f, veci *g, veci *h) +void fun (veci *f, veci *g, veci *h, veci *i) { veci m = { 7, 7, 4, 6 }; veci n = { 0, 1, 2, 3 }; veci p = { 1, 1, 7, 6 }; + *i = __builtin_shuffle (*i, p, m); *h = __builtin_shuffle (*h, *h, p); *g = __builtin_shuffle (*f, *g, m); *f = __builtin_shuffle (*f, *g, n); |