re PR lto/85574 (LTO bootstapped binaries differ)
2018-05-04 Richard Biener <rguenther@suse.de> PR middle-end/85574 * fold-const.c (negate_expr_p): Restrict negation of operand zero of a division to when we know that can happen without overflow. (fold_negate_expr_1): Likewise. * gcc.dg/torture/pr85574.c: New testcase. * gcc.dg/torture/pr57656.c: Use dg-additional-options. From-SVN: r259922
This commit is contained in:
parent
047823853d
commit
9b5713f7ce
5 changed files with 29 additions and 5 deletions
|
@ -1,3 +1,11 @@
|
|||
2018-05-04 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/85574
|
||||
* fold-const.c (negate_expr_p): Restrict negation of operand
|
||||
zero of a division to when we know that can happen without
|
||||
overflow.
|
||||
(fold_negate_expr_1): Likewise.
|
||||
|
||||
2018-05-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR libstdc++/85466
|
||||
|
|
|
@ -474,12 +474,15 @@ negate_expr_p (tree t)
|
|||
case EXACT_DIV_EXPR:
|
||||
if (TYPE_UNSIGNED (type))
|
||||
break;
|
||||
if (negate_expr_p (TREE_OPERAND (t, 0)))
|
||||
/* In general we can't negate A in A / B, because if A is INT_MIN and
|
||||
B is not 1 we change the sign of the result. */
|
||||
if (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
|
||||
&& negate_expr_p (TREE_OPERAND (t, 0)))
|
||||
return true;
|
||||
/* In general we can't negate B in A / B, because if A is INT_MIN and
|
||||
B is 1, we may turn this into INT_MIN / -1 which is undefined
|
||||
and actually traps on some architectures. */
|
||||
if (! INTEGRAL_TYPE_P (TREE_TYPE (t))
|
||||
if (! ANY_INTEGRAL_TYPE_P (TREE_TYPE (t))
|
||||
|| TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))
|
||||
|| (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
|
||||
&& ! integer_onep (TREE_OPERAND (t, 1))))
|
||||
|
@ -652,14 +655,17 @@ fold_negate_expr_1 (location_t loc, tree t)
|
|||
case EXACT_DIV_EXPR:
|
||||
if (TYPE_UNSIGNED (type))
|
||||
break;
|
||||
if (negate_expr_p (TREE_OPERAND (t, 0)))
|
||||
/* In general we can't negate A in A / B, because if A is INT_MIN and
|
||||
B is not 1 we change the sign of the result. */
|
||||
if (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
|
||||
&& negate_expr_p (TREE_OPERAND (t, 0)))
|
||||
return fold_build2_loc (loc, TREE_CODE (t), type,
|
||||
negate_expr (TREE_OPERAND (t, 0)),
|
||||
TREE_OPERAND (t, 1));
|
||||
/* In general we can't negate B in A / B, because if A is INT_MIN and
|
||||
B is 1, we may turn this into INT_MIN / -1 which is undefined
|
||||
and actually traps on some architectures. */
|
||||
if ((! INTEGRAL_TYPE_P (TREE_TYPE (t))
|
||||
if ((! ANY_INTEGRAL_TYPE_P (TREE_TYPE (t))
|
||||
|| TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))
|
||||
|| (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
|
||||
&& ! integer_onep (TREE_OPERAND (t, 1))))
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2018-05-04 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/85574
|
||||
* gcc.dg/torture/pr85574.c: New testcase.
|
||||
* gcc.dg/torture/pr57656.c: Use dg-additional-options.
|
||||
|
||||
2018-05-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR libstdc++/85466
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-fstrict-overflow" } */
|
||||
/* { dg-additional-options "-fstrict-overflow" } */
|
||||
|
||||
int main (void)
|
||||
{
|
||||
|
|
4
gcc/testsuite/gcc.dg/torture/pr85574.c
Normal file
4
gcc/testsuite/gcc.dg/torture/pr85574.c
Normal file
|
@ -0,0 +1,4 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-additional-options "-fwrapv" } */
|
||||
|
||||
#include "pr57656.c"
|
Loading…
Add table
Reference in a new issue