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