Commit 0a4bf1d3 by Richard Guenther Committed by Richard Biener

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
parent 1f3f27a4
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
......
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
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;
}
...@@ -6734,20 +6734,6 @@ execute_vrp (void) ...@@ -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) ...@@ -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 ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment