On Tue, 26 Jul 2016, Prathamesh Kulkarni wrote:

> The following is an interesting case which broke stor-layout.c.
> The patch warned for the following call to be dead from
> bit_field_mode_iterator::next_mode() to get_mode_alignment ():
> 
>       /* Stop if the mode requires too much alignment.  */
>       if (GET_MODE_ALIGNMENT (m_mode) > m_align
>           && SLOW_UNALIGNED_ACCESS (m_mode, m_align))
>         break;
> 
> GET_MODE_ALIGNMENT (MODE) is just #defined as get_mode_alignment (MODE)
> in machmode.h
> 
> SLOW_UNALIGNED_ACCESS (MODE, ALIGN) is #defined to STRICT_ALIGNMENT
> in defaults.h, and i386.h sets STRICT_ALIGNMENT to 0.
> So essentially it comes down to:
> 
> if (get_mode_alignment (m_mode) > m_align && 0)
>   break;
> 
> which clearly makes get_mode_alignment(m_mode) a dead call
> since it's a pure function.
> However if a target overrides SLOW_UNALIGNED_ACCESS(mode, align)
> and sets it to some runtime value, then the call won't be dead for that 
> target.
> 
> Should we split the above  in two different if conditions ?
> if (GET_MODE_ALIGNMENT (m_mode) > m_align)
>   if (SLOW_UNALIGNED_ACCESS (m_mode, m_align))
>     break;

I'm surprised it's only one case that you hit ;)  Be prepared for
other targets to be broken similarly.

This hints at the general issue of issueing warnings after optimization,
they can easily become false positives.

Richard.

Reply via email to