From: Eric Botcazou Date: Mon, 6 Oct 2014 17:30:34 +0000 (+0000) Subject: calls.c (expand_call): Do not use the target as the return slot if it is not sufficie... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=391756ad9de0df816b7bc1453969101b979a28fc;p=gcc.git calls.c (expand_call): Do not use the target as the return slot if it is not sufficiently aligned. * calls.c (expand_call): Do not use the target as the return slot if it is not sufficiently aligned. From-SVN: r215958 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 13ac914d14b..73d5d5a6b92 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-10-06 Eric Botcazou + + * calls.c (expand_call): Do not use the target as the return slot if + it is not sufficiently aligned. + 2014-10-06 Bill Schmidt * config/rs6000/rs6000.c (analyze_swaps commentary): Add diff --git a/gcc/calls.c b/gcc/calls.c index 345331fa6db..9c19f38302a 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2377,7 +2377,14 @@ expand_call (tree exp, rtx target, int ignore) { struct_value_size = int_size_in_bytes (rettype); - if (target && MEM_P (target) && CALL_EXPR_RETURN_SLOT_OPT (exp)) + /* Even if it is semantically safe to use the target as the return + slot, it may be not sufficiently aligned for the return type. */ + if (CALL_EXPR_RETURN_SLOT_OPT (exp) + && target + && MEM_P (target) + && !(MEM_ALIGN (target) < TYPE_ALIGN (rettype) + && SLOW_UNALIGNED_ACCESS (TYPE_MODE (rettype), + MEM_ALIGN (target)))) structure_value_addr = XEXP (target, 0); else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 99c66d9bbe2..2b54708db15 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-10-06 Eric Botcazou + + * gnat.dg/return4.adb: New test. + * gnat.dg/return4_pkg.ad[sb]: New helper. + 2014-10-06 Edward Smith-Rowland <3dw4rd@verizon.net> * g++.dg/cpp1y/attr-deprecated-neg.C: Attribute no longer ignored. diff --git a/gcc/testsuite/gnat.dg/return4.adb b/gcc/testsuite/gnat.dg/return4.adb new file mode 100644 index 00000000000..8202acf51bc --- /dev/null +++ b/gcc/testsuite/gnat.dg/return4.adb @@ -0,0 +1,22 @@ +-- { dg-do run } +-- { dg-options "-O" } + +with Return4_Pkg; use Return4_Pkg; + +procedure Return4 is + + type Local_Rec is record + C : Character; + R : Rec; + end record; + pragma Pack (Local_Rec); + + L : Local_Rec; + for L'Alignment use 2; + +begin + L.R := Get_Value (0); + if L.R.I1 /= 0 then + raise Program_Error; + end if; +end; diff --git a/gcc/testsuite/gnat.dg/return4_pkg.adb b/gcc/testsuite/gnat.dg/return4_pkg.adb new file mode 100644 index 00000000000..0b59221c149 --- /dev/null +++ b/gcc/testsuite/gnat.dg/return4_pkg.adb @@ -0,0 +1,9 @@ +package body Return4_Pkg is + + function Get_Value (I : Integer) return Rec is + Value : Rec := (I1 => I, I2 => I, I3 => I); + begin + return Value; + end; + +end Return4_Pkg; diff --git a/gcc/testsuite/gnat.dg/return4_pkg.ads b/gcc/testsuite/gnat.dg/return4_pkg.ads new file mode 100644 index 00000000000..9ed220fd10d --- /dev/null +++ b/gcc/testsuite/gnat.dg/return4_pkg.ads @@ -0,0 +1,9 @@ +package Return4_Pkg is + + type Rec is record + I1, I2, I3 : Integer; + end record; + + function Get_Value (I : Integer) return Rec; + +end Return4_Pkg;