Commit 909263f8 by Richard Biener Committed by Richard Biener

re PR middle-end/81088 (UBSAN: false positive as a result of reassosiation)

2017-06-14  Richard Biener  <rguenther@suse.de>

	PR middle-end/81088
	* fold-const.c (split_tree): Drop TREE_OVERFLOW flag from
	literal constants.
	(fold_binary_loc): When associating do not treat pre-existing
	TREE_OVERFLOW on literal constants as a reason to allow
	TREE_OVERFLOW on associated literal constants.

	* c-c++-common/ubsan/pr81088.c: New testcase.

From-SVN: r249192
parent c74985e3
2017-06-14 Richard Biener <rguenther@suse.de>
PR middle-end/81088
* fold-const.c (split_tree): Drop TREE_OVERFLOW flag from
literal constants.
(fold_binary_loc): When associating do not treat pre-existing
TREE_OVERFLOW on literal constants as a reason to allow
TREE_OVERFLOW on associated literal constants.
2017-06-14 Eric Botcazou <ebotcazou@adacore.com> 2017-06-14 Eric Botcazou <ebotcazou@adacore.com>
* config/sparc/sparc.h (MASK_ISA): Add MASK_LEON and MASK_LEON3. * config/sparc/sparc.h (MASK_ISA): Add MASK_LEON and MASK_LEON3.
......
...@@ -880,6 +880,13 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code, ...@@ -880,6 +880,13 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code,
} }
} }
if (*litp
&& TREE_OVERFLOW_P (*litp))
*litp = drop_tree_overflow (*litp);
if (*minus_litp
&& TREE_OVERFLOW_P (*minus_litp))
*minus_litp = drop_tree_overflow (*minus_litp);
return var; return var;
} }
...@@ -9703,11 +9710,6 @@ fold_binary_loc (location_t loc, ...@@ -9703,11 +9710,6 @@ fold_binary_loc (location_t loc,
+ (lit0 != 0) + (lit1 != 0) + (lit0 != 0) + (lit1 != 0)
+ (minus_lit0 != 0) + (minus_lit1 != 0)))) + (minus_lit0 != 0) + (minus_lit1 != 0))))
{ {
bool any_overflows = false;
if (lit0) any_overflows |= TREE_OVERFLOW (lit0);
if (lit1) any_overflows |= TREE_OVERFLOW (lit1);
if (minus_lit0) any_overflows |= TREE_OVERFLOW (minus_lit0);
if (minus_lit1) any_overflows |= TREE_OVERFLOW (minus_lit1);
var0 = associate_trees (loc, var0, var1, code, atype); var0 = associate_trees (loc, var0, var1, code, atype);
con0 = associate_trees (loc, con0, con1, code, atype); con0 = associate_trees (loc, con0, con1, code, atype);
lit0 = associate_trees (loc, lit0, lit1, code, atype); lit0 = associate_trees (loc, lit0, lit1, code, atype);
...@@ -9738,9 +9740,8 @@ fold_binary_loc (location_t loc, ...@@ -9738,9 +9740,8 @@ fold_binary_loc (location_t loc,
} }
/* Don't introduce overflows through reassociation. */ /* Don't introduce overflows through reassociation. */
if (!any_overflows if ((lit0 && TREE_OVERFLOW_P (lit0))
&& ((lit0 && TREE_OVERFLOW_P (lit0)) || (minus_lit0 && TREE_OVERFLOW_P (minus_lit0)))
|| (minus_lit0 && TREE_OVERFLOW_P (minus_lit0))))
return NULL_TREE; return NULL_TREE;
if (minus_lit0) if (minus_lit0)
......
2017-06-14 Richard Biener <rguenther@suse.de>
PR middle-end/81088
* c-c++-common/ubsan/pr81088.c: New testcase.
2017-06-14 Eric Botcazou <ebotcazou@adacore.com> 2017-06-14 Eric Botcazou <ebotcazou@adacore.com>
* gcc.target/sparc/overflow-4.c: Add -mno-vis3. * gcc.target/sparc/overflow-4.c: Add -mno-vis3.
......
/* { dg-do run } */
/* { dg-options "-fsanitize=undefined -fsanitize-undefined-trap-on-error" } */
short s = 2;
short y = 1;
int i;
int main()
{
i = -(s + (int)(~(unsigned)(0 / y))) + 0x7fffffff;
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