crosstool-ng/patches/gcc/4.7.0/100-PR52734-tree-ssa-tail-merge.patch
Yann E. MORIN" 3629b6d931 cc/gcc: add gcc-4.7.0
Add the new release gcc-4.7.0.

Signed-off-by: Bryan Hundven <bryanhundven@gmail.com>
[yann.morin.1998@free.fr: add 4.7.0 patch]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
2012-03-23 01:36:42 -07:00

92 lines
3.0 KiB
Diff

------------------------------------------------------------------------
r186424 | vries | 2012-04-13 18:44:18 +0200 (Fri, 13 Apr 2012) | 12 lines
2012-04-13 Tom de Vries <tom@codesourcery.com>
Backport from mainline r186418.
2012-04-13 Tom de Vries <tom@codesourcery.com>
* tree-ssa-tail-merge.c (gsi_advance_bw_nondebug_nonlocal): Add
parameters vuse and vuse_escaped.
(find_duplicate): Init vuse1, vuse2 and vuse_escaped. Pass to
gsi_advance_bw_nondebug_nonlocal. Return if vuse_escaped and
vuse1 != vuse2.
------------------------------------------------------------------------
Index: gcc/tree-ssa-tail-merge.c
===================================================================
--- gcc-4.7.0/gcc/tree-ssa-tail-merge.c (revision 186423)
+++ gcc-4.7.0/gcc/tree-ssa-tail-merge.c (revision 186424)
@@ -1123,18 +1123,31 @@
}
}
-/* Let GSI skip backwards over local defs. */
+/* Let GSI skip backwards over local defs. Return the earliest vuse in VUSE.
+ Return true in VUSE_ESCAPED if the vuse influenced a SSA_OP_DEF of one of the
+ processed statements. */
static void
-gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi)
+gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi, tree *vuse,
+ bool *vuse_escaped)
{
gimple stmt;
+ tree lvuse;
while (true)
{
if (gsi_end_p (*gsi))
return;
stmt = gsi_stmt (*gsi);
+
+ lvuse = gimple_vuse (stmt);
+ if (lvuse != NULL_TREE)
+ {
+ *vuse = lvuse;
+ if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_DEF))
+ *vuse_escaped = true;
+ }
+
if (!(is_gimple_assign (stmt) && local_def (gimple_get_lhs (stmt))
&& !gimple_has_side_effects (stmt)))
return;
@@ -1150,9 +1163,11 @@
{
gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1);
gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2);
+ tree vuse1 = NULL_TREE, vuse2 = NULL_TREE;
+ bool vuse_escaped = false;
- gsi_advance_bw_nondebug_nonlocal (&gsi1);
- gsi_advance_bw_nondebug_nonlocal (&gsi2);
+ gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
+ gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2))
{
@@ -1161,13 +1176,20 @@
gsi_prev_nondebug (&gsi1);
gsi_prev_nondebug (&gsi2);
- gsi_advance_bw_nondebug_nonlocal (&gsi1);
- gsi_advance_bw_nondebug_nonlocal (&gsi2);
+ gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
+ gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
}
if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2)))
return;
+ /* If the incoming vuses are not the same, and the vuse escaped into an
+ SSA_OP_DEF, then merging the 2 blocks will change the value of the def,
+ which potentially means the semantics of one of the blocks will be changed.
+ TODO: make this check more precise. */
+ if (vuse_escaped && vuse1 != vuse2)
+ return;
+
if (dump_file)
fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n",
bb1->index, bb2->index);