expr.c (expand_expr_real_1): Use the expression to set the memory attributes in all...
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 15 Jan 2015 11:55:37 +0000 (11:55 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 15 Jan 2015 11:55:37 +0000 (11:55 +0000)
* expr.c (expand_expr_real_1) <normal_inner_ref>: Use the expression to
set the memory attributes in all cases but clear MEM_EXPR if need be.

From-SVN: r219648

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt47.adb [new file with mode: 0644]

index 3fc2bceb1a5a545e06e45b1b1ad3e79239f4c0ae..ad0ce7f94eee4700a47bb22d55af544d53f223b4 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * expr.c (expand_expr_real_1) <normal_inner_ref>: Use the expression to
+       set the memory attributes in all cases but clear MEM_EXPR if need be.
+
 2015-01-15  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        PR tree-optimization/64434
index fc2286257c3b6731e666444cb70a98c5c3e4214a..eb4bb9b8fee8bf4b191e049ef2455386c438a629 100644 (file)
@@ -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
index 7859b6f671b37e140fe0b17da11d6f12dba5e388..bd1e6c54633da3b6d8d3c050e2178bb792da58b7 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-15  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * expr.c (expand_expr_real_1) <normal_inner_ref>: Use the expression to
+       set the memory attributes in all cases but clear MEM_EXPR if need be.
+
 2015-01-15  Richard Biener  <rguenther@suse.de>
 
        PR lto/64415
diff --git a/gcc/testsuite/gnat.dg/opt47.adb b/gcc/testsuite/gnat.dg/opt47.adb
new file mode 100644 (file)
index 0000000..cfe44eb
--- /dev/null
@@ -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;