Commit a9c774d2 by Richard Biener Committed by Richard Biener

re PR tree-optimization/79666 (wrong code (SIGFPE) at -O2 on x86_64-linux-gnu…

re PR tree-optimization/79666 (wrong code (SIGFPE) at -O2 on x86_64-linux-gnu (in both 32-bit and 64-bit modes))

2017-02-22  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/79666
	* tree-vrp.c (extract_range_from_binary_expr_1): Make sure
	to not symbolically negate if that may introduce undefined
	overflow.

	* gcc.dg/torture/pr79666.c: New testcase.

From-SVN: r245648
parent 8f4f841a
2017-02-22 Richard Biener <rguenther@suse.de>
PR tree-optimization/79666
* tree-vrp.c (extract_range_from_binary_expr_1): Make sure
to not symbolically negate if that may introduce undefined
overflow.
2017-02-22 Martin Liska <mliska@suse.cz>
PR lto/79587
......
2017-02-22 Richard Biener <rguenther@suse.de>
PR tree-optimization/79666
* gcc.dg/torture/pr79666.c: New testcase.
2017-02-22 Martin Liska <mliska@suse.cz>
PR lto/79587
......
/* { dg-do run } */
struct
{
unsigned a:6;
} b;
int c, e, g = 7;
signed char d, f = 6, h = -10;
void fn1 ()
{
for (; c < 9; c++)
{
if (f)
g = ~(~0 / (g ^ e));
b.a = ~0;
d = ~((h ^ b.a) & 132 & (~(f && g) | (d && 1)));
e = ~0;
if (d < 127 || f < 1)
continue;
g = 0;
}
}
int main ()
{
fn1 ();
return 0;
}
......@@ -2631,8 +2631,17 @@ extract_range_from_binary_expr_1 (value_range *vr,
min = build_symbolic_expr (expr_type, sym_min_op0,
neg_min_op0, min);
else if (sym_min_op1)
min = build_symbolic_expr (expr_type, sym_min_op1,
neg_min_op1 ^ minus_p, min);
{
/* We may not negate if that might introduce
undefined overflow. */
if (! minus_p
|| neg_min_op1
|| TYPE_OVERFLOW_WRAPS (expr_type))
min = build_symbolic_expr (expr_type, sym_min_op1,
neg_min_op1 ^ minus_p, min);
else
min = NULL_TREE;
}
/* Likewise for the upper bound. */
if (sym_max_op0 == sym_max_op1)
......@@ -2641,8 +2650,17 @@ extract_range_from_binary_expr_1 (value_range *vr,
max = build_symbolic_expr (expr_type, sym_max_op0,
neg_max_op0, max);
else if (sym_max_op1)
max = build_symbolic_expr (expr_type, sym_max_op1,
neg_max_op1 ^ minus_p, max);
{
/* We may not negate if that might introduce
undefined overflow. */
if (! minus_p
|| neg_max_op1
|| TYPE_OVERFLOW_WRAPS (expr_type))
max = build_symbolic_expr (expr_type, sym_max_op1,
neg_max_op1 ^ minus_p, max);
else
max = NULL_TREE;
}
}
else
{
......
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