On Fri, May 17, 2013 at 5:48 PM, Dehao Chen <de...@google.com> wrote:
> On Fri, May 17, 2013 at 1:22 AM, Richard Biener
> <richard.guent...@gmail.com> wrote:
>> On Wed, May 15, 2013 at 6:50 PM, Cary Coutant <ccout...@google.com> wrote:
>>>> gcc/ChangeLog:
>>>>
>>>> * tree-cfg.c (locus_descrim_hasher::hash): Only hash lineno.
>>>> (locus_descrim_hasher::equal): Likewise.
>>>> (next_discriminator_for_locus): Likewise.
>>>> (assign_discriminator): Add return value.
>>>> (make_edges): Assign more discriminator if necessary.
>>>> (make_cond_expr_edges): Likewise.
>>>> (make_goto_expr_edges): Likewise.
>>>>
>>>> gcc/testsuite/ChangeLog:
>>>>
>>>> * gcc.dg/debug/dwarf2/discriminator.c: New Test.
>>>
>>> Looks OK to me, but I can't approve patches for tree-cfg.c.
>>>
>>> Two comments:
>>>
>>> (1) In the C++ conversion, it looks like someone misspelled "discrim"
>>> in "locus_descrim_hasher".
>>>
>>> (2) Is this worth fixing in trunk when we'll eventually switch to a
>>> per-instruction discriminator?
>>
>>> This patch fixes a common case where one line is distributed to 3 BBs,
>>> but only 1 discriminator is assigned.
>>
>> As far as I can see the patch makes discriminators coarser (by hashing
>> and comparing on LOCATION_LINE and not on the location).  It also has
>> the changes like
>>
>> -  assign_discriminator (entry_locus, then_bb);
>> +  if (assign_discriminator (entry_locus, then_bb))
>> +    assign_discriminator (entry_locus, bb);
>>
>> which is what the comment refers to?  I think those changes are short-sighted
>> because what happens if the 2nd assign_discriminator call has exactly the
>> same issue?  Especially with the make_goto_expr_edges change there
>> may be multiple predecessors where I cannot see how the change is
>> correct.  Yes, the change changes something and thus may fix the testcase
>> but it doesn't change things in a predictable way as far as I can see.
>>
>> So - the change to compare/hash LOCATION_LINE looks good to me,
>> but the assign_discriminator change needs more explaining.
>
> The new discriminator assignment algorithm is:
>
> 1 FOR_EACH_BB:
> 2   FOR_EACH_SUCC_EDGE:
> 3     if (same_line(bb, succ_bb))
> 4       if (succ_bb has no discriminator)
> 5          succ_bb->discriminator = new_discriminator
> 6       else if (bb has no discriminator)
> 7          bb->discriminator = new_discriminator
>
> Because there are so many places to handle SUCC_EDGE, thus the logic
> line #3, #4 is embedded within assign_discriminator function, and the
> logic in line #6 is encoded as the return value of
> assign_discriminator.

Hmm, as of current the code is hardly readable while the above makes sense
(well, apart from what happens if both succ and bb already have a
discriminator).

Can I make you refactor the current code to postpone discriminator assignment
until after make_edges completed, thus, do it in a postprocessing step done
exactly like outlined above?  That way also the whole thing, including
the currently global  discriminator_per_locus can be localized into a single
function.

Thanks,
Richard.


> Thanks,
> Dehao
>
>>
>> Richard.
>>
>>> -cary

Reply via email to