re PR target/70941 (Test miscompiled with -O2.)

2016-05-06  Richard Biener  <rguenther@suse.de>

	PR middle-end/70941
	* fold-const.c (split_tree): Always convert to the original type
	before negating.

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

From-SVN: r235943
This commit is contained in:
Richard Biener 2016-05-06 07:38:27 +00:00 committed by Richard Biener
parent f5d6c2d81c
commit a4f510181a
4 changed files with 34 additions and 8 deletions

View File

@ -1,3 +1,9 @@
2016-05-06 Richard Biener <rguenther@suse.de>
PR middle-end/70941
* fold-const.c (split_tree): Always convert to the original type
before negating.
2016-05-06 Richard Biener <rguenther@suse.de>
* fwprop.c (fwprop): Remove duplicate cleanup_cfg call.

View File

@ -836,11 +836,10 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code,
*minus_litp = *litp, *litp = 0;
if (neg_conp_p)
*conp = negate_expr (*conp);
if (neg_var_p)
if (neg_var_p && var)
{
/* Convert to TYPE before negating a pointer type expr. */
if (var && POINTER_TYPE_P (TREE_TYPE (var)))
var = fold_convert_loc (loc, type, var);
/* Convert to TYPE before negating. */
var = fold_convert_loc (loc, type, var);
var = negate_expr (var);
}
}
@ -863,10 +862,12 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code,
else if (*minus_litp)
*litp = *minus_litp, *minus_litp = 0;
*conp = negate_expr (*conp);
/* Convert to TYPE before negating a pointer type expr. */
if (var && POINTER_TYPE_P (TREE_TYPE (var)))
var = fold_convert_loc (loc, type, var);
var = negate_expr (var);
if (var)
{
/* Convert to TYPE before negating. */
var = fold_convert_loc (loc, type, var);
var = negate_expr (var);
}
}
return var;

View File

@ -1,3 +1,8 @@
2016-05-06 Richard Biener <rguenther@suse.de>
PR middle-end/70941
* gcc.dg/torture/pr70941.c: New testcase.
2016-05-05 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/57206

View File

@ -0,0 +1,14 @@
/* { dg-do run } */
/* { dg-require-effective-target int32plus } */
extern void abort (void);
char a = 0, b = 0, c = 0, d = 0;
int main()
{
a = -(b - 405418259) - ((d && c) ^ 2040097152);
if (a != -109)
abort();
return 0;
}