aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-im.c
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2015-12-10 09:34:43 -0700
committerJeff Law <law@gcc.gnu.org>2015-12-10 09:34:43 -0700
commit3daacdcd5f20d084294f2cc50f84e3e8769205f1 (patch)
treed015d8a16670f07cb924dc37566a552de34a31e7 /gcc/tree-ssa-loop-im.c
parent9dd920ab7090041bc4983209b0807c69339299f8 (diff)
downloadgcc-3daacdcd5f20d084294f2cc50f84e3e8769205f1.zip
gcc-3daacdcd5f20d084294f2cc50f84e3e8769205f1.tar.gz
gcc-3daacdcd5f20d084294f2cc50f84e3e8769205f1.tar.bz2
re PR tree-optimization/68619 (error: loop with header 6 not in loop tree)
2015-12-10 Jeff Law <law@redhat.com> PR tree-optimization/68619 * tree-ssa-dom.c (dom_opt_dom_walker::before_dom_children): Propgate return value from optimize_stmt. (dom_opt_dom_walker): Add new argument to dom_walker constructor. (pass_dominator:execute): If a block has an unreachable edge, remove all jump threads through any successor of the affected block. (record_equivalences_from_phis): Ignore alternative if the edge does not have EDGE_EXECUTABLE set. (single_incoming_edge_ignoring_loop_edges): Similarly. (optimize_stmt): If a gimple_code has a compile-time constant condition, return the edge taken for that constant value. Also change the condition to true/false as necessary. * domwalk.h (dom_walker::dom_walker): Add new argument skip_unreachable_blocks. Don't provide empty constructor body. (dom_walker::before_dom_children): Change return type. (dom_walker::bb_reachable): Declare new private method. (dom_walker::propagate_unreachable_to_edges): Likewise. (dom_walker::m_unreachable_dom): Declare new private data member. (dom_walker::m_skip_unreachable_blocks): Likewise. * domwalk.c: Include dumpfile.h. (dom_walker::dom_walker): New constructor. Initialize private data members. If needed, set EDGE_EXECUTABLE for all edges in the CFG, extracted from tree-ssa-sccvn.c. (dom_walker::bb_reachable): New method extracted from tree-ssa-sccvn.c (dom_walker::propagate_unreachable_to_edges): Likewise. (dom_walker::walk): Only call before_dom_children on reachable blocks. If before_dom_children returns an edge, then clear EDGE_EXECUTABLE for all other outgoing edges from the same block. For unreachable blocks, call propagate_unreachable_to_edges. Similarly, only call after_dom_children on reachable blocks. For unreachable blocks, conditionally clear m_unreachable_dom. * tree-ssa-sccvn.c (sccvn_dom_walker::unreachable_dom): Remove private data member. (sccvn_dom_walker::after_dom_children): Use methods from dom_walker class. (run_scc_vn): Likewise. (sccvn_dom_walker::before_dom_children): Likewise. Return the taken outgoing edge if a COND, SWITCH, or GOTO are optimized. * compare-elim.c (find_comparison_dom_walker::before_dom_children): Change return type to an edge. Always return NULL. * fwprop.c (single_def_use_dom_walker::before_dom_children): Likewise. * gimple-ssa-strength-reduction.c (find_candidates_dom_walker::before_dom_children): Likewise. * ipa-prop.c (analysis_dom_walker::before_dom_children): Likewise. (ipcp_modif_dom_walker::before_dom_children): Likewise. * tree-into-ssa.c (rewrite_dom_walker::before_dom_children): Likewise. (rewrite_update_dom_walker::before_dom_children): Likewise. (mark_def_dom_children::before_dom_children): Likewise. * tree-ssa-dse.c (dse_dom_walker::before_dom_children): Likewise. * tree-ssa-loop-im.c (invariantness_dom_walker::before_dom_children): Likewise. (move_computations_dom_walker::before_dom_walker): Likewise. * tree-ssa-phiopt.c (nontrapping_dom_walker::before_dom_children): Likewise. * tree-ssa-pre.c (eliminate_dom_walker::before_dom_children): Likewise. * tree-ssa-propagate.c (substitute_and_fold_dom_walker::before_dom_children): Likewise. * tree-ssa-strlen.c (strlen_dom_walker::before_dom_children): Likewise. * tree-ssa-uncprop.c (uncprop_dom_walker::before_dom_children): Likewise. PR tree-optimization/68619 * gcc.dg/tree-ssa/pr68619-1.c: New test. * gcc.dg/tree-ssa/pr68619-2.c: New test. * gcc.dg/tree-ssa/pr68619-3.c: New test. * gcc.dg/tree-ssa/pr68619-4.c: New test. * gcc.dg/tree-ssa/pr68619-5.c: New test. From-SVN: r231527
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r--gcc/tree-ssa-loop-im.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 0d82d36..9b1b815 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -958,14 +958,14 @@ public:
invariantness_dom_walker (cdi_direction direction)
: dom_walker (direction) {}
- virtual void before_dom_children (basic_block);
+ virtual edge before_dom_children (basic_block);
};
/* Determine the outermost loops in that statements in basic block BB are
invariant, and record them to the LIM_DATA associated with the statements.
Callback for dom_walker. */
-void
+edge
invariantness_dom_walker::before_dom_children (basic_block bb)
{
enum move_pos pos;
@@ -976,7 +976,7 @@ invariantness_dom_walker::before_dom_children (basic_block bb)
struct lim_aux_data *lim_data;
if (!loop_outer (bb->loop_father))
- return;
+ return NULL;
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Basic block %d (loop %d -- depth %d):\n\n",
@@ -1094,6 +1094,7 @@ invariantness_dom_walker::before_dom_children (basic_block bb)
if (lim_data->cost >= LIM_EXPENSIVE)
set_profitable_level (stmt);
}
+ return NULL;
}
class move_computations_dom_walker : public dom_walker
@@ -1102,7 +1103,7 @@ public:
move_computations_dom_walker (cdi_direction direction)
: dom_walker (direction), todo_ (0) {}
- virtual void before_dom_children (basic_block);
+ virtual edge before_dom_children (basic_block);
unsigned int todo_;
};
@@ -1111,7 +1112,7 @@ public:
data stored in LIM_DATA structures associated with each statement. Callback
for walk_dominator_tree. */
-void
+edge
move_computations_dom_walker::before_dom_children (basic_block bb)
{
struct loop *level;
@@ -1119,7 +1120,7 @@ move_computations_dom_walker::before_dom_children (basic_block bb)
struct lim_aux_data *lim_data;
if (!loop_outer (bb->loop_father))
- return;
+ return NULL;
for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi); )
{
@@ -1265,6 +1266,7 @@ move_computations_dom_walker::before_dom_children (basic_block bb)
else
gsi_insert_on_edge (e, stmt);
}
+ return NULL;
}
/* Hoist the statements out of the loops prescribed by data stored in