2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-21 23:30:59 +08:00

ipa/94947 - fix test for externally visible variables for IPA PTA

This fixes lack of an escape point of externally declared variables.

2020-05-05  Richard Biener  <rguenther@suse.de>

	PR ipa/94947
	* tree-ssa-structalias.c (ipa_pta_execute): Use
	varpool_node::externally_visible_p ().
	(refered_from_nonlocal_var): Likewise.

	* gcc.dg/torture/pr94947-1.c: New testcase.
	* gcc.dg/torture/pr94947-2.c: Likewise.
This commit is contained in:
Richard Biener 2020-05-05 13:09:50 +02:00
parent 5269b24605
commit f9b5db750b
5 changed files with 46 additions and 3 deletions

@ -1,3 +1,10 @@
2020-05-05 Richard Biener <rguenther@suse.de>
PR ipa/94947
* tree-ssa-structalias.c (ipa_pta_execute): Use
varpool_node::externally_visible_p ().
(refered_from_nonlocal_var): Likewise.
2020-05-05 Eric Botcazou <ebotcazou@adacore.com>
* gcc.c (LTO_PLUGIN_SPEC): Define if not already.

@ -1,3 +1,9 @@
2020-05-05 Richard Biener <rguenther@suse.de>
PR ipa/94947
* gcc.dg/torture/pr94947-1.c: New testcase.
* gcc.dg/torture/pr94947-2.c: Likewise.
2020-05-05 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/aggr29.adb: New test.

@ -0,0 +1,23 @@
/* { dg-do run } */
/* { dg-additional-sources "pr94947-2.c" } */
/* { dg-additional-options "-fipa-pta -flto-partition=1to1" } */
extern void abort ();
extern void baz ();
extern void (*baz_call)();
static int *p;
static void foo ()
{
if (*p != 1)
abort ();
}
int main()
{
int x = 1;
p = &x;
baz_call = foo;
baz ();
return 0;
}

@ -0,0 +1,7 @@
/* { dg-do compile } */
void (*baz_call)();
void baz ()
{
baz_call ();
}

@ -8097,7 +8097,7 @@ refered_from_nonlocal_var (struct varpool_node *node, void *data)
{
bool *nonlocal_p = (bool *)data;
*nonlocal_p |= (node->used_from_other_partition
|| node->externally_visible
|| node->externally_visible_p ()
|| node->force_output);
return false;
}
@ -8187,8 +8187,8 @@ ipa_pta_execute (void)
/* For the purpose of IPA PTA unit-local globals are not
escape points. */
bool nonlocal_p = (var->used_from_other_partition
|| var->externally_visible
bool nonlocal_p = (var->externally_visible_p ()
|| var->used_from_other_partition
|| var->force_output);
var->call_for_symbol_and_aliases (refered_from_nonlocal_var,
&nonlocal_p, true);