Commit c4c0f336 by Martin Liska Committed by Jan Hubicka

ipa-icf.c (sem_variable::equals): Improve debug output; get variable constructor.


2015-02-28  Martin Liska  <mliska@suse.cz>
	    Jan Hubicka   <hubicka@ucw.cz>

	* ipa-icf.c (sem_variable::equals): Improve debug output;
	get variable constructor.
	(sem_variable::parse): Do not filter out too early; give up on
	volatile and register vars.
	(sem_item_optimizer::filter_removed_items): Filter out nonreadonly
	variables.
	* ipa-icf.h (sem_variable::init): Do not set ctor.
	(sem_variable::ctor): Remove.

gcc/testsuite/ChangeLog:

2015-02-28  Martin Liska  <mliska@suse.cz>
	    Jan Hubicka   <hubicka@ucw.cz>

	* gcc.dg/ipa/ipa-icf-35.c: New test.
	* gcc.dg/ipa/ipa-icf-36.c: New test.
	* gcc.dg/ipa/ipa-icf-37.c: New test.

Co-Authored-By: Jan Hubicka <hubicka@ucw.cz>

From-SVN: r221099
parent 34a108c8
2015-02-28 Martin Liska <mliska@suse.cz>
Jan Hubicka <hubicka@ucw.cz>
* ipa-icf.c (sem_variable::equals): Improve debug output;
get variable constructor.
(sem_variable::parse): Do not filter out too early; give up on
volatile and register vars.
(sem_item_optimizer::filter_removed_items): Filter out nonreadonly
variables.
* ipa-icf.h (sem_variable::init): Do not set ctor.
(sem_variable::ctor): Remove.
2015-03-01 Aldy Hernandez <aldyh@redhat.com> 2015-03-01 Aldy Hernandez <aldyh@redhat.com>
PR middle-end/65233 PR middle-end/65233
......
...@@ -1448,18 +1448,29 @@ sem_variable::equals_wpa (sem_item *item, ...@@ -1448,18 +1448,29 @@ sem_variable::equals_wpa (sem_item *item,
/* Returns true if the item equals to ITEM given as argument. */ /* Returns true if the item equals to ITEM given as argument. */
/* Returns true if the item equals to ITEM given as argument. */
bool bool
sem_variable::equals (sem_item *item, sem_variable::equals (sem_item *item,
hash_map <symtab_node *, sem_item *> & ARG_UNUSED (ignored_nodes)) hash_map <symtab_node *, sem_item *> &)
{ {
gcc_assert (item->type == VAR); gcc_assert (item->type == VAR);
bool ret;
sem_variable *v = static_cast<sem_variable *>(item); if (DECL_INITIAL (decl) == error_mark_node && in_lto_p)
dyn_cast <varpool_node *>(node)->get_constructor ();
if (DECL_INITIAL (item->decl) == error_mark_node && in_lto_p)
dyn_cast <varpool_node *>(item->node)->get_constructor ();
if (!ctor || !v->ctor) ret = sem_variable::equals (DECL_INITIAL (decl),
return return_false_with_msg ("ctor is missing for semantic variable"); DECL_INITIAL (item->node->decl));
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file,
"Equals called for vars:%s:%s (%u:%u) (%s:%s) with result: %s\n\n",
name(), item->name (), node->order, item->node->order, asm_name (),
item->asm_name (), ret ? "true" : "false");
return sem_variable::equals (ctor, v->ctor); return ret;
} }
/* Compares trees T1 and T2 for semantic equality. */ /* Compares trees T1 and T2 for semantic equality. */
...@@ -1653,24 +1664,7 @@ sem_variable::equals (tree t1, tree t2) ...@@ -1653,24 +1664,7 @@ sem_variable::equals (tree t1, tree t2)
sem_variable * sem_variable *
sem_variable::parse (varpool_node *node, bitmap_obstack *stack) sem_variable::parse (varpool_node *node, bitmap_obstack *stack)
{ {
tree decl = node->decl; if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl))
if (node->alias)
return NULL;
bool readonly = TYPE_P (decl) ? TYPE_READONLY (decl) : TREE_READONLY (decl);
if (!readonly)
return NULL;
bool can_handle = DECL_VIRTUAL_P (decl)
|| flag_merge_constants >= 2
|| (!TREE_ADDRESSABLE (decl) && !node->externally_visible);
if (!can_handle || DECL_EXTERNAL (decl))
return NULL;
tree ctor = ctor_for_folding (decl);
if (!ctor)
return NULL; return NULL;
sem_variable *v = new sem_variable (node, 0, stack); sem_variable *v = new sem_variable (node, 0, stack);
...@@ -1686,8 +1680,8 @@ hashval_t ...@@ -1686,8 +1680,8 @@ hashval_t
sem_variable::get_hash (void) sem_variable::get_hash (void)
{ {
if (hash) if (hash)
return hash;
return hash;
/* All WPA streamed in symbols should have their hashes computed at compile /* All WPA streamed in symbols should have their hashes computed at compile
time. At this point, the constructor may not be in memory at all. time. At this point, the constructor may not be in memory at all.
DECL_INITIAL (decl) would be error_mark_node in that case. */ DECL_INITIAL (decl) would be error_mark_node in that case. */
...@@ -2155,7 +2149,14 @@ sem_item_optimizer::filter_removed_items (void) ...@@ -2155,7 +2149,14 @@ sem_item_optimizer::filter_removed_items (void)
if (!flag_ipa_icf_variables) if (!flag_ipa_icf_variables)
remove_item (item); remove_item (item);
else else
filtered.safe_push (item); {
/* Filter out non-readonly variables. */
tree decl = item->decl;
if (TREE_READONLY (decl))
filtered.safe_push (item);
else
remove_item (item);
}
} }
} }
......
...@@ -393,7 +393,6 @@ public: ...@@ -393,7 +393,6 @@ public:
inline virtual void init (void) inline virtual void init (void)
{ {
decl = get_node ()->decl; decl = get_node ()->decl;
ctor = ctor_for_folding (decl);
} }
virtual hashval_t get_hash (void); virtual hashval_t get_hash (void);
...@@ -415,9 +414,6 @@ public: ...@@ -415,9 +414,6 @@ public:
/* Parser function that visits a varpool NODE. */ /* Parser function that visits a varpool NODE. */
static sem_variable *parse (varpool_node *node, bitmap_obstack *stack); static sem_variable *parse (varpool_node *node, bitmap_obstack *stack);
/* Variable constructor. */
tree ctor;
private: private:
/* Iterates though a constructor and identifies tree references /* Iterates though a constructor and identifies tree references
we are interested in semantic function equality. */ we are interested in semantic function equality. */
...@@ -428,7 +424,6 @@ private: ...@@ -428,7 +424,6 @@ private:
/* Compare that symbol sections are either NULL or have same name. */ /* Compare that symbol sections are either NULL or have same name. */
bool compare_sections (sem_variable *alias); bool compare_sections (sem_variable *alias);
}; // class sem_variable }; // class sem_variable
class sem_item_optimizer; class sem_item_optimizer;
......
2015-02-28 Martin Liska <mliska@suse.cz> 2015-02-28 Martin Liska <mliska@suse.cz>
Jan Hubicka <hubicka@ucw.cz> Jan Hubicka <hubicka@ucw.cz>
* gcc.dg/ipa/ipa-icf-35.c: New test.
* gcc.dg/ipa/ipa-icf-36.c: New test.
* gcc.dg/ipa/ipa-icf-37.c: New test.
2015-02-28 Martin Liska <mliska@suse.cz>
Jan Hubicka <hubicka@ucw.cz>
PR ipa/65245 PR ipa/65245
* gcc.dg/ipa/ipa-icf-34.c: New test. * gcc.dg/ipa/ipa-icf-34.c: New test.
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-ipa-icf" } */
void f1()
{
}
void f2()
{
}
static void (*a)(void)=&f1;
static void (*b)(void)=&f1;
static void (*c)(void)=&f2;
static void (*d)(void)=&f2;
int main()
{
a();
b();
c();
d();
return 0;
}
/* { dg-final { scan-ipa-dump "Equal symbols: 3" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:f2->f1" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:d->c" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:b->a" "icf" } } */
/* { dg-final { cleanup-ipa-dump "icf" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-ipa-icf -fmerge-all-constants" } */
static int a;
static int b;
static const int c = 2;
static const int d = 2;
static char * e = "test";
static char * f = "test";
static int g[3]={1,2,3};
static int h[3]={1,2,3};
static const int *i=&c;
static const int *j=&c;
static const int *k=&d;
int t(int tt)
{
switch (tt)
{
case 1: return a;
case 2: return b;
case 3: return c;
case 4: return d;
case 5: return e[1];
case 6: return f[1];
case 7: return g[1];
case 8: return h[1];
case 9: return i[0];
case 10: return j[0];
case 11: return k[0];
}
}
/* { dg-final { scan-ipa-dump "Equal symbols: 6" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:b->a" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:d->c" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:f->e" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:h->g" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:k->i" "icf" } } */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-ipa-icf" } */
static int a;
static int b;
static const int c = 2;
static const int d = 2;
static char * e = "test";
static char * f = "test";
static int g[3]={1,2,3};
static int h[3]={1,2,3};
static const int *i=&c;
static const int *j=&c;
static const int *k=&d;
int t(int tt)
{
switch (tt)
{
case 1: return a;
case 2: return b;
case 3: return c;
case 4: return d;
case 5: return e[1];
case 6: return f[1];
case 7: return g[1];
case 8: return h[1];
case 9: return i[0];
case 10: return j[0];
case 11: return k[0];
}
}
/* { dg-final { scan-ipa-dump "Equal symbols: 5" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:b->a" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:d->c" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:f->e" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:h->g" "icf" } } */
/* { dg-final { scan-ipa-dump "Semantic equality hit:j->i" "icf" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment