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
This commit is contained in:
Jakub Jelinek 2011-07-04 19:19:52 +02:00 committed by Jakub Jelinek
parent 0d5e0c1bf0
commit 15923c25df
4 changed files with 64 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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);