]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
fold-const.c (fold_ternary_loc): Constant-propagate after removing dead operands.
authorMarc Glisse <marc.glisse@inria.fr>
Mon, 3 Sep 2012 17:31:38 +0000 (19:31 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Mon, 3 Sep 2012 17:31:38 +0000 (17:31 +0000)
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

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fold-perm.c

index fa72f0b843b35bf03e658a9ee551cab086ec5abe..bad3763620a4d042d187289be1b087299024bccf 100644 (file)
@@ -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
index b386bb2c6060275e6fc4b21dd0a469d4c62eb1e6..2bf517978477671494daa472219e229af2ee69e2 100644 (file)
@@ -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;
 
index dcce082494127d630e8dacd907f5aae7388e3694..2a24cbce87cff74f686197047e66f4dd7cc613a9 100644 (file)
@@ -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
index 7396c1dfadc00f858ffaab174521861e8663a90c..2270c7b0f5476d624f57c0faad09b7c4cad66ca2 100644 (file)
@@ -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);