aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-07-20 02:45:03 +0000
committerRichard Stallman <rms@gnu.org>1992-07-20 02:45:03 +0000
commit26fcb35ae229b69189f35637125952fa2eabd0a0 (patch)
tree41742ddd7905d1965045ad43d20c4479ed7ad5eb
parent16bae307a6e7d48d6787c671c3a269a71f08b899 (diff)
downloadgcc-26fcb35ae229b69189f35637125952fa2eabd0a0.zip
gcc-26fcb35ae229b69189f35637125952fa2eabd0a0.tar.gz
gcc-26fcb35ae229b69189f35637125952fa2eabd0a0.tar.bz2
(expand_expr, NOP_EXPR case): If EXPAND_INITIALIZER,
generate ZERO_EXTEND or SIGN_EXTEND; don't emit insns. (expand_expr): Set LABEL_REF_NONLOCAL_P for nonlocal labels. From-SVN: r1636
-rw-r--r--gcc/expr.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index e2c8197..1e4191f 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -3073,6 +3073,7 @@ fixed_type_p (exp)
EXPAND_INITIALIZER is much like EXPAND_SUM except that
it also marks a label as absolutely required (it can't be dead).
+ It also makes a ZERO_EXTEND or SIGN_EXTEND instead of emitting extend insns.
This is used for outputting expressions used in initializers. */
rtx
@@ -3146,8 +3147,11 @@ expand_expr (exp, target, tmode, modifier)
else if (modifier == EXPAND_INITIALIZER)
forced_labels = gen_rtx (EXPR_LIST, VOIDmode,
label_rtx (exp), forced_labels);
- return gen_rtx (MEM, FUNCTION_MODE,
+ temp = gen_rtx (MEM, FUNCTION_MODE,
gen_rtx (LABEL_REF, Pmode, label_rtx (exp)));
+ if (function != current_function_decl && function != 0)
+ LABEL_REF_NONLOCAL_P (XEXP (temp, 0)) = 1;
+ return temp;
}
case PARM_DECL:
@@ -3782,9 +3786,11 @@ expand_expr (exp, target, tmode, modifier)
/* Return the entire union. */
return target;
}
- op0 = expand_expr (TREE_OPERAND (exp, 0), NULL_RTX, mode, 0);
+ op0 = expand_expr (TREE_OPERAND (exp, 0), 0, mode, modifier);
if (GET_MODE (op0) == mode || GET_MODE (op0) == VOIDmode)
return op0;
+ if (modifier == EXPAND_INITIALIZER)
+ return gen_rtx (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
if (flag_force_mem && GET_CODE (op0) == MEM)
op0 = copy_to_reg (op0);