patches/gcc/4.7.0/100-PR52734-tree-ssa-tail-merge.patch
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Tue Jul 31 22:27:29 2012 +0200 (2012-07-31)
changeset 3018 7776e8369284
permissions -rw-r--r--
complibs/cloog: create missing m4 dir

Because we now patch configure.in and configure, the Makefile quicks
in a re-build rule as the source files are now more recent than the
bundled generated files, and that fails because the m4 directory
is missing, although on some systems where aclocal is not installed,
the re-build rule does nothing (except a warning).

Always create tht directory.

Reported-by: Per Arnold Blaasmo <per-arnold.blaasmo@atmel.com>
[Also thanks to Thomas De Schampheleire <patrickdepinguin@gmail.com>
for some digging works on this issue]
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);