(expand_expr, case COMPONENT_REF): Don't extract field from a CONSTRUCTOR if it alrea...
authorRichard Kenner <kenner@gcc.gnu.org>
Mon, 31 Oct 1994 12:23:35 +0000 (07:23 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Mon, 31 Oct 1994 12:23:35 +0000 (07:23 -0500)
(expand_expr, case COMPONENT_REF): Don't extract field from a CONSTRUCTOR if
it already has a TREE_CST_RTL.
(expand_expr, case ADDR_EXPR): Call mark_temp_addr_taken on the temporary made
when operand needs to be stored into memory.

From-SVN: r8362

gcc/expr.c

index f603554282d1fcc901451bb8320ea5352ea76800..5594092044569d3703736c3ed0c17524e77c39b1 100644 (file)
@@ -4485,9 +4485,12 @@ expand_expr (exp, target, tmode, modifier)
     case COMPONENT_REF:
     case BIT_FIELD_REF:
       /* If the operand is a CONSTRUCTOR, we can just extract the
-        appropriate field if it is present.  */
+        appropriate field if it is present.  Don't do this if we have
+        already written the data since we want to refer to that copy
+        and varasm.c assumes that's what we'll do.  */
       if (code != ARRAY_REF
-         && TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR)
+         && TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR
+         && TREE_CST_RTL (TREE_OPERAND (exp, 0)) == 0)
        {
          tree elt;
 
@@ -6066,6 +6069,7 @@ expand_expr (exp, target, tmode, modifier)
                = assign_stack_temp (inner_mode,
                                     int_size_in_bytes (inner_type), 1);
 
+             mark_temp_addr_taken (memloc);
              emit_move_insn (memloc, op0);
              op0 = memloc;
            }