summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-13 17:12:33 +0000
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-13 17:12:33 +0000
commit75d525a2e9406dcfd3a3f94dcf5e9ef4e361ca1c (patch)
treed43ec3fd9297e9086ec2e59da2e1fb04119e501e
parent2abb79fc589e6dbb9f7f7c5cb4c095dd6764dffa (diff)
downloadgcc-75d525a2e9406dcfd3a3f94dcf5e9ef4e361ca1c.tar.gz
2012-04-13 Martin Jambor <mjambor@suse.cz>
* expr.c (expand_expr_real_1): Pass type, not the expression, to set_mem_attributes for a memory temporary. Do not call the function for the memory temporary created for a bitfield. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186426 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c12
2 files changed, 16 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c0df5218a2b..721f68135eb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-04-13 Martin Jambor <mjambor@suse.cz>
+
+ * expr.c (expand_expr_real_1): Pass type, not the expression, to
+ set_mem_attributes for a memory temporary. Do not call the function
+ for the memory temporary created for a bitfield.
+
2012-04-13 Alexandre Oliva <aoliva@redhat.com>
PR debug/48866
diff --git a/gcc/expr.c b/gcc/expr.c
index 14709bfcd08..46282d10740 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -9603,6 +9603,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
&mode1, &unsignedp, &volatilep, true);
rtx orig_op0, memloc;
+ bool mem_attrs_from_type = false;
/* If we got back the original object, something is wrong. Perhaps
we are evaluating an expression too early. In any event, don't
@@ -9708,6 +9709,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
memloc = assign_temp (nt, 1, 1, 1);
emit_move_insn (memloc, op0);
op0 = memloc;
+ mem_attrs_from_type = true;
}
if (offset)
@@ -9880,7 +9882,6 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
emit_move_insn (new_rtx, op0);
op0 = copy_rtx (new_rtx);
PUT_MODE (op0, BLKmode);
- set_mem_attributes (op0, exp, 1);
}
return op0;
@@ -9901,7 +9902,14 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
if (op0 == orig_op0)
op0 = copy_rtx (op0);
- set_mem_attributes (op0, exp, 0);
+ /* If op0 is a temporary because of forcing to memory, pass only the
+ type to set_mem_attributes so that the original expression is never
+ marked as ADDRESSABLE through MEM_EXPR of the temporary. */
+ if (mem_attrs_from_type)
+ set_mem_attributes (op0, type, 0);
+ else
+ set_mem_attributes (op0, exp, 0);
+
if (REG_P (XEXP (op0, 0)))
mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));