bryanhundven@2943
|
1 |
------------------------------------------------------------------------
|
bryanhundven@2943
|
2 |
r186424 | vries | 2012-04-13 18:44:18 +0200 (Fri, 13 Apr 2012) | 12 lines
|
bryanhundven@2943
|
3 |
|
bryanhundven@2943
|
4 |
2012-04-13 Tom de Vries <tom@codesourcery.com>
|
bryanhundven@2943
|
5 |
|
bryanhundven@2943
|
6 |
Backport from mainline r186418.
|
bryanhundven@2943
|
7 |
|
bryanhundven@2943
|
8 |
2012-04-13 Tom de Vries <tom@codesourcery.com>
|
bryanhundven@2943
|
9 |
|
bryanhundven@2943
|
10 |
* tree-ssa-tail-merge.c (gsi_advance_bw_nondebug_nonlocal): Add
|
bryanhundven@2943
|
11 |
parameters vuse and vuse_escaped.
|
bryanhundven@2943
|
12 |
(find_duplicate): Init vuse1, vuse2 and vuse_escaped. Pass to
|
bryanhundven@2943
|
13 |
gsi_advance_bw_nondebug_nonlocal. Return if vuse_escaped and
|
bryanhundven@2943
|
14 |
vuse1 != vuse2.
|
bryanhundven@2943
|
15 |
|
bryanhundven@2943
|
16 |
------------------------------------------------------------------------
|
bryanhundven@2943
|
17 |
Index: gcc/tree-ssa-tail-merge.c
|
bryanhundven@2943
|
18 |
===================================================================
|
bryanhundven@2943
|
19 |
--- gcc-4.7.0/gcc/tree-ssa-tail-merge.c (revision 186423)
|
bryanhundven@2943
|
20 |
+++ gcc-4.7.0/gcc/tree-ssa-tail-merge.c (revision 186424)
|
bryanhundven@2943
|
21 |
@@ -1123,18 +1123,31 @@
|
bryanhundven@2943
|
22 |
}
|
bryanhundven@2943
|
23 |
}
|
bryanhundven@2943
|
24 |
|
bryanhundven@2943
|
25 |
-/* Let GSI skip backwards over local defs. */
|
bryanhundven@2943
|
26 |
+/* Let GSI skip backwards over local defs. Return the earliest vuse in VUSE.
|
bryanhundven@2943
|
27 |
+ Return true in VUSE_ESCAPED if the vuse influenced a SSA_OP_DEF of one of the
|
bryanhundven@2943
|
28 |
+ processed statements. */
|
bryanhundven@2943
|
29 |
|
bryanhundven@2943
|
30 |
static void
|
bryanhundven@2943
|
31 |
-gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi)
|
bryanhundven@2943
|
32 |
+gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi, tree *vuse,
|
bryanhundven@2943
|
33 |
+ bool *vuse_escaped)
|
bryanhundven@2943
|
34 |
{
|
bryanhundven@2943
|
35 |
gimple stmt;
|
bryanhundven@2943
|
36 |
+ tree lvuse;
|
bryanhundven@2943
|
37 |
|
bryanhundven@2943
|
38 |
while (true)
|
bryanhundven@2943
|
39 |
{
|
bryanhundven@2943
|
40 |
if (gsi_end_p (*gsi))
|
bryanhundven@2943
|
41 |
return;
|
bryanhundven@2943
|
42 |
stmt = gsi_stmt (*gsi);
|
bryanhundven@2943
|
43 |
+
|
bryanhundven@2943
|
44 |
+ lvuse = gimple_vuse (stmt);
|
bryanhundven@2943
|
45 |
+ if (lvuse != NULL_TREE)
|
bryanhundven@2943
|
46 |
+ {
|
bryanhundven@2943
|
47 |
+ *vuse = lvuse;
|
bryanhundven@2943
|
48 |
+ if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_DEF))
|
bryanhundven@2943
|
49 |
+ *vuse_escaped = true;
|
bryanhundven@2943
|
50 |
+ }
|
bryanhundven@2943
|
51 |
+
|
bryanhundven@2943
|
52 |
if (!(is_gimple_assign (stmt) && local_def (gimple_get_lhs (stmt))
|
bryanhundven@2943
|
53 |
&& !gimple_has_side_effects (stmt)))
|
bryanhundven@2943
|
54 |
return;
|
bryanhundven@2943
|
55 |
@@ -1150,9 +1163,11 @@
|
bryanhundven@2943
|
56 |
{
|
bryanhundven@2943
|
57 |
gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1);
|
bryanhundven@2943
|
58 |
gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2);
|
bryanhundven@2943
|
59 |
+ tree vuse1 = NULL_TREE, vuse2 = NULL_TREE;
|
bryanhundven@2943
|
60 |
+ bool vuse_escaped = false;
|
bryanhundven@2943
|
61 |
|
bryanhundven@2943
|
62 |
- gsi_advance_bw_nondebug_nonlocal (&gsi1);
|
bryanhundven@2943
|
63 |
- gsi_advance_bw_nondebug_nonlocal (&gsi2);
|
bryanhundven@2943
|
64 |
+ gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
|
bryanhundven@2943
|
65 |
+ gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
|
bryanhundven@2943
|
66 |
|
bryanhundven@2943
|
67 |
while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2))
|
bryanhundven@2943
|
68 |
{
|
bryanhundven@2943
|
69 |
@@ -1161,13 +1176,20 @@
|
bryanhundven@2943
|
70 |
|
bryanhundven@2943
|
71 |
gsi_prev_nondebug (&gsi1);
|
bryanhundven@2943
|
72 |
gsi_prev_nondebug (&gsi2);
|
bryanhundven@2943
|
73 |
- gsi_advance_bw_nondebug_nonlocal (&gsi1);
|
bryanhundven@2943
|
74 |
- gsi_advance_bw_nondebug_nonlocal (&gsi2);
|
bryanhundven@2943
|
75 |
+ gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1, &vuse_escaped);
|
bryanhundven@2943
|
76 |
+ gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2, &vuse_escaped);
|
bryanhundven@2943
|
77 |
}
|
bryanhundven@2943
|
78 |
|
bryanhundven@2943
|
79 |
if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2)))
|
bryanhundven@2943
|
80 |
return;
|
bryanhundven@2943
|
81 |
|
bryanhundven@2943
|
82 |
+ /* If the incoming vuses are not the same, and the vuse escaped into an
|
bryanhundven@2943
|
83 |
+ SSA_OP_DEF, then merging the 2 blocks will change the value of the def,
|
bryanhundven@2943
|
84 |
+ which potentially means the semantics of one of the blocks will be changed.
|
bryanhundven@2943
|
85 |
+ TODO: make this check more precise. */
|
bryanhundven@2943
|
86 |
+ if (vuse_escaped && vuse1 != vuse2)
|
bryanhundven@2943
|
87 |
+ return;
|
bryanhundven@2943
|
88 |
+
|
bryanhundven@2943
|
89 |
if (dump_file)
|
bryanhundven@2943
|
90 |
fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n",
|
bryanhundven@2943
|
91 |
bb1->index, bb2->index);
|