diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-11-01 00:59:53 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-11-01 00:59:53 +0000 |
commit | 41ba7ed74c7c2f8c4ede7dd98f9e5550869df45c (patch) | |
tree | 487ce678894b4aacf864a61333bbb21317e63e95 | |
parent | 3d63de248f683be76a1ea4a81646813ff7d4b085 (diff) | |
download | gcc-41ba7ed74c7c2f8c4ede7dd98f9e5550869df45c.zip gcc-41ba7ed74c7c2f8c4ede7dd98f9e5550869df45c.tar.gz gcc-41ba7ed74c7c2f8c4ede7dd98f9e5550869df45c.tar.bz2 |
re PR middle-end/11968 (Array reference is incorrectly computed for POINTERS_EXTEND_UNSIGNED)
PR middle-end/11968
* expr.c (expand_expr <MULT_EXPR>): Remove inappropriate and
confusing comment; distributivity isn't handled in expand_expr.
* fold-const.c (extract_muldiv_1 <PLUS_EXPR>): Allow overflow
in distributivity, if wrap-around semantics are specified with
-fwrapv.
From-SVN: r73166
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/expr.c | 10 | ||||
-rw-r--r-- | gcc/fold-const.c | 7 |
3 files changed, 14 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a4ca9c7..7a21708 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2003-10-31 Roger Sayle <roger@eyesopen.com> + + PR middle-end/11968 + * expr.c (expand_expr <MULT_EXPR>): Remove inappropriate and + confusing comment; distributivity isn't handled in expand_expr. + * fold-const.c (extract_muldiv_1 <PLUS_EXPR>): Allow overflow + in distributivity, if wrap-around semantics are specified with + -fwrapv. + 2003-11-01 Alan Modra <amodra@bigpond.net.au> PR 12315 @@ -7854,16 +7854,6 @@ expand_expr (tree exp, rtx target, enum machine_mode tmode, op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, EXPAND_SUM); - /* If we knew for certain that this is arithmetic for an array - reference, and we knew the bounds of the array, then we could - apply the distributive law across (PLUS X C) for constant C. - Without such knowledge, we risk overflowing the computation - when both X and C are large, but X+C isn't. */ - /* ??? Could perhaps special-case EXP being unsigned and C being - positive. In that case we are certain that X+C is no smaller - than X and so the transformed expression will overflow iff the - original would have. */ - if (GET_CODE (op0) != REG) op0 = force_operand (op0, NULL_RTX); if (GET_CODE (op0) != REG) diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 85909a3..3787915 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -4433,8 +4433,11 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type) if (code == MULT_EXPR || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0))) { - op1 = const_binop (code, convert (ctype, op1), convert (ctype, c), 0); - if (op1 == 0 || TREE_OVERFLOW (op1)) + op1 = const_binop (code, convert (ctype, op1), + convert (ctype, c), 0); + /* We allow the constant to overflow with wrapping semantics. */ + if (op1 == 0 + || (TREE_OVERFLOW (op1) && ! flag_wrapv)) break; } else |