re PR lto/61886 (LTO breaks fread with _FORTIFY_SOURCE=2)

PR ipa/61886
	* symtab.c (symtab_node::equal_address_to): New parameter
	MEMORY_ACCESSED.
	* cgraph.h (symtab_node::equal_address_to): Update prototype.

From-SVN: r231440
This commit is contained in:
Jan Hubicka 2015-12-09 06:07:18 +01:00 committed by Jan Hubicka
parent eb457a8c59
commit b2539e1e8d
3 changed files with 39 additions and 10 deletions

View File

@ -1,3 +1,10 @@
2015-12-08 Jan Hubicka <hubicka@ucw.cz>
PR ipa/61886
* symtab.c (symtab_node::equal_address_to): New parameter
MEMORY_ACCESSED.
* cgraph.h (symtab_node::equal_address_to): Update prototype.
2015-12-08 DJ Delorie <dj@redhat.com>
* config/rx/rx.opt (-mjsr): Add.

View File

@ -355,8 +355,13 @@ public:
/* Return 0 if symbol is known to have different address than S2,
Return 1 if symbol is known to have same address as S2,
return 2 otherwise. */
int equal_address_to (symtab_node *s2);
return 2 otherwise.
If MEMORY_ACCESSED is true, assume that both memory pointer to THIS
and S2 is going to be accessed. This eliminates the situations when
either THIS or S2 is NULL and is seful for comparing bases when deciding
about memory aliasing. */
int equal_address_to (symtab_node *s2, bool memory_accessed = false);
/* Return true if symbol's address may possibly be compared to other
symbol's address. */

View File

@ -1878,9 +1878,14 @@ symtab_node::nonzero_address ()
/* Return 0 if symbol is known to have different address than S2,
Return 1 if symbol is known to have same address as S2,
return 2 otherwise. */
return 2 otherwise.
If MEMORY_ACCESSED is true, assume that both memory pointer to THIS
and S2 is going to be accessed. This eliminates the situations when
either THIS or S2 is NULL and is seful for comparing bases when deciding
about memory aliasing. */
int
symtab_node::equal_address_to (symtab_node *s2)
symtab_node::equal_address_to (symtab_node *s2, bool memory_accessed)
{
enum availability avail1, avail2;
@ -1888,6 +1893,16 @@ symtab_node::equal_address_to (symtab_node *s2)
if (this == s2)
return 1;
/* Unwind transparent aliases first; those are always equal to their
target. */
if (this->transparent_alias && this->analyzed)
return this->get_alias_target ()->equal_address_to (s2);
while (s2->transparent_alias && s2->analyzed)
s2 = s2->get_alias_target();
if (this == s2)
return 1;
/* For non-interposable aliases, lookup and compare their actual definitions.
Also check if the symbol needs to bind to given definition. */
symtab_node *rs1 = ultimate_alias_target (&avail1);
@ -1924,8 +1939,9 @@ symtab_node::equal_address_to (symtab_node *s2)
return 1;
}
/* If both symbols may resolve to NULL, we can not really prove them different. */
if (!nonzero_address () && !s2->nonzero_address ())
/* If both symbols may resolve to NULL, we can not really prove them
different. */
if (!memory_accessed && !nonzero_address () && !s2->nonzero_address ())
return 2;
/* Except for NULL, functions and variables never overlap. */
@ -1956,11 +1972,12 @@ symtab_node::equal_address_to (symtab_node *s2)
}
/* TODO: Alias oracle basically assume that addresses of global variables
are different unless they are declared as alias of one to another.
We probably should be consistent and use this fact here, too, and update
alias oracle to use this predicate. */
are different unless they are declared as alias of one to another while
the code folding comparsions doesn't.
We probably should be consistent and use this fact here, too, but for
the moment return false only when we are called from the alias oracle. */
return 2;
return memory_accessed && rs1 != rs2 ? 0 : 2;
}
/* Worker for call_for_symbol_and_aliases. */