re PR tree-optimization/66718 (Non-invariant ADDR_EXPR not vectorized)
authorJakub Jelinek <jakub@redhat.com>
Sun, 5 Jul 2015 12:14:41 +0000 (14:14 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 5 Jul 2015 12:14:41 +0000 (14:14 +0200)
PR tree-optimization/66718
* tree-vect-stmts.c (vectorizable_call): Replace uses of
GOMP_SIMD_LANE outside of loop with vf - 1 rather than 0.

From-SVN: r225434

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

index 4ccf4396074ce6ddd189a55c48458a37e9e4dcb1..13f9ba75dc47b634e44cf01ad6df95498dc5d05d 100644 (file)
@@ -1,5 +1,9 @@
 2015-07-05  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/66718
+       * tree-vect-stmts.c (vectorizable_call): Replace uses of
+       GOMP_SIMD_LANE outside of loop with vf - 1 rather than 0.
+
        PR tree-optimization/66718
        * tree-vect-stmts.c (vectorizable_assignment, vectorizable_store,
        vectorizable_load, vectorizable_condition): Move vectype,
index c6565228d087ec6735dd86eacb82fc2ec9b7663b..5ac70231f3e98585f4afde73264168abb908e8ba 100644 (file)
@@ -2601,6 +2601,30 @@ vectorizable_call (gimple gs, gimple_stmt_iterator *gsi, gimple *vec_stmt,
     lhs = gimple_call_lhs (STMT_VINFO_RELATED_STMT (stmt_info));
   else
     lhs = gimple_call_lhs (stmt);
+
+  if (gimple_call_internal_p (stmt)
+      && gimple_call_internal_fn (stmt) == IFN_GOMP_SIMD_LANE)
+    {
+      /* Replace uses of the lhs of GOMP_SIMD_LANE call outside the loop
+        with vf - 1 rather than 0, that is the last iteration of the
+        vectorized loop.  */
+      imm_use_iterator iter;
+      use_operand_p use_p;
+      gimple use_stmt;
+      FOR_EACH_IMM_USE_STMT (use_stmt, iter, lhs)
+       {
+         basic_block use_bb = gimple_bb (use_stmt);
+         if (use_bb
+             && !flow_bb_inside_loop_p (LOOP_VINFO_LOOP (loop_vinfo), use_bb))
+           {
+             FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
+               SET_USE (use_p, build_int_cst (TREE_TYPE (lhs),
+                                              ncopies * nunits_out - 1));
+             update_stmt (use_stmt);
+           }
+       }
+    }
+
   new_stmt = gimple_build_assign (lhs, build_zero_cst (type));
   set_vinfo_for_stmt (new_stmt, stmt_info);
   set_vinfo_for_stmt (stmt, NULL);