re PR middle-end/37337 (ICE: verify_flow_info failed)

PR middle-end/37337
	* tree-ssa-dom.c (optimize_stmt): Call maybe_clean_or_replace_eh_stmt
	even when a stmt has been gimple_modified_p, but after fold_stmt is
	not any longer.  Remove unneeded may_have_exposed_new_symbols
	initializations.

	* g++.dg/tree-ssa/pr37337.C: New test.

From-SVN: r140117
This commit is contained in:
Jakub Jelinek 2008-09-08 21:31:18 +02:00 committed by Jakub Jelinek
parent 7220ca2b38
commit c5cac099b7
4 changed files with 57 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2008-09-08 Jakub Jelinek <jakub@redhat.com>
PR middle-end/37337
* tree-ssa-dom.c (optimize_stmt): Call maybe_clean_or_replace_eh_stmt
even when a stmt has been gimple_modified_p, but after fold_stmt is
not any longer. Remove unneeded may_have_exposed_new_symbols
initializations.
2008-09-08 Richard Guenther <rguenther@suse.de>
PR tree-optimization/37421

View File

@ -1,3 +1,8 @@
2008-09-08 Jakub Jelinek <jakub@redhat.com>
PR middle-end/37337
* g++.dg/tree-ssa/pr37337.C: New test.
2008-09-08 Richard Guenther <rguenther@suse.de>
PR tree-optimization/37421

View File

@ -0,0 +1,37 @@
// PR middle-end/37337
// { dg-do compile }
// { dg-options "-O2" }
extern "C"
{
typedef struct _IO_FILE FILE;
extern int __fprintf_chk (FILE *, int, const char *, ...);
extern inline __attribute__ ((always_inline, gnu_inline, artificial))
int fprintf (FILE *s, const char *f, ...)
{
return __fprintf_chk (s, 1, f, __builtin_va_arg_pack ());
}
}
extern int a;
struct A
{
virtual ~A (void)
{
}
};
struct B : public A
{
B ();
FILE *b;
};
void f (int *);
B::B ()
{
f (&a);
for (int i = 0; i < 6; i++)
fprintf (b, "%02x", 0xff);
fprintf (b, "\n--\n");
}

View File

@ -2179,7 +2179,8 @@ optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
{
gimple stmt, old_stmt;
bool may_optimize_p;
bool may_have_exposed_new_symbols = false;
bool may_have_exposed_new_symbols;
bool modified_p = false;
old_stmt = stmt = gsi_stmt (si);
@ -2188,7 +2189,6 @@ optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
update_stmt_if_modified (stmt);
opt_stats.num_stmts++;
may_have_exposed_new_symbols = false;
push_stmt_changes (gsi_stmt_ptr (&si));
if (dump_file && (dump_flags & TDF_DETAILS))
@ -2237,6 +2237,10 @@ optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
Indicate we will need to rescan and rewrite the statement. */
may_have_exposed_new_symbols = true;
/* Indicate that maybe_clean_or_replace_eh_stmt needs to be called,
even if fold_stmt updated the stmt already and thus cleared
gimple_modified_p flag on it. */
modified_p = true;
}
/* Check for redundant computations. Do this optimization only
@ -2285,7 +2289,7 @@ optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
Ultimately I suspect we're going to need to change the interface
into the SSA_NAME manager. */
if (gimple_modified_p (stmt))
if (gimple_modified_p (stmt) || modified_p)
{
tree val = NULL;