From 9506aecb3b05c1a9f1f04760fc5320acbfc283b1 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 15 Oct 2012 10:48:17 +0000 Subject: [PATCH] expr.c (expand_expr_real_1): Do not unnecessarily copy the object in the MEM_P case. * expr.c (expand_expr_real_1) : Do not unnecessarily copy the object in the MEM_P case. From-SVN: r192452 --- gcc/ChangeLog | 6 +++++- gcc/expr.c | 11 ++++++++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/unchecked_convert9.adb | 15 +++++++++++++++ gcc/testsuite/gnat.dg/unchecked_convert9.ads | 20 ++++++++++++++++++++ 5 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/unchecked_convert9.adb create mode 100644 gcc/testsuite/gnat.dg/unchecked_convert9.ads diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85db69e09f2..2c7af2a0735 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-10-15 Eric Botcazou + + * expr.c (expand_expr_real_1) : Do not unnecessarily + copy the object in the MEM_P case. + 2012-10-15 Richard Guenther * tree-streamer-out.c (streamer_pack_tree_bitfields): Back @@ -37,7 +42,6 @@ (build_insn_chain): Use df_get_live_out instead of DF_LR_OUT. (do_reload): Remove the DF_LIVE problem for -O1. - 2012-10-14 Steven Bosscher PR rtl-optimization/54919 diff --git a/gcc/expr.c b/gcc/expr.c index 1adea93c316..7cf812d3e3a 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -10270,10 +10270,15 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, { enum insn_code icode; - op0 = copy_rtx (op0); - if (TYPE_ALIGN_OK (type)) - set_mem_align (op0, MAX (MEM_ALIGN (op0), TYPE_ALIGN (type))); + { + /* ??? Copying the MEM without substantially changing it might + run afoul of the code handling volatile memory references in + store_expr, which assumes that TARGET is returned unmodified + if it has been used. */ + op0 = copy_rtx (op0); + set_mem_align (op0, MAX (MEM_ALIGN (op0), TYPE_ALIGN (type))); + } else if (mode != BLKmode && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode) /* If the target does have special handling for unaligned diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f361e2aaf08..23f8c2e0dd4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-10-15 Eric Botcazou + + * gnat.dg/unchecked_convert9.ad[sb]: New test. + 2012-10-13 Jason Merrill * g++.dg/tls/thread_local7g.C: Require tls_native. diff --git a/gcc/testsuite/gnat.dg/unchecked_convert9.adb b/gcc/testsuite/gnat.dg/unchecked_convert9.adb new file mode 100644 index 00000000000..133f3b94c6a --- /dev/null +++ b/gcc/testsuite/gnat.dg/unchecked_convert9.adb @@ -0,0 +1,15 @@ +-- { dg-do compile } +-- { dg-options "-O -fdump-rtl-final" } + +package body Unchecked_Convert9 is + + procedure Proc is + L : Unsigned_32 := 16#55557777#; + begin + Var := Conv (L); + end; + +end Unchecked_Convert9; + +-- { dg-final { scan-rtl-dump-times "set \\(mem/v" 1 "final" } } +-- { dg-final { cleanup-rtl-dump "final" } } diff --git a/gcc/testsuite/gnat.dg/unchecked_convert9.ads b/gcc/testsuite/gnat.dg/unchecked_convert9.ads new file mode 100644 index 00000000000..d4595f52a02 --- /dev/null +++ b/gcc/testsuite/gnat.dg/unchecked_convert9.ads @@ -0,0 +1,20 @@ +with System; +with Ada.Unchecked_Conversion; +with Interfaces; use Interfaces; + +package Unchecked_Convert9 is + + type R is record + H : Unsigned_16; + L : Unsigned_16; + end record; + + Var : R; + pragma Volatile (Var); + + function Conv is new + Ada.Unchecked_Conversion (Source => Unsigned_32, Target => R); + + procedure Proc; + +end Unchecked_Convert9; -- 2.30.2