This commit is contained in:
Jakub Jelinek 2010-03-16 16:10:16 +00:00
parent 1ba2e86ef4
commit f6f9558cad
5 changed files with 20 additions and 339 deletions

View File

@ -1,2 +1,2 @@
fastjar-0.97.tar.gz
gcc-4.4.3-20100309.tar.bz2
gcc-4.4.3-20100316.tar.bz2

View File

@ -1,12 +1,12 @@
%global DATE 20100309
%global SVNREV 157326
%global DATE 20100316
%global SVNREV 157487
%global gcc_version 4.4.3
# Note, gcc_release must be integer, if you want to add suffixes to
# %{release}, append them after %{gcc_release} on Release: line.
%global gcc_release 9
%global gcc_release 10
%global _unpackaged_files_terminate_build 0
%global multilib_64_archs sparc64 ppc64 s390x x86_64
%if 0%{?fedora} >= 13
%if 0%{?fedora} >= 13 || 0%{?rhel} >= 6
%global include_gappletviewer 0
%else
%global include_gappletviewer 1
@ -176,7 +176,6 @@ Patch17: gcc44-pr38757.patch
Patch18: gcc44-libstdc++-docs.patch
Patch19: gcc44-ppc64-aixdesc.patch
Patch20: gcc44-no-add-needed.patch
Patch21: gcc44-pr43051.patch
Patch1000: fastjar-0.97-segfault.patch
Patch1001: fastjar-0.97-len1.patch
@ -488,7 +487,6 @@ which are required to compile with the GNAT.
%if 0%{?fedora} >= 13
%patch20 -p0 -b .no-add-needed~
%endif
#%patch21 -p0 -b .pr43051~
# This testcase doesn't compile.
rm libjava/testsuite/libjava.lang/PR35020*
@ -1878,6 +1876,19 @@ fi
%doc rpm.doc/changelogs/libmudflap/ChangeLog*
%changelog
* Tue Mar 16 2010 Jakub Jelinek <jakub@redhat.com> 4.4.3-10
- update from gcc-4_4-branch
- PRs fortran/43228, fortran/43303, libfortran/43265, libfortran/43320
- VTA backports
- PRs debug/36728, debug/43051, debug/43092, debug/43290,
tree-optimization/42917, tree-optimization/43317
- fix non-localized vars handling and forwarder block merging
(#572260, PR debug/43329)
%if 0%{?rhel} >= 6
- remove gappletviewer, gcjwebplugin and related files even for
RHEL, as xulrunner got updated to 1.9.2.1
%endif
* Tue Mar 9 2010 Jakub Jelinek <jakub@redhat.com> 4.4.3-9
- update from gcc-4_4-branch
- PRs ada/42253, bootstrap/43121, c/43248, tree-optimization/43220

View File

@ -1,331 +0,0 @@
2010-02-17 Alexandre Oliva <aoliva@redhat.com>
* var-tracking.c (dataflow_set_preserve_mem_locs): Update cur_loc.
2010-02-17 Jakub Jelinek <jakub@redhat.com>
PR debug/43051
* var-tracking.c (struct dfset_merge): Move definition earlier.
(value_pair): New variable.
(ignore_first_value_pair): New function.
(find_loc_in_1pdv_1): Change last argument to struct dfset_merge *.
If node->loc is VALUE, don't call rtx_equal_p at all, instead just
compare pointers and then recurse. For other rtxes, call
rtx_equal_p_cb instead of rtx_equal_p and ignore first VALUE pair
during comparison, if some has been found, compare those VALUEs
recursively.
(find_loc_in_1pdv): Change last argument to struct dfset_merge *.
(intersect_loc_chains, variable_post_merge_perm_vals): Adjust callers.
* gcc.dg/guality/pr43051-1.c: New test.
--- gcc/var-tracking.c.jj 2010-02-07 11:53:22.000000000 +0100
+++ gcc/var-tracking.c 2010-02-15 12:37:00.000000000 +0100
@@ -428,7 +428,8 @@ static int variable_union_info_cmp_pos (
static int variable_union (void **, void *);
static int variable_canonicalize (void **, void *);
static void dataflow_set_union (dataflow_set *, dataflow_set *);
-static location_chain find_loc_in_1pdv (rtx, variable, htab_t);
+struct dfset_merge;
+static location_chain find_loc_in_1pdv (rtx, variable, struct dfset_merge *);
static bool canon_value_cmp (rtx, rtx);
static int loc_cmp (rtx, rtx);
static bool variable_part_different_p (variable_part *, variable_part *);
@@ -2234,6 +2235,53 @@ dv_changed_p (decl_or_value dv)
: DECL_CHANGED (dv_as_decl (dv)));
}
+/* Hash table iteration argument passed to variable_merge. */
+struct dfset_merge
+{
+ /* The set in which the merge is to be inserted. */
+ dataflow_set *dst;
+ /* The set that we're iterating in. */
+ dataflow_set *cur;
+ /* The set that may contain the other dv we are to merge with. */
+ dataflow_set *src;
+ /* Number of onepart dvs in src. */
+ int src_onepart_cnt;
+};
+
+/* First encountered differing VALUE pair remembered by
+ ignore_first_value_pair hook. */
+
+static rtx value_pair[2];
+
+/* Helper for rtx_equal_p_cb. Pretend the first encountered VALUE pair
+ is the same and remember it. */
+
+static int
+ignore_first_value_pair (const_rtx *px, const_rtx *py, rtx *nx, rtx *ny)
+{
+ const_rtx x = *px, y;
+
+ if (GET_CODE (x) != VALUE)
+ return 0;
+ y = *py;
+ if (GET_CODE (y) != VALUE)
+ return 0;
+ if (x == y)
+ return 0;
+ if (GET_MODE (x) != GET_MODE (y))
+ return 0;
+ /* If this isn't the first encountered VALUE pair, fail. */
+ if (value_pair[0])
+ return 0;
+ /* Remember the first encountered VALUE pair and pretend the VALUEs are the
+ same. */
+ value_pair[0] = CONST_CAST_RTX (x);
+ value_pair[1] = CONST_CAST_RTX (y);
+ *nx = CONST_CAST_RTX (x);
+ *ny = CONST_CAST_RTX (x);
+ return 1;
+}
+
/* Vector of VALUEs that should have VALUE_RECURSED_INTO bit cleared
at the end of find_loc_in_1pdv. Not a static variable in find_loc_in_1pdv
to avoid constant allocation/freeing of it. */
@@ -2245,7 +2293,7 @@ static VEC(rtx, heap) *values_to_unmark;
any values recursively mentioned in the location lists. */
static location_chain
-find_loc_in_1pdv_1 (rtx loc, variable var, htab_t vars)
+find_loc_in_1pdv_1 (rtx loc, variable var, struct dfset_merge *dsm)
{
location_chain node;
@@ -2260,22 +2308,65 @@ find_loc_in_1pdv_1 (rtx loc, variable va
gcc_assert (var->var_part[0].offset == 0);
for (node = var->var_part[0].loc_chain; node; node = node->next)
- if (rtx_equal_p (loc, node->loc))
- return node;
- else if (GET_CODE (node->loc) == VALUE
- && !VALUE_RECURSED_INTO (node->loc))
+ if (GET_CODE (node->loc) == VALUE)
{
- decl_or_value dv = dv_from_value (node->loc);
- variable var = (variable)
- htab_find_with_hash (vars, dv, dv_htab_hash (dv));
+ if (loc == node->loc)
+ return node;
+ if (!VALUE_RECURSED_INTO (node->loc))
+ {
+ decl_or_value dv = dv_from_value (node->loc);
+ htab_t vars = shared_hash_htab (dsm->src->vars);
+ variable var
+ = (variable) htab_find_with_hash (vars, dv, dv_htab_hash (dv));
- if (var)
+ if (var)
+ {
+ location_chain where;
+ VALUE_RECURSED_INTO (node->loc) = true;
+ VEC_safe_push (rtx, heap, values_to_unmark, node->loc);
+ if ((where = find_loc_in_1pdv_1 (loc, var, dsm)))
+ return where;
+ }
+ }
+ }
+ else if (GET_CODE (node->loc) == GET_CODE (loc))
+ {
+ rtx val1, val2;
+ if (!rtx_equal_p_cb (loc, node->loc, ignore_first_value_pair))
{
- location_chain where;
- VALUE_RECURSED_INTO (node->loc) = true;
- VEC_safe_push (rtx, heap, values_to_unmark, node->loc);
- if ((where = find_loc_in_1pdv_1 (loc, var, vars)))
- return where;
+ value_pair[0] = NULL;
+ value_pair[1] = NULL;
+ continue;
+ }
+ if (!value_pair[0])
+ return node;
+ val1 = value_pair[0];
+ val2 = value_pair[1];
+ value_pair[0] = NULL;
+ value_pair[1] = NULL;
+ if (dsm->cur)
+ {
+ decl_or_value dv;
+ htab_t vars;
+ variable var1, var2;
+ dv = dv_from_value (val1);
+ vars = shared_hash_htab (dsm->cur->vars);
+ var1 = (variable) htab_find_with_hash (vars, dv,
+ dv_htab_hash (dv));
+ if (var1)
+ {
+ dv = dv_from_value (val2);
+ vars = shared_hash_htab (dsm->src->vars);
+ var2 = (variable) htab_find_with_hash (vars, dv,
+ dv_htab_hash (dv));
+ if (var2)
+ {
+ location_chain s1node = var1->var_part[0].loc_chain;
+ for (; s1node; s1node = s1node->next)
+ if (find_loc_in_1pdv_1 (s1node->loc, var2, dsm))
+ return node;
+ }
+ }
}
}
@@ -2287,32 +2378,19 @@ find_loc_in_1pdv_1 (rtx loc, variable va
any values recursively mentioned in the location lists. */
static location_chain
-find_loc_in_1pdv (rtx loc, variable var, htab_t vars)
+find_loc_in_1pdv (rtx loc, variable var, struct dfset_merge *dsm)
{
location_chain ret;
unsigned int i;
rtx value;
- ret = find_loc_in_1pdv_1 (loc, var, vars);
+ ret = find_loc_in_1pdv_1 (loc, var, dsm);
for (i = 0; VEC_iterate (rtx, values_to_unmark, i, value); i++)
VALUE_RECURSED_INTO (value) = false;
VEC_truncate (rtx, values_to_unmark, 0);
return ret;
}
-/* Hash table iteration argument passed to variable_merge. */
-struct dfset_merge
-{
- /* The set in which the merge is to be inserted. */
- dataflow_set *dst;
- /* The set that we're iterating in. */
- dataflow_set *cur;
- /* The set that may contain the other dv we are to merge with. */
- dataflow_set *src;
- /* Number of onepart dvs in src. */
- int src_onepart_cnt;
-};
-
/* Insert LOC in *DNODE, if it's not there yet. The list must be in
loc_cmp order, and it is maintained as such. */
@@ -2351,7 +2429,6 @@ intersect_loc_chains (rtx val, location_
location_chain s1node, variable s2var)
{
dataflow_set *s1set = dsm->cur;
- dataflow_set *s2set = dsm->src;
location_chain found;
for (; s1node; s1node = s1node->next)
@@ -2359,8 +2436,7 @@ intersect_loc_chains (rtx val, location_
if (s1node->loc == val)
continue;
- if ((found = find_loc_in_1pdv (s1node->loc, s2var,
- shared_hash_htab (s2set->vars))))
+ if ((found = find_loc_in_1pdv (s1node->loc, s2var, dsm)))
{
insert_into_intersection (dest, s1node->loc,
MIN (s1node->init, found->init));
@@ -3592,7 +3668,10 @@ variable_post_merge_perm_vals (void **ps
var = shared_hash_find (set->vars, dv);
if (var)
{
- if (find_loc_in_1pdv (pnode->loc, var, shared_hash_htab (set->vars)))
+ struct dfset_merge dsm;
+ memset (&dsm, '\0', sizeof (dsm));
+ dsm.src = set;
+ if (find_loc_in_1pdv (pnode->loc, var, &dsm))
return 1;
val_reset (set, dv);
}
@@ -3808,6 +3808,7 @@ dataflow_set_preserve_mem_locs (void **s
{
tree decl = dv_as_decl (var->dv);
location_chain loc, *locp;
+ bool changed = false;
if (!var->n_var_parts)
return 1;
@@ -3881,6 +3882,9 @@ dataflow_set_preserve_mem_locs (void **s
if (emit_notes)
remove_value_chains (var->dv, old_loc);
*locp = loc->next;
+ if (var->var_part[0].cur_loc
+ && rtx_equal_p (loc->loc, var->var_part[0].cur_loc))
+ changed = true;
pool_free (loc_chain_pool, loc);
}
@@ -3889,6 +3893,12 @@ dataflow_set_preserve_mem_locs (void **s
var->n_var_parts--;
if (emit_notes && dv_is_value_p (var->dv))
remove_cselib_value_chains (var->dv);
+ gcc_assert (changed);
+ }
+ if (changed)
+ {
+ if (var->n_var_parts && var->var_part[0].loc_chain)
+ var->var_part[0].cur_loc = var->var_part[0].loc_chain->loc;
variable_was_changed (var, set);
}
}
--- gcc/testsuite/gcc.dg/guality/pr43051-1.c.jj 2010-02-17 10:17:12.000000000 +0100
+++ gcc/testsuite/gcc.dg/guality/pr43051-1.c 2010-02-17 10:41:43.000000000 +0100
@@ -0,0 +1,57 @@
+/* PR debug/43051 */
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+extern void abort (void);
+
+static void __attribute__ ((noinline))
+foo (const char *x, long long y, int z)
+{
+ asm volatile ("" : : "r" (x), "r" ((int) y), "r" (z) : "memory");
+}
+
+struct S
+{
+ struct S *n;
+ int v;
+};
+
+struct S a[10];
+
+struct S * __attribute__ ((noinline))
+bar (struct S *c, int v, struct S *e)
+{
+#ifdef __i386__
+ register int si asm ("esi"), di asm ("edi"), bx
+# if !defined (__pic__) && !defined (__APPLE__)
+ asm ("ebx")
+# endif
+ ;
+ asm volatile ("" : "=r" (si), "=r" (di), "=r" (bx));
+#endif
+ while (c < e)
+ {
+ foo ("c", (unsigned long) c, 0); /* { dg-final { gdb-test 34 "c" "\&a\[0\]" } } */
+ foo ("v", v, 1); /* { dg-final { gdb-test 35 "v" "1" } } */
+ foo ("e", (unsigned long) e, 2); /* { dg-final { gdb-test 36 "e" "\&a\[1\]" } } */
+ if (c->v == v)
+ return c;
+ foo ("c", (unsigned long) c, 3); /* { dg-final { gdb-test 39 "c" "\&a\[0\]" } } */
+ foo ("v", v, 4); /* { dg-final { gdb-test 40 "v" "1" } } */
+ foo ("e", (unsigned long) e, 5); /* { dg-final { gdb-test 41 "e" "\&a\[1\]" } } */
+ c++;
+ }
+#ifdef __i386__
+ asm volatile ("" : : "r" (si), "r" (di), "r" (bx));
+#endif
+ return 0;
+}
+
+int
+main ()
+{
+ asm volatile ("" : : "r" (&a[0]) : "memory");
+ if (bar (&a[a[0].v], a[0].v + 1, &a[a[0].v + 1]))
+ abort ();
+ return 0;
+}

View File

@ -10,3 +10,4 @@ gcc-4_4_3-6_fc13:HEAD:gcc-4.4.3-6.fc13.src.rpm:1265925505
gcc-4_4_3-7_fc13:F-13:gcc-4.4.3-7.fc13.src.rpm:1266793373
gcc-4_4_3-8_fc13:F-13:gcc-4.4.3-8.fc13.src.rpm:1267230097
gcc-4_4_3-9_fc13:F-13:gcc-4.4.3-9.fc13.src.rpm:1268168014
gcc-4_4_3-10_fc13:F-13:gcc-4.4.3-10.fc13.src.rpm:1268755563

View File

@ -1,2 +1,2 @@
2659f09c2e43ef8b7d4406321753f1b2 fastjar-0.97.tar.gz
2906b19113678f1ec9841b33b4b59553 gcc-4.4.3-20100309.tar.bz2
f13b75fdfee662d1d214a0c4820a2d8a gcc-4.4.3-20100316.tar.bz2