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
This commit is contained in:
parent
c74985e3ee
commit
909263f855
4 changed files with 34 additions and 8 deletions
|
@ -1,3 +1,12 @@
|
|||
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>
|
||||
|
||||
* 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,
|
|||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -9703,11 +9710,6 @@ fold_binary_loc (location_t loc,
|
|||
+ (lit0 != 0) + (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);
|
||||
con0 = associate_trees (loc, con0, con1, code, atype);
|
||||
lit0 = associate_trees (loc, lit0, lit1, code, atype);
|
||||
|
@ -9738,9 +9740,8 @@ fold_binary_loc (location_t loc,
|
|||
}
|
||||
|
||||
/* Don't introduce overflows through reassociation. */
|
||||
if (!any_overflows
|
||||
&& ((lit0 && TREE_OVERFLOW_P (lit0))
|
||||
|| (minus_lit0 && TREE_OVERFLOW_P (minus_lit0))))
|
||||
if ((lit0 && TREE_OVERFLOW_P (lit0))
|
||||
|| (minus_lit0 && TREE_OVERFLOW_P (minus_lit0)))
|
||||
return NULL_TREE;
|
||||
|
||||
if (minus_lit0)
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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>
|
||||
|
||||
* gcc.target/sparc/overflow-4.c: Add -mno-vis3.
|
||||
|
|
11
gcc/testsuite/c-c++-common/ubsan/pr81088.c
Normal file
11
gcc/testsuite/c-c++-common/ubsan/pr81088.c
Normal file
|
@ -0,0 +1,11 @@
|
|||
/* { 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue