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:
Richard Biener 2018-05-04 07:25:54 +00:00 committed by Richard Biener
parent 047823853d
commit 9b5713f7ce
5 changed files with 29 additions and 5 deletions

View file

@ -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

View file

@ -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))))

View file

@ -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

View file

@ -1,5 +1,5 @@
/* { dg-do run } */
/* { dg-options "-fstrict-overflow" } */
/* { dg-additional-options "-fstrict-overflow" } */
int main (void)
{

View file

@ -0,0 +1,4 @@
/* { dg-do run } */
/* { dg-additional-options "-fwrapv" } */
#include "pr57656.c"