OSDN Git Service

gcc/ChangeLog:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Nov 2009 06:02:58 +0000 (06:02 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 18 Nov 2009 06:02:58 +0000 (06:02 +0000)
PR debug/41926
* tree-vect-loop.c (vect_loop_kill_debug_uses): New.
(vect_transform_loop): Call it.
gcc/testsuite/ChangeLog:
PR debug/41926
* gcc.dg/vect/vect-debug-pr41926.c: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154281 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/vect-debug-pr41926.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index 0545a5c..256721f 100644 (file)
@@ -1,5 +1,11 @@
 2009-11-18  Alexandre Oliva  <aoliva@redhat.com>
 
+       PR debug/41926
+       * tree-vect-loop.c (vect_loop_kill_debug_uses): New.
+       (vect_transform_loop): Call it.
+
+2009-11-18  Alexandre Oliva  <aoliva@redhat.com>
+
        * tree-ssa.c (insert_debug_temp_for_var_def): Fix handling of
        released SSA names.
 
index 0cbfda2..3ebf59b 100644 (file)
@@ -1,3 +1,8 @@
+2009-11-18  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR debug/41926
+       * gcc.dg/vect/vect-debug-pr41926.c: New.
+
 2009-11-17  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/42058
diff --git a/gcc/testsuite/gcc.dg/vect/vect-debug-pr41926.c b/gcc/testsuite/gcc.dg/vect/vect-debug-pr41926.c
new file mode 100644 (file)
index 0000000..6eea84a
--- /dev/null
@@ -0,0 +1,20 @@
+/* PR debug/41926 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g -ffast-math -funroll-loops -ftree-vectorize -msse2" { target { i?86-*-* x86_64-*-* } } } */
+
+void
+foo (double (*__restrict p)[4], double (*__restrict q)[4],
+     double *__restrict prim, double scale, double pp, double pq)
+{
+  int md, mc, mb, ma, p_index = 0;
+
+  for (md = 0; md < 1; md++)
+    for (mc = 0; mc < 1; mc++)
+      for (mb = 0; mb < 1; mb++)
+       for (ma = 0; ma < 4; ma++)
+         {
+           double tmp = scale * prim[p_index++];
+           p[md][ma] = p[md][ma] - tmp * pp;
+           q[mc][ma] = q[mc][ma] - tmp * pq;
+         }
+}
index c235770..55b9fb2 100644 (file)
@@ -4112,6 +4112,44 @@ vectorizable_live_operation (gimple stmt,
   return true;
 }
 
+/* Kill any debug uses outside LOOP of SSA names defined in STMT.  */
+
+static void
+vect_loop_kill_debug_uses (struct loop *loop, gimple stmt)
+{
+  ssa_op_iter op_iter;
+  imm_use_iterator imm_iter;
+  def_operand_p def_p;
+  gimple ustmt;
+
+  FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
+    {
+      FOR_EACH_IMM_USE_STMT (ustmt, imm_iter, DEF_FROM_PTR (def_p))
+       {
+         basic_block bb;
+
+         if (!is_gimple_debug (ustmt))
+           continue;
+
+         bb = gimple_bb (ustmt);
+
+         if (!flow_bb_inside_loop_p (loop, bb))
+           {
+             if (gimple_debug_bind_p (ustmt))
+               {
+                 if (vect_print_dump_info (REPORT_DETAILS))
+                   fprintf (vect_dump, "killing debug use");
+
+                 gimple_debug_bind_reset_value (ustmt);
+                 update_stmt (ustmt);
+               }
+             else
+               gcc_unreachable ();
+           }
+       }
+    }
+}
+
 /* Function vect_transform_loop.
 
    The analysis phase has determined that the loop is vectorizable.
@@ -4202,7 +4240,11 @@ vect_transform_loop (loop_vec_info loop_vinfo)
 
          if (!STMT_VINFO_RELEVANT_P (stmt_info)
              && !STMT_VINFO_LIVE_P (stmt_info))
-           continue;
+           {
+             if (MAY_HAVE_DEBUG_STMTS)
+               vect_loop_kill_debug_uses (loop, phi);
+             continue;
+           }
 
          if ((TYPE_VECTOR_SUBPARTS (STMT_VINFO_VECTYPE (stmt_info))
                != (unsigned HOST_WIDE_INT) vectorization_factor)
@@ -4242,6 +4284,8 @@ vect_transform_loop (loop_vec_info loop_vinfo)
          if (!STMT_VINFO_RELEVANT_P (stmt_info)
              && !STMT_VINFO_LIVE_P (stmt_info))
            {
+             if (MAY_HAVE_DEBUG_STMTS)
+               vect_loop_kill_debug_uses (loop, stmt);
              gsi_next (&si);
              continue;
            }