From 0a4bf1d3718d9eb52fae4970455baeafda19ccd6 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 11 Apr 2008 14:14:04 +0000 Subject: [PATCH] re PR tree-optimization/35869 (ICE in calc_dfs_tree at -O2 -gnatp after VRP optimization) 2008-04-11 Richard Guenther 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 --- gcc/ChangeLog | 6 +++ gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.c-torture/compile/pr35869.c | 47 +++++++++++++++++++ gcc/tree-vrp.c | 32 +++++++------ 4 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr35869.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc19665285c..1c50391c4cd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-04-11 Richard Guenther + + 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 PR c/35744 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8e6dd394046..35112f287f4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-04-11 Richard Guenther + + PR tree-optimization/35869 + * gcc.c-torture/compile/pr35869.c: New testcase. + 2008-04-11 H.J. Lu * gcc.target/i386/sse-13.c: Move __builtin_ia32_round* to new diff --git a/gcc/testsuite/gcc.c-torture/compile/pr35869.c b/gcc/testsuite/gcc.c-torture/compile/pr35869.c new file mode 100644 index 00000000000..e83c0e86bed --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr35869.c @@ -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; +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 7ea026272b8..76477c850ac 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -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 (); -- 2.30.2