Bootstrapped / tested on x86_64-unknown-linux-gnu, applied. Richard.
2017-03-27 Richard Biener <rguent...@suse.de> PR ipa/79776 * tree-ssa-structalias.c (associate_varinfo_to_alias): Skip inlined thunk clones. * g++.dg/ipa/pr79776.C: New testcase. Index: gcc/tree-ssa-structalias.c =================================================================== *** gcc/tree-ssa-structalias.c (revision 246489) --- gcc/tree-ssa-structalias.c (working copy) *************** struct pt_solution ipa_escaped_pt *** 7615,7621 **** static bool associate_varinfo_to_alias (struct cgraph_node *node, void *data) { ! if ((node->alias || node->thunk.thunk_p) && node->analyzed) insert_vi_for_tree (node->decl, (varinfo_t)data); return false; --- 7615,7623 ---- static bool associate_varinfo_to_alias (struct cgraph_node *node, void *data) { ! if ((node->alias ! || (node->thunk.thunk_p ! && ! node->global.inlined_to)) && node->analyzed) insert_vi_for_tree (node->decl, (varinfo_t)data); return false; Index: gcc/testsuite/g++.dg/ipa/pr79776.C =================================================================== *** gcc/testsuite/g++.dg/ipa/pr79776.C (nonexistent) --- gcc/testsuite/g++.dg/ipa/pr79776.C (working copy) *************** *** 0 **** --- 1,29 ---- + // PR ipa/71146 + // { dg-do compile } + // { dg-options "-O3 -fipa-pta" } + + typedef enum { X } E; + struct A { + virtual void bar (); + }; + struct B { + virtual E fn (const char *, int, int *) = 0; + }; + struct C : A, B { + E fn (const char *, int, int *); + void fn2 (); + B *foo; + }; + void C::fn2 () { + if (!foo) + return; + foo->fn (0, 0, 0); + } + E + C::fn (const char *, int, int *) + { + fn2 (); + foo = 0; + fn (0, 0, 0); + return X; + }