Commit 254b22cc by Richard Biener Committed by Richard Biener

re PR middle-end/68067 (Wrong constant folding)

2015-10-28  Richard Biener  <rguenther@suse.de>

	PR middle-end/68067
	* fold-const.c (negate_expr_p): We cannot negate plus or minus
	if overflow is not wrapping.  Likewise multiplication unless
	one operand is constant and not power of two.
	(fold_negate_expr): Adjust accordingly.

	* gcc.dg/torture/pr68067-1.c: New testcase.
	* gcc.dg/torture/pr68067-2.c: Likewise.

From-SVN: r229479
parent af7ff91b
2015-10-28 Richard Biener <rguenther@suse.de>
PR middle-end/68067
* fold-const.c (negate_expr_p): We cannot negate plus or minus
if overflow is not wrapping. Likewise multiplication unless
one operand is constant and not power of two.
(fold_negate_expr): Adjust accordingly.
2015-10-27 Nathan Sidwell <nathan@codesourcery.com> 2015-10-27 Nathan Sidwell <nathan@codesourcery.com>
* omp-low.c (struct omp_context): Remove gwv_below, gwv_this * omp-low.c (struct omp_context): Remove gwv_below, gwv_this
...@@ -443,7 +443,9 @@ negate_expr_p (tree t) ...@@ -443,7 +443,9 @@ negate_expr_p (tree t)
case PLUS_EXPR: case PLUS_EXPR:
if (HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type)) if (HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
|| HONOR_SIGNED_ZEROS (element_mode (type))) || HONOR_SIGNED_ZEROS (element_mode (type))
|| (INTEGRAL_TYPE_P (type)
&& ! TYPE_OVERFLOW_WRAPS (type)))
return false; return false;
/* -(A + B) -> (-B) - A. */ /* -(A + B) -> (-B) - A. */
if (negate_expr_p (TREE_OPERAND (t, 1)) if (negate_expr_p (TREE_OPERAND (t, 1))
...@@ -457,12 +459,23 @@ negate_expr_p (tree t) ...@@ -457,12 +459,23 @@ negate_expr_p (tree t)
/* We can't turn -(A-B) into B-A when we honor signed zeros. */ /* We can't turn -(A-B) into B-A when we honor signed zeros. */
return !HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type)) return !HONOR_SIGN_DEPENDENT_ROUNDING (element_mode (type))
&& !HONOR_SIGNED_ZEROS (element_mode (type)) && !HONOR_SIGNED_ZEROS (element_mode (type))
&& (! INTEGRAL_TYPE_P (type)
|| TYPE_OVERFLOW_WRAPS (type))
&& reorder_operands_p (TREE_OPERAND (t, 0), && reorder_operands_p (TREE_OPERAND (t, 0),
TREE_OPERAND (t, 1)); TREE_OPERAND (t, 1));
case MULT_EXPR: case MULT_EXPR:
if (TYPE_UNSIGNED (TREE_TYPE (t))) if (TYPE_UNSIGNED (type))
break; break;
/* INT_MIN/n * n doesn't overflow while negating one operand it does
if n is a power of two. */
if (INTEGRAL_TYPE_P (TREE_TYPE (t))
&& ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))
&& ! ((TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
&& ! integer_pow2p (TREE_OPERAND (t, 0)))
|| (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
&& ! integer_pow2p (TREE_OPERAND (t, 1)))))
break;
/* Fall through. */ /* Fall through. */
......
2015-10-28 Richard Biener <rguenther@suse.de>
PR middle-end/68067
* gcc.dg/torture/pr68067-1.c: New testcase.
* gcc.dg/torture/pr68067-2.c: Likewise.
2015-10-28 Segher Boessenkool <segher@kernel.crashing.org> 2015-10-28 Segher Boessenkool <segher@kernel.crashing.org>
* gcc.target/powerpc/p8vector-builtin-8.c: Add "target int128". * gcc.target/powerpc/p8vector-builtin-8.c: Add "target int128".
......
/* { dg-do run } */
int main()
{
int a = -1;
static int b = -2147483647 - 1;
static int c = 0;
int t = a - (b - c);
if (t != 2147483647)
__builtin_abort();
return 0;
}
/* { dg-do run } */
int main()
{
int a = -1;
static int b = -2147483647 - 1;
static int c = 0;
int t = a - (b + c*-2);
if (t != 2147483647)
__builtin_abort();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment