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:
parent
5a2a2fb315
commit
e4b44fd741
|
@ -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>
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue