aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-07-04 19:19:52 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2011-07-04 19:19:52 +0200
commit15923c25df505b21061fda148dcb2b036af4735a (patch)
tree923ee6bb7c94810daeb4d2239aece6bc1e8b8edd /gcc
parent0d5e0c1bf0e68323091e3f3152ad4676cd59e53d (diff)
downloadgcc-15923c25df505b21061fda148dcb2b036af4735a.zip
gcc-15923c25df505b21061fda148dcb2b036af4735a.tar.gz
gcc-15923c25df505b21061fda148dcb2b036af4735a.tar.bz2
re PR debug/49602 (verify_ssa failed (definition does not dominate use) with "-O2 -g")
PR debug/49602 * tree-into-ssa.c (rewrite_debug_stmt_uses): Disregard get_current_def return value if it can't be trusted to be the current value of the variable in the current bb. * gcc.dg/pr49602.c: New test. From-SVN: r175818
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr49602.c17
-rw-r--r--gcc/tree-into-ssa.c36
4 files changed, 64 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 230bc25..0823aa8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-07-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/49602
+ * tree-into-ssa.c (rewrite_debug_stmt_uses): Disregard
+ get_current_def return value if it can't be trusted to be
+ the current value of the variable in the current bb.
+
2011-07-04 Uros Bizjak <ubizjak@gmail.com>
PR target/49600
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 21bab4d..5a7d801 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-07-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/49602
+ * gcc.dg/pr49602.c: New test.
+
2011-07-04 Georg-Johann Lay <avr@gjlay.de>
PR target/34734
diff --git a/gcc/testsuite/gcc.dg/pr49602.c b/gcc/testsuite/gcc.dg/pr49602.c
new file mode 100644
index 0000000..bb8eeb0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr49602.c
@@ -0,0 +1,17 @@
+/* PR debug/49602 */
+/* { dg-do compile } */
+/* { dg-options "-g -O2" } */
+
+static void
+foo (int *x)
+{
+}
+
+void
+bar (int *x)
+{
+ int i;
+ for (i = 0; i == 1; ++i)
+ x = 0;
+ foo (x);
+}
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
index 0db9085..5fd3445 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -1343,7 +1343,41 @@ rewrite_debug_stmt_uses (gimple stmt)
}
}
else
- def = get_current_def (var);
+ {
+ def = get_current_def (var);
+ /* Check if get_current_def can be trusted. */
+ if (def)
+ {
+ basic_block bb = gimple_bb (stmt);
+ basic_block def_bb
+ = SSA_NAME_IS_DEFAULT_DEF (def)
+ ? NULL : gimple_bb (SSA_NAME_DEF_STMT (def));
+
+ /* If definition is in current bb, it is fine. */
+ if (bb == def_bb)
+ ;
+ /* If definition bb doesn't dominate the current bb,
+ it can't be used. */
+ else if (def_bb && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
+ def = NULL;
+ /* If there is just one definition and dominates the current
+ bb, it is fine. */
+ else if (get_phi_state (var) == NEED_PHI_STATE_NO)
+ ;
+ else
+ {
+ struct def_blocks_d *db_p = get_def_blocks_for (var);
+
+ /* If there are some non-debug uses in the current bb,
+ it is fine. */
+ if (bitmap_bit_p (db_p->livein_blocks, bb->index))
+ ;
+ /* Otherwise give up for now. */
+ else
+ def = NULL;
+ }
+ }
+ }
if (def == NULL)
{
gimple_debug_bind_reset_value (stmt);