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>
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>
* 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)
ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
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
as finalizing jump threads calls the CFG cleanup code which
does not properly handle ASSERT_EXPRs. */
......@@ -6761,6 +6747,24 @@ execute_vrp (void)
update_ssa (TODO_update_ssa);
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 ();
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