Commit 4f2c198d by Richard Biener Committed by Richard Biener

re PR sanitizer/81065 (UBSAN: false positive as a result of distribution involving different types)

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

	PR middle-end/81065
	* fold-const.c (extract_muldiv_1): Remove bogus distribution
	case of C * (x * C2 + C3).
	(fold_addr_of_array_ref_difference): Properly fold index difference.

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

From-SVN: r249144
parent cd34e543
2017-06-13 Richard Biener <rguenther@suse.de>
PR middle-end/81065
* fold-const.c (extract_muldiv_1): Remove bogus distribution
case of C * (x * C2 + C3).
(fold_addr_of_array_ref_difference): Properly fold index difference.
2017-06-12 David S. Miller <davem@davemloft.net> 2017-06-12 David S. Miller <davem@davemloft.net>
PR target/80968 PR target/80968
......
...@@ -6241,11 +6241,6 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type, ...@@ -6241,11 +6241,6 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
if (TYPE_UNSIGNED (ctype) && ctype != type) if (TYPE_UNSIGNED (ctype) && ctype != type)
break; break;
/* If we were able to eliminate our operation from the first side,
apply our operation to the second side and reform the PLUS. */
if (t1 != 0 && (TREE_CODE (t1) != code || code == MULT_EXPR))
return fold_build2 (tcode, ctype, fold_convert (ctype, t1), op1);
/* The last case is if we are a multiply. In that case, we can /* The last case is if we are a multiply. In that case, we can
apply the distributive law to commute the multiply and addition apply the distributive law to commute the multiply and addition
if the multiplication of the constants doesn't overflow if the multiplication of the constants doesn't overflow
...@@ -8908,7 +8903,7 @@ fold_addr_of_array_ref_difference (location_t loc, tree type, ...@@ -8908,7 +8903,7 @@ fold_addr_of_array_ref_difference (location_t loc, tree type,
tree op0 = fold_convert_loc (loc, type, TREE_OPERAND (aref0, 1)); tree op0 = fold_convert_loc (loc, type, TREE_OPERAND (aref0, 1));
tree op1 = fold_convert_loc (loc, type, TREE_OPERAND (aref1, 1)); tree op1 = fold_convert_loc (loc, type, TREE_OPERAND (aref1, 1));
tree esz = fold_convert_loc (loc, type, array_ref_element_size (aref0)); tree esz = fold_convert_loc (loc, type, array_ref_element_size (aref0));
tree diff = build2 (MINUS_EXPR, type, op0, op1); tree diff = fold_build2_loc (loc, MINUS_EXPR, type, op0, op1);
return fold_build2_loc (loc, PLUS_EXPR, type, return fold_build2_loc (loc, PLUS_EXPR, type,
base_offset, base_offset,
fold_build2_loc (loc, MULT_EXPR, type, fold_build2_loc (loc, MULT_EXPR, type,
......
2017-06-13 Richard Biener <rguenther@suse.de>
PR middle-end/81065
* c-c++-common/ubsan/pr81065.c: New testcase.
2017-06-12 Ian Lance Taylor <iant@golang.org> 2017-06-12 Ian Lance Taylor <iant@golang.org>
* gcc.dg/tree-prof/split-1.c: Require split_stack, don't require * gcc.dg/tree-prof/split-1.c: Require split_stack, don't require
......
/* { dg-do run } */
/* { dg-options "-fsanitize=undefined -fsanitize-undefined-trap-on-error" } */
unsigned char x = 154;
int foo() {
// 8575 * (254408 - 9057) = 8575 * 245351 = 2103884825 = 0x7d66bc19
return 8575 * (1652 * x - 9057);
}
int main() {
foo();
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