patches/gcc/4.7.0/100-PR52734-tree-ssa-tail-merge.patch
author "Bryan Hundven" <bryanhundven@gmail.com>
Fri Mar 23 01:36:42 2012 -0700 (2012-03-23)
changeset 2943 ededa826097f
permissions -rw-r--r--
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>
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);