diff options
-rw-r--r-- | gcc/emit-rtl.c | 17 | ||||
-rw-r--r-- | gcc/expr.h | 3 | ||||
-rw-r--r-- | gcc/final.c | 8 | ||||
-rw-r--r-- | gcc/reload1.c | 13 |
4 files changed, 33 insertions, 8 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 992d604..6186638 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1691,8 +1691,9 @@ set_mem_attributes (ref, t, objectp) MEM_VOLATILE_P (ref) = TYPE_VOLATILE (type); MEM_IN_STRUCT_P (ref) = AGGREGATE_TYPE_P (type); RTX_UNCHANGING_P (ref) - |= (lang_hooks.honor_readonly - && (TYPE_READONLY (type) || TREE_READONLY (t))); + |= ((lang_hooks.honor_readonly + && (TYPE_READONLY (type) || TREE_READONLY (t))) + || (! TYPE_P (t) && TREE_CONSTANT (t))); /* If we are making an object of this type, or if this is a DECL, we know that it is a scalar if the type is not an aggregate. */ @@ -1783,6 +1784,18 @@ set_mem_align (mem, align) MEM_OFFSET (mem), MEM_SIZE (mem), align, GET_MODE (mem)); } + +/* Set the decl for MEM to DECL. */ + +void +set_mem_decl (mem, decl) + rtx mem; + tree decl; +{ + MEM_ATTRS (mem) + = get_mem_attrs (MEM_ALIAS_SET (mem), decl, MEM_OFFSET (mem), + MEM_SIZE (mem), MEM_ALIGN (mem), GET_MODE (mem)); +} /* Return a memory reference like MEMREF, but with its mode changed to MODE and its address changed to ADDR. (VOIDmode means don't change the mode. @@ -615,6 +615,9 @@ extern void set_mem_alias_set PARAMS ((rtx, HOST_WIDE_INT)); /* Set the alignment of MEM to ALIGN bits. */ extern void set_mem_align PARAMS ((rtx, unsigned int)); +/* Set the DECL for MEM to DECL. */ +extern void set_mem_decl PARAMS ((rtx, tree)); + /* Return a memory reference like MEMREF, but with its mode changed to MODE and its address changed to ADDR. (VOIDmode means don't change the mode. diff --git a/gcc/final.c b/gcc/final.c index 8ab79ef..6b2ea7e 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -3304,7 +3304,7 @@ get_decl_from_op (op, paddressp) *paddressp = 0; - if (GET_CODE (op) == REG) + if (GET_CODE (op) == REG && ORIGINAL_REGNO (op) >= FIRST_PSEUDO_REGISTER) return REGNO_DECL (ORIGINAL_REGNO (op)); else if (GET_CODE (op) != MEM) return 0; @@ -3353,9 +3353,9 @@ output_asm_operand_names (operands, oporder, nops) if (decl && DECL_NAME (decl)) { - fprintf (asm_out_file, "%s %s%s", - wrote ? "," : ASM_COMMENT_START, addressp ? "*" : "", - IDENTIFIER_POINTER (DECL_NAME (decl))); + fprintf (asm_out_file, "%c%s %s%s", + wrote ? ',' : '\t', wrote ? "" : ASM_COMMENT_START, + addressp ? "*" : "", IDENTIFIER_POINTER (DECL_NAME (decl))); wrote = 1; } } diff --git a/gcc/reload1.c b/gcc/reload1.c index c5158c7..165573b 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -2043,8 +2043,17 @@ alter_reg (i, from_reg) /* If we have any adjustment to make, or if the stack slot is the wrong mode, make a new stack slot. */ - if (adjust != 0 || GET_MODE (x) != GET_MODE (regno_reg_rtx[i])) - x = adjust_address_nv (x, GET_MODE (regno_reg_rtx[i]), adjust); + x = adjust_address_nv (x, GET_MODE (regno_reg_rtx[i]), adjust); + + /* If we have a decl for the original register, set it for the + memory. If this is a shared MEM, make a copy. */ + if (REGNO_DECL (i)) + { + if (from_reg != -1 && spill_stack_slot[from_reg] == x) + x = copy_rtx (x); + + set_mem_decl (x, REGNO_DECL (i)); + } /* Save the stack slot for later. */ reg_equiv_memory_loc[i] = x; |