diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2002-10-07 09:37:12 +0200 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-10-07 00:37:12 -0700 |
commit | 4ef7870a4d8aacd145bdbde7ae914f500bf13b56 (patch) | |
tree | d7b1d8da3e6a106a36561c0c86b098f57082381e /gcc/expr.c | |
parent | fe736b6c2c9fa73540d1f54059fdccbd7ac9aac6 (diff) | |
download | gcc-4ef7870a4d8aacd145bdbde7ae914f500bf13b56.zip gcc-4ef7870a4d8aacd145bdbde7ae914f500bf13b56.tar.gz gcc-4ef7870a4d8aacd145bdbde7ae914f500bf13b56.tar.bz2 |
re PR c/7411 (cistore.c:392: Internal compiler error in instantiate_virtual_regs_1, at function.c:3974)
PR c/7411
* expr.c (expand_expr) [PLUS]: Simplify after the operands
have been expanded in EXPAND_NORMAL mode.
Co-Authored-By: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
From-SVN: r57882
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 15 |
1 files changed, 11 insertions, 4 deletions
@@ -7899,16 +7899,23 @@ expand_expr (exp, target, tmode, modifier) } } + if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1)) + subtarget = 0; + /* No sense saving up arithmetic to be done if it's all in the wrong mode to form part of an address. And force_operand won't know whether to sign-extend or zero-extend. */ if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER) || mode != ptr_mode) - goto binop; - - if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1)) - subtarget = 0; + { + op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0); + op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0); + temp = simplify_binary_operation (PLUS, mode, op0, op1); + if (temp) + return temp; + goto binop2; + } op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, modifier); op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, modifier); |