On Fri, 14 Nov 2014, Marek Polacek wrote:

> On Wed, Nov 12, 2014 at 11:53:19AM +0100, Richard Biener wrote:
> > Err - please adjust fold_negate_expr instead.
> 
> Like this?
> 
> (It's not best that for -trapv/-fsanitize=s-i-o we don't emit
> compile-time warning "integer overflow in expression" for -INT_MIN,
> because the warning relies on the folding.)

Well - the warning implementation is clearly bougs then ;)

> Bootstrapped/regtested on power8-linux.

Ok.

Thanks,
Richard.

> 2014-11-14  Marek Polacek  <pola...@redhat.com>
> 
>       * fold-const.c (fold_negate_expr): Don't fold INTEGER_CST if
>       that overflows when SANITIZE_SI_OVERFLOW is on.  Guard -(-A)
>       folding with TYPE_OVERFLOW_SANITIZED.
> 
>       * c-c++-common/ubsan/overflow-negate-3.c: New test.
> 
> diff --git gcc/fold-const.c gcc/fold-const.c
> index ee9ed7b..8994aa4 100644
> --- gcc/fold-const.c
> +++ gcc/fold-const.c
> @@ -555,7 +555,8 @@ fold_negate_expr (location_t loc, tree t)
>      case INTEGER_CST:
>        tem = fold_negate_const (t, type);
>        if (TREE_OVERFLOW (tem) == TREE_OVERFLOW (t)
> -       || !TYPE_OVERFLOW_TRAPS (type))
> +       || (!TYPE_OVERFLOW_TRAPS (type)
> +           && (flag_sanitize & SANITIZE_SI_OVERFLOW) == 0))
>       return tem;
>        break;
>  
> @@ -612,7 +613,9 @@ fold_negate_expr (location_t loc, tree t)
>        break;
>  
>      case NEGATE_EXPR:
> -      return TREE_OPERAND (t, 0);
> +      if (!TYPE_OVERFLOW_SANITIZED (type))
> +     return TREE_OPERAND (t, 0);
> +      break;
>  
>      case PLUS_EXPR:
>        if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type))
> diff --git gcc/testsuite/c-c++-common/ubsan/overflow-negate-3.c 
> gcc/testsuite/c-c++-common/ubsan/overflow-negate-3.c
> index e69de29..e6db394 100644
> --- gcc/testsuite/c-c++-common/ubsan/overflow-negate-3.c
> +++ gcc/testsuite/c-c++-common/ubsan/overflow-negate-3.c
> @@ -0,0 +1,21 @@
> +/* { dg-do run } */
> +/* { dg-options "-fsanitize=signed-integer-overflow" } */
> +
> +#define INT_MIN (-__INT_MAX__ - 1)
> +
> +int
> +main ()
> +{
> +  int x = INT_MIN;
> +  int y;
> +  asm ("" : "+g" (x));
> +  y = -(-x);
> +  asm ("" : "+g" (y));
> +  y = -(-INT_MIN);
> +  asm ("" : "+g" (y));
> +}
> +
> +/* { dg-output "negation of -2147483648 cannot be represented in type 
> 'int'\[^\n\r]*; cast to an unsigned type to negate this value to 
> itself\[^\n\r]*(\n|\r\n|\r)" } */
> +/* { dg-output "\[^\n\r]*negation of -2147483648 cannot be represented in 
> type 'int'\[^\n\r]*; cast to an unsigned type to negate this value to 
> itself\[^\n\r]*(\n|\r\n|\r)" } */
> +/* { dg-output "\[^\n\r]*negation of -2147483648 cannot be represented in 
> type 'int'\[^\n\r]*; cast to an unsigned type to negate this value to 
> itself\[^\n\r]*(\n|\r\n|\r)" } */
> +/* { dg-output "\[^\n\r]*negation of -2147483648 cannot be represented in 
> type 'int'\[^\n\r]*; cast to an unsigned type to negate this value to 
> itself\[^\n\r]*(\n|\r\n|\r)" } */
> 
>       Marek
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Jeff Hawn, Jennifer Guild, Felix Imendoerffer, HRB 21284
(AG Nuernberg)
Maxfeldstrasse 5, 90409 Nuernberg, Germany

Reply via email to