Hi, this patch fixes the devirt10 and devirt15 failures - the problem was that we did not look into alias target when estimating devirt benefit.
Bootstrapped/regtested rs6000-aix, comitted. * ipa-cp.c (devirtualization_time_bonus): Walk through aliases. * ipa-inline-analysis.c (estimate_edge_devirt_benefit): Likewise. Index: ipa-cp.c =================================================================== --- ipa-cp.c (revision 212394) +++ ipa-cp.c (working copy) @@ -1671,6 +1671,7 @@ { struct cgraph_node *callee; struct inline_summary *isummary; + enum availability avail; tree target; target = ipa_get_indirect_edge_target (ie, known_csts, known_binfos, @@ -1683,6 +1684,9 @@ callee = cgraph_get_node (target); if (!callee || !callee->definition) continue; + callee = cgraph_function_node (callee, &avail); + if (avail < AVAIL_AVAILABLE) + continue; isummary = inline_summary (callee); if (!isummary->inlinable) continue; Index: ipa-inline-analysis.c =================================================================== --- ipa-inline-analysis.c (revision 212394) +++ ipa-inline-analysis.c (working copy) @@ -2971,6 +2971,7 @@ tree target; struct cgraph_node *callee; struct inline_summary *isummary; + enum availability avail; if (!known_vals.exists () && !known_binfos.exists ()) return false; @@ -2991,6 +2992,9 @@ callee = cgraph_get_node (target); if (!callee || !callee->definition) return false; + callee = cgraph_function_node (callee, &avail); + if (avail < AVAIL_AVAILABLE) + return false; isummary = inline_summary (callee); return isummary->inlinable; }