On Wed, Nov 26, 2014 at 06:39:44PM +0100, Marek Polacek wrote:
> Both C11 and C++14 standards specify that integral promotions are
> performed on both operands of a shift-expression.  This we do just
> fine.  But then we convert the right operand to integer_type_node.
> Not only is this unnecessary, it can also be harfmul, because for
> e.g. 
> void
> foo (unsigned int x)
> {
>   if (-1 >> x != -1)
>     bar ();
> }
> with (int) x we lose info that x is nonnegative, which means that
> tree_expr_nonnegative_p cannot fold this expr.  Another problem
> with the conversion is that we weren't able to detect e.g. shift
> by 0x100000000ULL, since after the conversion this is 0.

Have you checked what the expander does with it?  Say trying to
shift something by __int128 count or similar might upset it.
Wonder about if we don't make similar assumptions in the middle-end.
It might make a difference (sometimes positive, sometimes negative)
for vectorization too.

> 2014-11-26  Marek Polacek  <pola...@redhat.com>
> 
>       PR c/63862
> c-family/
>       * c-ubsan.c (ubsan_instrument_shift): Change the type of a MINUS_EXPR
>       to op1_utype.

This part is ok regardless of the rest.

        Jakub

Reply via email to