re PR tree-optimization/35869 (ICE in calc_dfs_tree at -O2 -gnatp after VRP optimization)

2008-04-11  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/35869
	* tree-vrp.c (execute_vrp): Move switch statement update after
	jump threading.  Schedule another cfg cleanup run.

	* gcc.c-torture/compile/pr35869.c: New testcase.

From-SVN: r134197
This commit is contained in:
Richard Guenther 2008-04-11 14:14:04 +00:00 committed by Richard Biener
parent 1f3f27a4e0
commit 0a4bf1d371
4 changed files with 76 additions and 14 deletions

View File

@ -1,3 +1,9 @@
2008-04-11 Richard Guenther <rguenther@suse.de>
PR tree-optimization/35869
* tree-vrp.c (execute_vrp): Move switch statement update after
jump threading. Schedule another cfg cleanup run.
2008-04-11 Volker Reichelt <v.reichelt@netcologne.de> 2008-04-11 Volker Reichelt <v.reichelt@netcologne.de>
PR c/35744 PR c/35744

View File

@ -1,3 +1,8 @@
2008-04-11 Richard Guenther <rguenther@suse.de>
PR tree-optimization/35869
* gcc.c-torture/compile/pr35869.c: New testcase.
2008-04-11 H.J. Lu <hongjiu.lu@intel.com> 2008-04-11 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/sse-13.c: Move __builtin_ia32_round* to new * gcc.target/i386/sse-13.c: Move __builtin_ia32_round* to new

View File

@ -0,0 +1,47 @@
struct texture_stage_op
{
unsigned int carg1, carg2, carg0;
unsigned int aarg1, aarg2, aarg0;
unsigned int dst;
};
static const char *debug_register(unsigned int reg) {
switch(reg) {
case 0x8921: return "GL_REG_0_ATI";
case 0x8923: return "GL_REG_2_ATI";
case 0x0: return "GL_ZERO";
case 0x1: return "GL_ONE";
default: return "Unknown register\n";
}
}
static unsigned int find_tmpreg(struct texture_stage_op op[8]) {
int i;
int tex_used[8];
for(i = 0; i < 8; i++) {
if(op[i].carg1 == 0x00000002 ) {
tex_used[i] = 1;
}
}
for(i = 1; i < 6; i++) {
if(!tex_used[i]) {
return 0x8921 + i;
}
}
return 0;
}
extern f(const char*);
void g() {
struct texture_stage_op op[8];
unsigned int tmparg = find_tmpreg(op);
unsigned int dstreg;
if(tmparg == 0x0) return;
dstreg = tmparg;
f(debug_register(dstreg));
return;
}

View File

@ -6734,20 +6734,6 @@ execute_vrp (void)
ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node); ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
vrp_finalize (); vrp_finalize ();
/* Remove dead edges from SWITCH_EXPR optimization. This leaves the
CFG in a broken state and requires a cfg_cleanup run. */
for (i = 0; VEC_iterate (edge, to_remove_edges, i, e); ++i)
remove_edge (e);
/* Update SWITCH_EXPR case label vector. */
for (i = 0; VEC_iterate (switch_update, to_update_switch_stmts, i, su); ++i)
SWITCH_LABELS (su->stmt) = su->vec;
if (VEC_length (edge, to_remove_edges) > 0)
free_dominance_info (CDI_DOMINATORS);
VEC_free (edge, heap, to_remove_edges);
VEC_free (switch_update, heap, to_update_switch_stmts);
/* ASSERT_EXPRs must be removed before finalizing jump threads /* ASSERT_EXPRs must be removed before finalizing jump threads
as finalizing jump threads calls the CFG cleanup code which as finalizing jump threads calls the CFG cleanup code which
does not properly handle ASSERT_EXPRs. */ does not properly handle ASSERT_EXPRs. */
@ -6761,6 +6747,24 @@ execute_vrp (void)
update_ssa (TODO_update_ssa); update_ssa (TODO_update_ssa);
finalize_jump_threads (); finalize_jump_threads ();
/* Remove dead edges from SWITCH_EXPR optimization. This leaves the
CFG in a broken state and requires a cfg_cleanup run. */
for (i = 0; VEC_iterate (edge, to_remove_edges, i, e); ++i)
remove_edge (e);
/* Update SWITCH_EXPR case label vector. */
for (i = 0; VEC_iterate (switch_update, to_update_switch_stmts, i, su); ++i)
SWITCH_LABELS (su->stmt) = su->vec;
if (VEC_length (edge, to_remove_edges) > 0)
{
free_dominance_info (CDI_DOMINATORS);
cleanup_tree_cfg ();
}
VEC_free (edge, heap, to_remove_edges);
VEC_free (switch_update, heap, to_update_switch_stmts);
scev_finalize (); scev_finalize ();
loop_optimizer_finalize (); loop_optimizer_finalize ();