This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Patch Ping] [RFC] Alias export patch
- From: Andrey Belevantsev <abel at ispras dot ru>
- To: Andrew MacLeod <amacleod at redhat dot com>
- Cc: Diego Novillo <dnovillo at redhat dot com>, Dmitry Melnik <dm at ispras dot ru>, Daniel Berlin <dberlin at dberlin dot org>, gcc-patches at gcc dot gnu dot org
- Date: Fri, 02 Jun 2006 19:28:31 +0400
- Subject: Re: [Patch Ping] [RFC] Alias export patch
- References: <486713706.20051121174009@ispras.ru> <653679614.20051226024922@ispras.ru> <1136267119.20826.36.camel@linux.site> <1434801581.20060222170518@ispras.ru> <444E546C.5030707@redhat.com> <444E6550.5070006@redhat.com> <1146494975.3532.114.camel@pain>
Hi Andrew and Diego,
Sorry for the delay in my answer. Following your suggestions, I've
tried the attached patch. It gives the following statistics (gathered
by write_stat calls in the patch):
C = 433 add_coalesce is called for pointers with different
points-to sets
O = 523 add_coalesce is called when one pointer has a points-to
set and the other has not
a = 10563 new disambiguations from extended alias sets when
alias_sets_conflict_p is called
x = 1954 new disambiguations from saved points-to sets when
*_dependence is called
Before the patch, it was like follows:
a = 10453
x = 2035
i.e. ~1000 chances for not coalescing meaningful pointers during a
bootstrap adds 110 new disambiguations with extended alias sets, but
removes 81 old ones with points-to sets. On SPECint2000 with -O3
-funroll-loops, we have:
before after
C = 26
O = 52
a = 11691 a = 11691
x = 1028 x = 1035
i.e. only 78 interesting calls of add_coalesce that give us 7 new
disambiguations. Given that numbers, I haven't tried to measure
performance impact because it doesn't seem like a lot of new
opportunities were created.
Does the patch look like what you've said? If so, maybe the problem is
in the way we save information from the tree ssa side. Here's the
general approach. For each pointer with non-null SSA_NAME_PTR_INFO
found in tree operands, we do the following:
mapped_ptr = var_to_partition_to_var (map, ptr);
if (mapped_ptr)
tse_update_var_ann_with_pts_info (mapped_ptr, pi);
where pi is the points-to info for original pointer. In the latter
function we extract previously saved points-to set of mapped_ptr, if it
has one, or create a brand new one if it hasn't. Then we add all vars
from ptr's points-to set to the saved set of mapped_ptr.
If you have any ideas on what could be going wrong on the tree ssa side,
then I'm happy to try them. If it looks ok, then I might start looking
on how the saved information survives through RTL optimizers.
Andrey
--- tree-ssa-live.c (revision 19384)
+++ tree-ssa-live.c (local)
@@ -1244,12 +1244,38 @@ add_coalesce (coalesce_list_p cl, int p1
int value)
{
partition_pair_p node;
+ tree t1, t2;
+ struct ptr_info_def *pi, *qi;
gcc_assert (cl->add_mode);
if (p1 == p2)
return;
+ t1 = partition_to_var (cl->map, p1);
+ t2 = partition_to_var (cl->map, p2);
+ pi = SSA_NAME_PTR_INFO (t1);
+ qi = SSA_NAME_PTR_INFO (t2);
+
+ if (pi && qi)
+ {
+ /* Do not coalesce when one pointer has a points-to set and
+ the other hasn't. */
+ if ((pi->pt_vars && !qi->pt_vars) || (!pi->pt_vars && qi->pt_vars))
+ {
+ write_stat ("O");
+ return;
+ }
+
+ /* Do not coalesce when pointers have different points-to sets. */
+ if (pi->pt_vars && qi->pt_vars
+ && !bitmap_equal_p (pi->pt_vars, qi->pt_vars))
+ {
+ write_stat ("C");
+ return;
+ }
+ }
+
node = find_partition_pair (cl, p1, p2, true);
node->cost += value;