From 15923c25df505b21061fda148dcb2b036af4735a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 4 Jul 2011 19:19:52 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr49602.c | 17 ++++++++++++++++ gcc/tree-into-ssa.c | 36 +++++++++++++++++++++++++++++++++- 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr49602.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 230bc256ead..0823aa84fe0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-07-04 Jakub Jelinek + + 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 PR target/49600 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 21bab4d45ef..5a7d801c377 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-07-04 Jakub Jelinek + + PR debug/49602 + * gcc.dg/pr49602.c: New test. + 2011-07-04 Georg-Johann Lay PR target/34734 diff --git a/gcc/testsuite/gcc.dg/pr49602.c b/gcc/testsuite/gcc.dg/pr49602.c new file mode 100644 index 00000000000..bb8eeb0c332 --- /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 0db9085f053..5fd34455df4 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); -- 2.30.2