re PR tree-optimization/69848 (poor vectorization of a loop from SPEC2006 464.h264ref)
authorBin Cheng <bin.cheng@arm.com>
Thu, 19 May 2016 09:03:36 +0000 (09:03 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Thu, 19 May 2016 09:03:36 +0000 (09:03 +0000)
PR tree-optimization/69848
* tree-vect-loop.c (vectorizable_reduction): Don't factor
comparison expr out of VEC_COND_EXPR for COND_REDUCTION.

From-SVN: r236447

gcc/ChangeLog
gcc/tree-vect-loop.c

index e2e29fe5d4884fec35904aa5706f7149174e5e17..b39357a002ca07ba5c065af9fa79287589e6d340 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-19 Bin Cheng  <bin.cheng@arm.com>
+
+       PR tree-optimization/69848
+       * tree-vect-loop.c (vectorizable_reduction): Don't factor
+       comparison expr out of VEC_COND_EXPR for COND_REDUCTION.
+
 2016-05-19  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * function.c (thread_prologue_and_epilogue_insn): Move the
index d673c67b4a0adc4ef6c75dd0ffb412f151172a08..67053af324640d0ecde7f90d7aaf22983cf33436 100644 (file)
@@ -6159,21 +6159,14 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi,
             Finally, we update the phi (NEW_PHI_TREE) to take the value of
             the new cond_expr (INDEX_COND_EXPR).  */
 
-         /* Turn the condition from vec_stmt into an ssa name.  */
-         gimple_stmt_iterator vec_stmt_gsi = gsi_for_stmt (*vec_stmt);
-         tree ccompare = gimple_assign_rhs1 (*vec_stmt);
-         tree ccompare_name = make_ssa_name (TREE_TYPE (ccompare));
-         gimple *ccompare_stmt = gimple_build_assign (ccompare_name,
-                                                      ccompare);
-         gsi_insert_before (&vec_stmt_gsi, ccompare_stmt, GSI_SAME_STMT);
-         gimple_assign_set_rhs1 (*vec_stmt, ccompare_name);
-         update_stmt (*vec_stmt);
+         /* Duplicate the condition from vec_stmt.  */
+         tree ccompare = unshare_expr (gimple_assign_rhs1 (*vec_stmt));
 
          /* Create a conditional, where the condition is taken from vec_stmt
-            (CCOMPARE_NAME), then is the induction index (INDEX_BEFORE_INCR)
-            and else is the phi (NEW_PHI_TREE).  */
+            (CCOMPARE), then is the induction index (INDEX_BEFORE_INCR) and
+            else is the phi (NEW_PHI_TREE).  */
          tree index_cond_expr = build3 (VEC_COND_EXPR, cr_index_vector_type,
-                                        ccompare_name, indx_before_incr,
+                                        ccompare, indx_before_incr,
                                         new_phi_tree);
          cond_name = make_ssa_name (cr_index_vector_type);
          gimple *index_condition = gimple_build_assign (cond_name,