diff options
author | Richard Biener <rguenther@suse.de> | 2015-04-16 07:55:57 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-04-16 07:55:57 +0000 |
commit | 8a474dc5d7d152653e90e960eff1852d1c7ff914 (patch) | |
tree | 649c5ed590a9bcfcc0ac37c15b11b36688be346a /gcc/tree-ssa-propagate.c | |
parent | 8d1cac076c9ac75a81f15e2249ff9a92a0278516 (diff) | |
download | gcc-8a474dc5d7d152653e90e960eff1852d1c7ff914.zip gcc-8a474dc5d7d152653e90e960eff1852d1c7ff914.tar.gz gcc-8a474dc5d7d152653e90e960eff1852d1c7ff914.tar.bz2 |
tree-ssa-ccp.c (likely_value): See if we have operands that are marked as never simulate again and return...
2015-04-16 Richard Biener <rguenther@suse.de>
* tree-ssa-ccp.c (likely_value): See if we have operands that
are marked as never simulate again and return CONSTANT in this
case.
* tree-ssa-propagate.c (simulate_stmt): Mark stmts that do
not have any operands that will be simulated again as
not being simulated again.
* gcc.dg/tree-ssa/ssa-ccp-36.c: New testcase.
* gcc.dg/tree-ssa/pr37508.c: Adjust.
* gfortran.dg/reassoc_6.f: Remove XFAIL.
From-SVN: r222141
Diffstat (limited to 'gcc/tree-ssa-propagate.c')
-rw-r--r-- | gcc/tree-ssa-propagate.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index c3f9d3e..e23da70 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -366,6 +366,7 @@ simulate_stmt (gimple stmt) FOR_EACH_EDGE (e, ei, bb->succs) add_control_edge (e); } + return; } else if (val == SSA_PROP_INTERESTING) { @@ -379,6 +380,45 @@ simulate_stmt (gimple stmt) if (taken_edge) add_control_edge (taken_edge); } + + /* If there are no SSA uses on the stmt whose defs are simulated + again then this stmt will be never visited again. */ + bool has_simulate_again_uses = false; + use_operand_p use_p; + ssa_op_iter iter; + if (gimple_code (stmt) == GIMPLE_PHI) + { + edge_iterator ei; + edge e; + tree arg; + FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->preds) + if (!(e->flags & EDGE_EXECUTABLE) + || ((arg = PHI_ARG_DEF_FROM_EDGE (stmt, e)) + && TREE_CODE (arg) == SSA_NAME + && !SSA_NAME_IS_DEFAULT_DEF (arg) + && prop_simulate_again_p (SSA_NAME_DEF_STMT (arg)))) + { + has_simulate_again_uses = true; + break; + } + } + else + FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE) + { + gimple def_stmt = SSA_NAME_DEF_STMT (USE_FROM_PTR (use_p)); + if (!gimple_nop_p (def_stmt) + && prop_simulate_again_p (def_stmt)) + { + has_simulate_again_uses = true; + break; + } + } + if (!has_simulate_again_uses) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, "marking stmt to be not simulated again\n"); + prop_set_simulate_again (stmt, false); + } } /* Process an SSA edge worklist. WORKLIST is the SSA edge worklist to |