From 3aabdc00d0cdf1b4fccdb445cf3846f5d83c3981 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 15 Jan 2015 11:55:37 +0000 Subject: [PATCH] expr.c (expand_expr_real_1): Use the expression to set the memory attributes in all cases but clear MEM_EXPR... * expr.c (expand_expr_real_1) : Use the expression to set the memory attributes in all cases but clear MEM_EXPR if need be. From-SVN: r219648 --- gcc/ChangeLog | 5 +++++ gcc/expr.c | 18 +++++++++--------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gnat.dg/opt47.adb | 31 +++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/opt47.adb diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3fc2bceb1a5..ad0ce7f94ee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-01-15 Eric Botcazou + + * expr.c (expand_expr_real_1) : Use the expression to + set the memory attributes in all cases but clear MEM_EXPR if need be. + 2015-01-15 Yuri Rumyantsev PR tree-optimization/64434 diff --git a/gcc/expr.c b/gcc/expr.c index fc2286257c3..eb4bb9b8fee 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -10137,7 +10137,7 @@ expand_expr_real_1 (tree exp, rtx target, 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; + bool clear_mem_expr = false; /* If we got back the original object, something is wrong. Perhaps we are evaluating an expression too early. In any event, don't @@ -10233,7 +10233,7 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode tmode, memloc = assign_temp (TREE_TYPE (tem), 1, 1); emit_move_insn (memloc, op0); op0 = memloc; - mem_attrs_from_type = true; + clear_mem_expr = true; } if (offset) @@ -10417,17 +10417,17 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode tmode, if (op0 == orig_op0) op0 = copy_rtx (op0); - /* 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); + set_mem_attributes (op0, exp, 0); if (REG_P (XEXP (op0, 0))) mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0)); + /* If op0 is a temporary because the original expressions was forced + to memory, clear MEM_EXPR so that the original expression cannot + be marked as addressable through MEM_EXPR of the temporary. */ + if (clear_mem_expr) + set_mem_expr (op0, NULL_TREE); + MEM_VOLATILE_P (op0) |= volatilep; if (mode == mode1 || mode1 == BLKmode || mode1 == tmode || modifier == EXPAND_CONST_ADDRESS diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7859b6f671b..bd1e6c54633 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-01-15 Eric Botcazou + + * expr.c (expand_expr_real_1) : Use the expression to + set the memory attributes in all cases but clear MEM_EXPR if need be. + 2015-01-15 Richard Biener PR lto/64415 diff --git a/gcc/testsuite/gnat.dg/opt47.adb b/gcc/testsuite/gnat.dg/opt47.adb new file mode 100644 index 00000000000..cfe44eb1e65 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt47.adb @@ -0,0 +1,31 @@ +-- { dg-do run { target i?86-*-* x86_64-*-* alpha*-*-* ia64-*-* } } +-- { dg-options "-O2" } + +with Ada.Characters.Handling; use Ada.Characters.Handling; +with Interfaces; use Interfaces; +with Ada.Unchecked_Conversion; + +procedure Opt47 is + + subtype String4 is String (1 .. 4); + function To_String4 is new Ada.Unchecked_Conversion (Unsigned_32, String4); + type Arr is array (Integer range <>) of Unsigned_32; + Leaf : Arr (1 .. 4) := (1349478766, 1948272498, 1702436946, 1702061409); + Value : Unsigned_32; + Result : String (1 .. 32); + Last : Integer := 0; + +begin + for I in 1 .. 4 loop + Value := Leaf (I); + for J in reverse String4'Range loop + if Is_Graphic (To_String4 (Value)(J)) then + Last := Last + 1; + Result (Last) := To_String4 (Value)(J); + end if; + end loop; + end loop; + if Result (1) /= 'P' then + raise Program_Error; + end if; +end; -- 2.30.2