alias.c: Include ipa-utils.h.

* alias.c: Include ipa-utils.h.
	(get_alias_set): Try to complete ODR type via ODR type hash lookup.
	* ipa-devirt.c (prevailing_odr_type): New.
	* ipa-utils.h (previaling_odr_type): Declare.

	* g++.dg/lto/alias-1_0.C: New testcase.
	* g++.dg/lto/alias-1_1.C: New testcase.

From-SVN: r271837
This commit is contained in:
Jan Hubicka 2019-06-01 18:36:49 +02:00 committed by Jan Hubicka
parent 5a2a2fb315
commit e4b44fd741
7 changed files with 83 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2019-05-31 Jan Hubicka <jh@suse.cz>
* alias.c: Include ipa-utils.h.
(get_alias_set): Try to complete ODR type via ODR type hash lookup.
* ipa-devirt.c (prevailing_odr_type): New.
* ipa-utils.h (previaling_odr_type): Declare.
2019-05-31 H.J. Lu <hongjiu.lu@intel.com>
Hongtao Liu <hongtao.liu@intel.com>

View File

@ -39,6 +39,7 @@ along with GCC; see the file COPYING3. If not see
#include "cfganal.h"
#include "rtl-iter.h"
#include "cgraph.h"
#include "ipa-utils.h"
/* The aliasing API provided here solves related but different problems:
@ -1008,6 +1009,14 @@ get_alias_set (tree t)
}
p = TYPE_MAIN_VARIANT (p);
/* In LTO for C++ programs we can turn in complete types to complete
using ODR name lookup. */
if (in_lto_p && TYPE_STRUCTURAL_EQUALITY_P (p) && odr_type_p (p))
{
p = prevailing_odr_type (p);
gcc_checking_assert (TYPE_MAIN_VARIANT (p) == p);
}
/* Make void * compatible with char * and also void **.
Programs are commonly violating TBAA by this.

View File

@ -2170,6 +2170,20 @@ get_odr_type (tree type, bool insert)
return val;
}
/* Return type that in ODR type hash prevailed TYPE. Be careful and punt
on ODR violations. */
tree
prevailing_odr_type (tree type)
{
odr_type t = get_odr_type (type, false);
if (!t || t->odr_violated)
return type;
return t->type;
}
/* Return true if we reported some ODR violation on TYPE. */
bool
odr_type_violation_reported_p (tree type)
{

View File

@ -92,6 +92,7 @@ void warn_types_mismatch (tree t1, tree t2, location_t loc1 = UNKNOWN_LOCATION,
bool odr_or_derived_type_p (const_tree t);
bool odr_types_equivalent_p (tree type1, tree type2);
bool odr_type_violation_reported_p (tree type);
tree prevailing_odr_type (tree type);
/* Return vector containing possible targets of polymorphic call E.
If COMPLETEP is non-NULL, store true if the list is complete.

View File

@ -1,3 +1,8 @@
2019-05-31 Jan Hubicka <jh@suse.cz>
* g++.dg/lto/alias-1_0.C: New testcase.
* g++.dg/lto/alias-1_1.C: New testcase.
2019-05-31 H.J. Lu <hongjiu.lu@intel.com>
PR target/89355

View File

@ -0,0 +1,31 @@
/* { dg-lto-do run } */
/* { dg-lto-options { { -O2 -flto } } } */
/* With LTO we consider all pointers to incomplete types to be possibly
aliasing. This makes *bptr to alias with aptr.
However with C++ ODR rule we can turn incomplete pointers to complete
dragging in info from alias-1_1.C. */
#include <string.h>
typedef int (*fnptr) ();
__attribute__ ((used))
struct a *aptr;
__attribute__ ((used))
struct b **bptr = (struct b**)&aptr;
extern void init ();
extern void inline_me_late (int);
int
main (int argc, char **argv)
{
init ();
aptr = 0;
inline_me_late (argc);
if (!__builtin_constant_p (aptr == 0))
__builtin_abort ();
return (size_t)aptr;
}

View File

@ -0,0 +1,16 @@
#include <string.h>
struct a {int a;} a;
struct b {short b;} b;
extern struct b **bptr;
void
inline_me_late (int argc)
{
if (argc == -1)
*bptr = (struct b *)(size_t)1;
}
void
init()
{
a.a=1;
b.b=2;
}