aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2012-09-03 19:31:38 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2012-09-03 17:31:38 +0000
commitaa369472a27746c266746fac3f3568b173654a95 (patch)
tree72fdc7be9d4380c6964688c8dc44c6e68fa55389
parent197ce79334cbe9acc9bb627b134dd60c28afc3e5 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/fold-const.c20
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/fold-perm.c3
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);