This, as suggested in the PR arranges update_address_taken to be run before forwprop. The patch simply moves it to after CCP instead of before alias computation.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2012-09-14 Richard Guenther <rguent...@suse.de> PR tree-optimization/54565 * passes.c (init_optimization_passes): Adjust comments. (execute_function_todo): Do not execute execute_update_addresses_taken before processing TODO_rebuild_alias. * tree-ssa-ccp.c (do_ssa_ccp): Schedule TODO_update_address_taken. * gcc.dg/tree-ssa/ssa-ccp-17.c: Adjust. * gcc.dg/tree-ssa/forwprop-6.c: Likewise. Remove XFAIL. Index: gcc/passes.c =================================================================== --- gcc/passes.c (revision 191289) +++ gcc/passes.c (working copy) @@ -1297,11 +1297,11 @@ init_optimization_passes (void) NEXT_PASS (pass_remove_cgraph_callee_edges); NEXT_PASS (pass_rename_ssa_copies); NEXT_PASS (pass_ccp); + /* After CCP we rewrite no longer addressed locals into SSA + form if possible. */ NEXT_PASS (pass_forwprop); /* pass_build_ealias is a dummy pass that ensures that we - execute TODO_rebuild_alias at this point. Re-building - alias information also rewrites no longer addressed - locals into SSA form if possible. */ + execute TODO_rebuild_alias at this point. */ NEXT_PASS (pass_build_ealias); NEXT_PASS (pass_sra_early); NEXT_PASS (pass_fre); @@ -1371,11 +1371,11 @@ init_optimization_passes (void) NEXT_PASS (pass_rename_ssa_copies); NEXT_PASS (pass_complete_unrolli); NEXT_PASS (pass_ccp); + /* After CCP we rewrite no longer addressed locals into SSA + form if possible. */ NEXT_PASS (pass_forwprop); /* pass_build_alias is a dummy pass that ensures that we - execute TODO_rebuild_alias at this point. Re-building - alias information also rewrites no longer addressed - locals into SSA form if possible. */ + execute TODO_rebuild_alias at this point. */ NEXT_PASS (pass_build_alias); NEXT_PASS (pass_return_slot); NEXT_PASS (pass_phiprop); @@ -1414,6 +1414,8 @@ init_optimization_passes (void) NEXT_PASS (pass_object_sizes); NEXT_PASS (pass_strlen); NEXT_PASS (pass_ccp); + /* After CCP we rewrite no longer addressed locals into SSA + form if possible. */ NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_cse_sincos); NEXT_PASS (pass_optimize_bswap); @@ -1773,13 +1775,10 @@ execute_function_todo (void *data) cfun->last_verified &= ~TODO_verify_ssa; } - if (flags & TODO_rebuild_alias) - { - execute_update_addresses_taken (); - if (flag_tree_pta) - compute_may_aliases (); - } - else if (optimize && (flags & TODO_update_address_taken)) + if (flag_tree_pta && (flags & TODO_rebuild_alias)) + compute_may_aliases (); + + if (optimize && (flags & TODO_update_address_taken)) execute_update_addresses_taken (); if (flags & TODO_remove_unused_locals) Index: gcc/tree-ssa-ccp.c =================================================================== --- gcc/tree-ssa-ccp.c (revision 191289) +++ gcc/tree-ssa-ccp.c (working copy) @@ -2105,7 +2105,8 @@ do_ssa_ccp (void) ccp_initialize (); ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node); if (ccp_finalize ()) - todo = (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals); + todo = (TODO_cleanup_cfg | TODO_update_ssa | TODO_remove_unused_locals + | TODO_update_address_taken); free_dominance_info (CDI_DOMINATORS); return todo; } Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-17.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-17.c (revision 191289) +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-17.c (working copy) @@ -26,7 +26,7 @@ int foobar(void) return ((const struct Foo *)p)->i; } -/* { dg-final { scan-tree-dump "= i;" "ccp1" } } */ +/* { dg-final { scan-tree-dump "= i_.;" "ccp1" } } */ /* { dg-final { scan-tree-dump "= f.i;" "ccp1" } } */ /* { dg-final { scan-tree-dump "= g.i;" "ccp1" } } */ /* { dg-final { cleanup-tree-dump "ccp1" } } */ Index: gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c (revision 191289) +++ gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c (working copy) @@ -22,6 +22,7 @@ void f(void) particular situation before doing this transformation we have to assure that a is killed by a dominating store via type float for it to be valid. Then we might as well handle the situation by - value-numbering, removing the load alltogether. */ -/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "forwprop1" { xfail *-*-* } } } */ + value-numbering, removing the load alltogether. + ??? We now do this after CPP re-writes a into SSA form. */ +/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "forwprop1" } } */ /* { dg-final { cleanup-tree-dump "forwprop1" } } */