Commit e44842fe by Richard Kenner

(store_constructor): Treat QUAL_UNION_TYPE just like UNION_TYPE.

(safe_from_p, case ADDR_EXPR): EXP is safe from X it is is static or if the
object whose address is being taken is safe from X.
(expand_expr): Fix misplaced comment from last change.
(expand_expr, case *_DECL): If not already used, assemble external.
(expand_expr, case EXIT_EXPR): Simplify.
(expand_expr, TRUTH_{AND,OR}IF_EXPR): Properly handle IGNORE case.

From-SVN: r4772
parent c0560b8b
...@@ -2518,12 +2518,14 @@ store_constructor (exp, target) ...@@ -2518,12 +2518,14 @@ store_constructor (exp, target)
} }
#endif #endif
if (TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE) if (TREE_CODE (type) == RECORD_TYPE || TREE_CODE (type) == UNION_TYPE
|| TREE_CODE (type) == QUAL_UNION_TYPE)
{ {
register tree elt; register tree elt;
/* Inform later passes that the whole union value is dead. */ /* Inform later passes that the whole union value is dead. */
if (TREE_CODE (type) == UNION_TYPE) if (TREE_CODE (type) == UNION_TYPE
|| TREE_CODE (type) == QUAL_UNION_TYPE)
emit_insn (gen_rtx (CLOBBER, VOIDmode, target)); emit_insn (gen_rtx (CLOBBER, VOIDmode, target));
/* If we are building a static constructor into a register, /* If we are building a static constructor into a register,
...@@ -3142,7 +3144,8 @@ safe_from_p (x, exp) ...@@ -3142,7 +3144,8 @@ safe_from_p (x, exp)
switch (TREE_CODE (exp)) switch (TREE_CODE (exp))
{ {
case ADDR_EXPR: case ADDR_EXPR:
return staticp (TREE_OPERAND (exp, 0)); return (staticp (TREE_OPERAND (exp, 0))
|| safe_from_p (x, TREE_OPERAND (exp, 0)));
case INDIRECT_REF: case INDIRECT_REF:
if (GET_CODE (x) == MEM) if (GET_CODE (x) == MEM)
...@@ -3337,14 +3340,15 @@ expand_expr (exp, target, tmode, modifier) ...@@ -3337,14 +3340,15 @@ expand_expr (exp, target, tmode, modifier)
the first. */ the first. */
return expand_expr (TREE_OPERAND (exp, 0), const0_rtx, return expand_expr (TREE_OPERAND (exp, 0), const0_rtx,
VOIDmode, modifier); VOIDmode, modifier);
/* If will do cse, generate all results into pseudo registers
since 1) that allows cse to find more things
and 2) otherwise cse could produce an insn the machine
cannot support. */
target = 0, original_target = 0; target = 0, original_target = 0;
} }
/* If will do cse, generate all results into pseudo registers
since 1) that allows cse to find more things
and 2) otherwise cse could produce an insn the machine
cannot support. */
if (! cse_not_expected && mode != BLKmode && target if (! cse_not_expected && mode != BLKmode && target
&& (GET_CODE (target) != REG || REGNO (target) < FIRST_PSEUDO_REGISTER)) && (GET_CODE (target) != REG || REGNO (target) < FIRST_PSEUDO_REGISTER))
target = subtarget; target = subtarget;
...@@ -3389,9 +3393,15 @@ expand_expr (exp, target, tmode, modifier) ...@@ -3389,9 +3393,15 @@ expand_expr (exp, target, tmode, modifier)
case RESULT_DECL: case RESULT_DECL:
if (DECL_RTL (exp) == 0) if (DECL_RTL (exp) == 0)
abort (); abort ();
/* Ensure variable marked as used /* Ensure variable marked as used even if it doesn't go through
even if it doesn't go through a parser. */ a parser. If it hasn't be used yet, write out an external
TREE_USED (exp) = 1; definition. */
if (! TREE_USED (exp))
{
assemble_external (exp);
TREE_USED (exp) = 1;
}
/* Handle variables inherited from containing functions. */ /* Handle variables inherited from containing functions. */
context = decl_function_context (exp); context = decl_function_context (exp);
...@@ -3590,13 +3600,8 @@ expand_expr (exp, target, tmode, modifier) ...@@ -3590,13 +3600,8 @@ expand_expr (exp, target, tmode, modifier)
return SAVE_EXPR_RTL (exp); return SAVE_EXPR_RTL (exp);
case EXIT_EXPR: case EXIT_EXPR:
/* Exit the current loop if the body-expression is true. */ expand_exit_loop_if_false (NULL_PTR,
{ invert_truthvalue (TREE_OPERAND (exp, 0)));
rtx label = gen_label_rtx ();
do_jump (TREE_OPERAND (exp, 0), label, NULL_RTX);
expand_exit_loop (NULL_PTR);
emit_label (label);
}
return const0_rtx; return const0_rtx;
case LOOP_EXPR: case LOOP_EXPR:
...@@ -4781,18 +4786,25 @@ expand_expr (exp, target, tmode, modifier) ...@@ -4781,18 +4786,25 @@ expand_expr (exp, target, tmode, modifier)
case TRUTH_ANDIF_EXPR: case TRUTH_ANDIF_EXPR:
case TRUTH_ORIF_EXPR: case TRUTH_ORIF_EXPR:
if (target == 0 || ! safe_from_p (target, exp) if (! ignore
/* Make sure we don't have a hard reg (such as function's return && (target == 0 || ! safe_from_p (target, exp)
value) live across basic blocks, if not optimizing. */ /* Make sure we don't have a hard reg (such as function's return
|| (!optimize && GET_CODE (target) == REG value) live across basic blocks, if not optimizing. */
&& REGNO (target) < FIRST_PSEUDO_REGISTER)) || (!optimize && GET_CODE (target) == REG
&& REGNO (target) < FIRST_PSEUDO_REGISTER)))
target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode); target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
emit_clr_insn (target);
if (target)
emit_clr_insn (target);
op1 = gen_label_rtx (); op1 = gen_label_rtx ();
jumpifnot (exp, op1); jumpifnot (exp, op1);
emit_0_to_1_insn (target);
if (target)
emit_0_to_1_insn (target);
emit_label (op1); emit_label (op1);
return target; return ignore ? const0_rtx : target;
case TRUTH_NOT_EXPR: case TRUTH_NOT_EXPR:
op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, 0); op0 = expand_expr (TREE_OPERAND (exp, 0), target, VOIDmode, 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment