===================================================================
@@ -35,6 +35,7 @@ along with GCC; see the file COPYING3.
#include "tree-pass.h"
#include "gimple-ssa.h"
#include "tree-phinodes.h"
+#include "cfghooks.h"
static int max_threaded_paths;
@@ -206,8 +207,9 @@ profitable_jump_thread_path (vec<basic_b
/* Note that if both NAME and DST are anonymous
SSA_NAMEs, then we do not have enough information
to consider them associated. */
- if ((SSA_NAME_VAR (dst) != SSA_NAME_VAR (name)
- || !SSA_NAME_VAR (dst))
+ if (dst != name
+ && (SSA_NAME_VAR (dst) != SSA_NAME_VAR (name)
+ || !SSA_NAME_VAR (dst))
&& !virtual_operand_p (dst))
++n_insns;
}
@@ -560,9 +562,13 @@ fsm_find_control_statement_thread_paths
edge taken_edge = profitable_jump_thread_path (path, bbi, name, arg);
if (taken_edge)
{
+ /* If the taken edge is a loop entry avoid mashing two
+ loops into one with multiple latches by splitting
+ the edge. */
if (bb_loop_depth (taken_edge->src)
- >= bb_loop_depth (taken_edge->dest))
- convert_and_register_jump_thread_path (path, taken_edge);
+ < bb_loop_depth (taken_edge->dest))
+ split_edge (taken_edge);
+ convert_and_register_jump_thread_path (path, taken_edge);
path->pop ();
}
}
@@ -586,9 +592,13 @@ fsm_find_control_statement_thread_paths
name, arg);
if (taken_edge)
{
+ /* If the taken edge is a loop entry avoid mashing two
+ loops into one with multiple latches by splitting
+ the edge. */
if (bb_loop_depth (taken_edge->src)
- >= bb_loop_depth (taken_edge->dest))
- convert_and_register_jump_thread_path (path, taken_edge);
+ < bb_loop_depth (taken_edge->dest))
+ split_edge (taken_edge);
+ convert_and_register_jump_thread_path (path, taken_edge);
path->pop ();
}