aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-02-25 21:46:15 -0800
committerRichard Henderson <rth@gcc.gnu.org>2002-02-25 21:46:15 -0800
commit3b40e71b7b49b7ed0d0c92ebb22c56988db59280 (patch)
treeb0eaa6c8b2c0bcf71599a0f3f06b5957082ec36b /gcc/expr.c
parent1bc59af523f6fa2eefc7601bde3d1b15218e2f40 (diff)
downloadgcc-3b40e71b7b49b7ed0d0c92ebb22c56988db59280.zip
gcc-3b40e71b7b49b7ed0d0c92ebb22c56988db59280.tar.gz
gcc-3b40e71b7b49b7ed0d0c92ebb22c56988db59280.tar.bz2
expr.c (expand_expr): Do not apply distributive law in EXPAND_SUM case.
* expr.c (expand_expr) [MULT_EXPR]: Do not apply distributive law in EXPAND_SUM case. Use host_integerp/tree_low_cst. From-SVN: r50033
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index bcc76bc..7d0f12a 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -7610,23 +7610,20 @@ expand_expr (exp, target, tmode, modifier)
indexed address, for machines that support that. */
if (modifier == EXPAND_SUM && mode == ptr_mode
- && TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST
- && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
+ && host_integerp (TREE_OPERAND (exp, 1), 0))
{
op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode,
EXPAND_SUM);
- /* Apply distributive law if OP0 is x+c. */
- if (GET_CODE (op0) == PLUS
- && GET_CODE (XEXP (op0, 1)) == CONST_INT)
- return
- gen_rtx_PLUS
- (mode,
- gen_rtx_MULT
- (mode, XEXP (op0, 0),
- GEN_INT (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1)))),
- GEN_INT (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))
- * INTVAL (XEXP (op0, 1))));
+ /* 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);
@@ -7635,7 +7632,7 @@ expand_expr (exp, target, tmode, modifier)
return
gen_rtx_MULT (mode, op0,
- GEN_INT (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))));
+ GEN_INT (tree_low_cst (TREE_OPERAND (exp, 1), 0)));
}
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))