From: jamborm Date: Fri, 13 Apr 2012 17:12:33 +0000 (+0000) Subject: 2012-04-13 Martin Jambor X-Git-Tag: upstream/4.9.2~13282 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=75d525a2e9406dcfd3a3f94dcf5e9ef4e361ca1c;p=platform%2Fupstream%2Flinaro-gcc.git 2012-04-13 Martin Jambor * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c0df521..721f681 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-04-13 Martin Jambor + + * 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 PR debug/48866 diff --git a/gcc/expr.c b/gcc/expr.c index 14709bf..46282d1 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));