Use 'location_hash' for 'seen_locations' in 'gcc/profile.c:branch_prob' (was: [PATCH] Fix GCOV CFG related issues)

Martin Liška mliska@suse.cz
Tue Nov 9 14:38:06 GMT 2021


On 11/9/21 15:29, Thomas Schwinge wrote:
> Hi!
> 
> On 2018-07-25T15:40:24+0200, Martin Liška <mliska@suse.cz> wrote:
>> --- a/gcc/profile.c
>> +++ b/gcc/profile.c
>> @@ -1256,6 +1256,8 @@ branch_prob (void)
>>         /* Initialize the output.  */
>>         output_location (NULL, 0, NULL, NULL);
>>
>> +      hash_set<int_hash <location_t, 0, 2> > seen_locations;
>> +
>>         FOR_EACH_BB_FN (bb, cfun)
>>        {
>>          gimple_stmt_iterator gsi;
> 
> Given my recent commit 088199e5d0fc0d54f48af0783a2630a773bbb387
> "Generalize 'gcc/input.h:struct location_hash'", OK to push the attached
> "Use 'location_hash' for 'seen_locations' in 'gcc/profile.c:branch_prob'"?

Yes, thanks.

Martin

> 
> 
> Grüße
>   Thomas
> 
> 
>> @@ -1263,8 +1265,9 @@ branch_prob (void)
>>
>>          if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb)
>>            {
>> -           expanded_location curr_location =
>> -             expand_location (DECL_SOURCE_LOCATION (current_function_decl));
>> +           location_t loc = DECL_SOURCE_LOCATION (current_function_decl);
>> +           seen_locations.add (loc);
>> +           expanded_location curr_location = expand_location (loc);
>>              output_location (curr_location.file, curr_location.line,
>>                               &offset, bb);
>>            }
>> @@ -1272,17 +1275,25 @@ branch_prob (void)
>>          for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>>            {
>>              gimple *stmt = gsi_stmt (gsi);
>> -           if (!RESERVED_LOCATION_P (gimple_location (stmt)))
>> -             output_location (gimple_filename (stmt), gimple_lineno (stmt),
>> -                              &offset, bb);
>> +           location_t loc = gimple_location (stmt);
>> +           if (!RESERVED_LOCATION_P (loc))
>> +             {
>> +               seen_locations.add (loc);
>> +               output_location (gimple_filename (stmt), gimple_lineno (stmt),
>> +                                &offset, bb);
>> +             }
>>            }
>>
>> -       /* Notice GOTO expressions eliminated while constructing the CFG.  */
>> +       /* Notice GOTO expressions eliminated while constructing the CFG.
>> +          It's hard to distinguish such expression, but goto_locus should
>> +          not be any of already seen location.  */
>> +       location_t loc;
>>          if (single_succ_p (bb)
>> -           && !RESERVED_LOCATION_P (single_succ_edge (bb)->goto_locus))
>> +           && (loc = single_succ_edge (bb)->goto_locus)
>> +           && !RESERVED_LOCATION_P (loc)
>> +           && !seen_locations.contains (loc))
>>            {
>> -           expanded_location curr_location
>> -             = expand_location (single_succ_edge (bb)->goto_locus);
>> +           expanded_location curr_location = expand_location (loc);
>>              output_location (curr_location.file, curr_location.line,
>>                               &offset, bb);
>>            }
> 
> 
> -----------------
> Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
> 



More information about the Gcc-patches mailing list