summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYann E. MORIN" <yann.morin.1998@free.fr>2012-03-23 08:36:42 (GMT)
committerBryan Hundven" <bryanhundven@gmail.com>2012-03-23 08:36:42 (GMT)
commit3629b6d931fbce2c51ef84d4580115e6a509616e (patch)
treeecb9de0bbe41a50962e03300ccaa6fa5bfaae34b
parent4d24ae539ffd1dbd0111eaa400d88171766872a0 (diff)
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>
-rw-r--r--config/cc/gcc.in21
-rw-r--r--patches/gcc/4.7.0/100-PR52734-tree-ssa-tail-merge.patch91
2 files changed, 112 insertions, 0 deletions
diff --git a/config/cc/gcc.in b/config/cc/gcc.in
index f64e299..bbfef59 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 0000000..5df5431
--- /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);