From 3629b6d931fbce2c51ef84d4580115e6a509616e Mon Sep 17 00:00:00 2001
From: "Yann E. MORIN\"" <yann.morin.1998@free.fr>
Date: Fri, 23 Mar 2012 01:36:42 -0700
Subject: 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>
---
 config/cc/gcc.in                                   | 21 +++++
 .../4.7.0/100-PR52734-tree-ssa-tail-merge.patch    | 91 ++++++++++++++++++++++
 2 files changed, 112 insertions(+)
 create mode 100644 patches/gcc/4.7.0/100-PR52734-tree-ssa-tail-merge.patch

diff --git a/config/cc/gcc.in b/config/cc/gcc.in
index f64e299c..bbfef591 100644
--- a/config/cc/gcc.in
+++ b/config/cc/gcc.in
@@ -36,6 +36,12 @@ choice
 # Don't remove next line
 # CT_INSERT_VERSION_BELOW
 
+config CC_V_4_7_0
+    bool
+    prompt "4.7.0 (EXPERIMENTAL)"
+    depends on EXPERIMENTAL
+    select CC_GCC_4_7
+
 config CC_V_linaro_4_6_2012_04
     bool
     prompt "linaro-4.6-2012.04 (EXPERIMENTAL)"
@@ -269,6 +275,20 @@ config CC_GCC_4_6_or_later
     bool
     select CC_GCC_4_5_or_later
 
+config CC_GCC_4_7
+    bool
+    select CC_GCC_4_7_or_later
+    select CC_GCC_USE_GMP_MPFR
+    select CC_GCC_USE_MPC
+    select CC_GCC_HAS_GRAPHITE
+    select CC_GCC_HAS_LTO
+    select CC_GCC_HAS_PKGVERSION_BUGURL
+    select CC_GCC_HAS_BUILD_ID
+
+config CC_GCC_4_7_or_later
+    bool
+    select CC_GCC_4_6_or_later
+
 config CC_GCC_HAS_GRAPHITE
     bool
 
@@ -331,6 +351,7 @@ config CC_VERSION
     string
 # Don't remove next line
 # CT_INSERT_VERSION_STRING_BELOW
+    default "4.7.0" if CC_V_4_7_0
     default "linaro-4.6-2012.04" if CC_V_linaro_4_6_2012_04
     default "4.6.3" if CC_V_4_6_3
     default "4.6.2" if CC_V_4_6_2
diff --git a/patches/gcc/4.7.0/100-PR52734-tree-ssa-tail-merge.patch b/patches/gcc/4.7.0/100-PR52734-tree-ssa-tail-merge.patch
new file mode 100644
index 00000000..5df54311
--- /dev/null
+++ b/patches/gcc/4.7.0/100-PR52734-tree-ssa-tail-merge.patch
@@ -0,0 +1,91 @@
+------------------------------------------------------------------------
+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);
-- 
cgit v1.2.3