aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2012-10-29 19:36:47 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2012-10-29 19:36:47 +0000
commit61dc0ea735b12329bcb88eeb1e11255f86b295f7 (patch)
treee8add9a26d8368777c8713859ad9a343912fc457
parent6119d95c67f627e95131041c5d33756d42c892a3 (diff)
downloadgcc-61dc0ea735b12329bcb88eeb1e11255f86b295f7.zip
gcc-61dc0ea735b12329bcb88eeb1e11255f86b295f7.tar.gz
gcc-61dc0ea735b12329bcb88eeb1e11255f86b295f7.tar.bz2
re PR debug/54693 (VTA guality issues with loops)
gcc/ChangeLog: PR debug/54693 * tree-ssa-threadedge.c (thread_around_empty_block): Copy debug temps from predecessor before threading. gcc/testsuite/ChangeLog: PR debug/54693 * gcc.dg/guality/pr54693.c: New. From-SVN: r192961
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr54693.c28
-rw-r--r--gcc/tree-ssa-threadedge.c18
4 files changed, 57 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8422ca0..491128e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2012-10-29 Alexandre Oliva <aoliva@redhat.com>
+ PR debug/54693
+ * tree-ssa-threadedge.c (thread_around_empty_block): Copy
+ debug temps from predecessor before threading.
+
+2012-10-29 Alexandre Oliva <aoliva@redhat.com>
+
PR debug/54551
PR debug/54693
* valtrack.c (dead_debug_global_find): Accept NULL dtemp.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0c0124d..c6899df 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-10-29 Alexandre Oliva <aoliva@redhat.com>
+
+ PR debug/54693
+ * gcc.dg/guality/pr54693.c: New.
+
2012-10-29 Marc Glisse <marc.glisse@inria.fr>
PR middle-end/55027
diff --git a/gcc/testsuite/gcc.dg/guality/pr54693.c b/gcc/testsuite/gcc.dg/guality/pr54693.c
new file mode 100644
index 0000000..adc2dfd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/pr54693.c
@@ -0,0 +1,28 @@
+/* PR debug/54693 */
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+__attribute__((noinline, noclone)) void
+foo (char *str, char c)
+{
+ asm volatile ("" : : "r" (str), "r" (c) : "memory");
+ *str = c;
+}
+
+int
+main ()
+{
+ int i;
+ char c;
+ char arr[11];
+
+ for (i = 0; i < 10; i++)
+ {
+ c = 0x30 + i;
+ foo (&arr[i], c); /* { dg-final { gdb-test 22 "i" "c - 48" } } */
+ }
+
+ __builtin_printf ("arr = %s\n", arr);
+ return 0;
+}
+
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index ddaa7d1..f43a564 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -637,6 +637,24 @@ thread_around_empty_block (edge taken_edge,
if (!single_pred_p (bb))
return NULL;
+ /* Before threading, copy DEBUG stmts from the predecessor, so that
+ we don't lose the bindings as we redirect the edges. */
+ if (MAY_HAVE_DEBUG_STMTS)
+ {
+ gsi = gsi_after_labels (bb);
+ for (gimple_stmt_iterator si = gsi_last_bb (taken_edge->src);
+ !gsi_end_p (si); gsi_prev (&si))
+ {
+ stmt = gsi_stmt (si);
+ if (!is_gimple_debug (stmt))
+ continue;
+
+ stmt = gimple_copy (stmt);
+ /* ??? Should we drop the location of the copy? */
+ gsi_insert_before (&gsi, stmt, GSI_NEW_STMT);
+ }
+ }
+
/* This block must have more than one successor. */
if (single_succ_p (bb))
return NULL;