Message ID | 20120412154407.GA14221@virgil.arch.suse.de |
---|---|
State | New |
Headers | show |
> Well, the commit did not add a testcase and when I looked up the patch > in the mailing list archive > (http://gcc.gnu.org/ml/gcc-patches/2006-11/msg01449.html) it said it > was fixing problems not reproducible on trunk so it's basically > impossible for me to evaluate whether it is still necessary by some > simple testing. Having said that, I guess I can give it a round of > regular testing on all the platforms I have currently set up. The problem was that, for the same address, you had the alias set of the type on one MEM and the alias set of the reference on the other MEM. If the alias set of the reference doesn't conflict with that of the type (this can happen in Ada because of DECL_NONADDRESSABLE_P), the RAW dependency may be missed. If we don't put the alias set of the reference on one of the MEM, then I don't think that we need to put it on the other MEM. That's what's done for the first, non-bitfield temporary now. > 2012-04-10 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. Fine with me, but the now dangling code in the bitfield case is a bit annoying.
Index: src/gcc/expr.c =================================================================== --- src.orig/gcc/expr.c +++ src/gcc/expr.c @@ -9598,6 +9598,7 @@ expand_expr_real_1 (tree exp, rtx target 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 @@ -9703,6 +9704,7 @@ expand_expr_real_1 (tree exp, rtx target memloc = assign_temp (nt, 1, 1, 1); emit_move_insn (memloc, op0); op0 = memloc; + mem_attrs_from_type = true; } if (offset) @@ -9875,7 +9877,6 @@ expand_expr_real_1 (tree exp, rtx target emit_move_insn (new_rtx, op0); op0 = copy_rtx (new_rtx); PUT_MODE (op0, BLKmode); - set_mem_attributes (op0, exp, 1); } return op0; @@ -9896,7 +9897,14 @@ expand_expr_real_1 (tree exp, rtx target 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));