mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
1f3f27a4e0
commit
0a4bf1d371
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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 ();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue