diff options
author | Richard Henderson <rth@redhat.com> | 2002-02-25 21:46:15 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-02-25 21:46:15 -0800 |
commit | 3b40e71b7b49b7ed0d0c92ebb22c56988db59280 (patch) | |
tree | b0eaa6c8b2c0bcf71599a0f3f06b5957082ec36b /gcc/expr.c | |
parent | 1bc59af523f6fa2eefc7601bde3d1b15218e2f40 (diff) | |
download | gcc-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.c | 25 |
1 files changed, 11 insertions, 14 deletions
@@ -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)) |