aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2002-10-07 09:37:12 +0200
committerRichard Henderson <rth@gcc.gnu.org>2002-10-07 00:37:12 -0700
commit4ef7870a4d8aacd145bdbde7ae914f500bf13b56 (patch)
treed7b1d8da3e6a106a36561c0c86b098f57082381e /gcc/expr.c
parentfe736b6c2c9fa73540d1f54059fdccbd7ac9aac6 (diff)
downloadgcc-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.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 01c3603..e33d814 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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);