On 07/27/2012 01:57 AM, Richard Guenther wrote:
> On Thu, Jul 26, 2012 at 11:58 PM, Richard Henderson <r...@redhat.com> wrote:
>> On 07/26/2012 02:41 PM, Richard Henderson wrote:
>>> This is a patch...
>>
>> ... that I should have attached.  Bah.
> 
> Do we need to mark the labels so we preserve them?  Consider
> 
>  goto foo;
> 
> foo:
> bar __attribute__((cold)):
>   ...
> 
> so bar will be unused?

We don't purge unused labels until rtl (at which point it becomes a deleted 
label note), and we only really need the label to survive until after the 
profile_estimate pass.  After which all the significance of the label has been 
transferred into the edge frequency.

The test case

void g(void);
void h(void);
void f(int x, int y)
{
  if (x) goto A;
  return;

 A:
 B: __attribute__((cold))
  g();
  return;
}

does in fact DTRT with the estimates.

> What about BB merging if we end up with
> 
>   <BB 3>:
>       ..
>   fallthru
>   bar __attribute__((cold)):
>      ...
> 
> should BB 3 inherit the coldness?  I think we no longer disable
> BB merging if the destination has user labels.

The edge might be marked cold, but that should have no other effect.  No more 
than

  if (__builtin_expect (test, 0))

when it turns out that we can prove that test is false.


r~

Reply via email to