mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-19 22:31:07 +08:00
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) <normal_inner_ref>: Use the expression to set the memory attributes in all cases but clear MEM_EXPR if need be. From-SVN: r219648
This commit is contained in:
parent
04d8b4dcbf
commit
3aabdc00d0
@ -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
|
||||
|
18
gcc/expr.c
18
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
|
||||
|
@ -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
|
||||
|
31
gcc/testsuite/gnat.dg/opt47.adb
Normal file
31
gcc/testsuite/gnat.dg/opt47.adb
Normal file
@ -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;
|
Loading…
x
Reference in New Issue
Block a user