Hi,

On Mon, Jul 27 2020, Richard Biener via Gcc-patches wrote:
> On Sat, Jul 25, 2020 at 8:35 PM Sergei Trofimovich via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
>>
>> From: Sergei Trofimovich <siarh...@google.com>
>>
>> In PR ipa/96291 the test contained an SCC with one
>> unoptimized function. This tricked ipa-cp into NULL dereference.
>>
>> has_undead_caller_from_outside_scc_p() did not take into account
>> that unoptimized funtions don't have IPA summary analysis. and
>> dereferenced NULL pointer causing an ICE.
>
> Can you create a single-unit testcase with a SCC with one function
> having the no_ipa attribute?

This bug is LTO specific because otherwise a summary (although marked as
quite useless) will be left over from the summary building stage.

So Sergei, if you can afford to spend an extra while providing a
testcase, you'll need to add three files into gcc/testsuite/gcc.dg/lto,
with either the second or third (numbered _1 or _2)) having

/* { dg-lto-options { { -flto -O0 } } } */

in them.

Thanks,

Martin



>
>>         PR ipa/96291
>>         * ipa-cp.c (has_undead_caller_from_outside_scc_p): Consider
>>         unoptimized callers as undead.
>> ---
>>  gcc/ipa-cp.c | 12 +++++++++---
>>  1 file changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
>> index b0c8f405260..d5082576962 100644
>> --- a/gcc/ipa-cp.c
>> +++ b/gcc/ipa-cp.c
>> @@ -5666,9 +5666,15 @@ has_undead_caller_from_outside_scc_p (struct 
>> cgraph_node *node,
>>         && cs->caller->call_for_symbol_thunks_and_aliases
>>           (has_undead_caller_from_outside_scc_p, NULL, true))
>>        return true;
>> -    else if (!ipa_edge_within_scc (cs)
>> -            && !IPA_NODE_REF (cs->caller)->node_dead)
>> -      return true;
>> +    else if (!ipa_edge_within_scc (cs))
>> +      {
>> +       /* Unoptimized callers don't have IPA information.
>> +          Conservatively assume callers are undead.  */
>> +       if (!IPA_NODE_REF (cs->caller))
>> +         return true;
>> +       if (!IPA_NODE_REF (cs->caller)->node_dead)
>> +         return true;
>> +      }
>>    return false;
>>  }
>>
>> --
>> 2.27.0
>>

Reply via email to