mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-05 05:10:33 +08:00
re PR target/57949 ([powerpc64] Structure parameter alignment issue with vector extensions)
gcc: 2013-08-14 Bill Schmidt <wschmidt@linux.vnet.ibm.com> PR target/57949 * doc/invoke.texi: Add documentation of mcompat-align-parm option. * config/rs6000/rs6000.opt: Add mcompat-align-parm option. * config/rs6000/rs6000.c (rs6000_function_arg_boundary): For AIX and Linux, correct BLKmode alignment when 128-bit alignment is required and compatibility flag is not set. (rs6000_gimplify_va_arg): For AIX and Linux, honor specified alignment for zero-size arguments when compatibility flag is not set. gcc/testsuite: 2013-08-14 Bill Schmidt <wschmidt@linux.vnet.ibm.com> PR target/57949 * gcc.target/powerpc/pr57949-1.c: New. * gcc.target/powerpc/pr57949-2.c: New. From-SVN: r201750
This commit is contained in:
parent
4ca890e22e
commit
6469da2cb2
@ -1,3 +1,16 @@
|
||||
2013-08-14 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
||||
|
||||
PR target/57949
|
||||
* doc/invoke.texi: Add documentation of mcompat-align-parm
|
||||
option.
|
||||
* config/rs6000/rs6000.opt: Add mcompat-align-parm option.
|
||||
* config/rs6000/rs6000.c (rs6000_function_arg_boundary): For AIX
|
||||
and Linux, correct BLKmode alignment when 128-bit alignment is
|
||||
required and compatibility flag is not set.
|
||||
(rs6000_gimplify_va_arg): For AIX and Linux, honor specified
|
||||
alignment for zero-size arguments when compatibility flag is not
|
||||
set.
|
||||
|
||||
2013-08-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/58145
|
||||
|
@ -8339,8 +8339,8 @@ rs6000_function_arg_boundary (enum machine_mode mode, const_tree type)
|
||||
|| (type && TREE_CODE (type) == VECTOR_TYPE
|
||||
&& int_size_in_bytes (type) >= 16))
|
||||
return 128;
|
||||
else if (TARGET_MACHO
|
||||
&& rs6000_darwin64_abi
|
||||
else if (((TARGET_MACHO && rs6000_darwin64_abi)
|
||||
|| (DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm))
|
||||
&& mode == BLKmode
|
||||
&& type && TYPE_ALIGN (type) > 64)
|
||||
return 128;
|
||||
@ -9888,8 +9888,9 @@ rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
|
||||
We don't need to check for pass-by-reference because of the test above.
|
||||
We can return a simplifed answer, since we know there's no offset to add. */
|
||||
|
||||
if (TARGET_MACHO
|
||||
&& rs6000_darwin64_abi
|
||||
if (((TARGET_MACHO
|
||||
&& rs6000_darwin64_abi)
|
||||
|| (DEFAULT_ABI == ABI_AIX && !rs6000_compat_align_parm))
|
||||
&& integer_zerop (TYPE_SIZE (type)))
|
||||
{
|
||||
unsigned HOST_WIDE_INT align, boundary;
|
||||
|
@ -546,3 +546,7 @@ Use ISA 2.07 transactional memory (HTM) instructions
|
||||
mquad-memory
|
||||
Target Report Mask(QUAD_MEMORY) Var(rs6000_isa_flags)
|
||||
Generate the quad word memory instructions (lq/stq/lqarx/stqcx).
|
||||
|
||||
mcompat-align-parm
|
||||
Target Report Var(rs6000_compat_align_parm) Init(0) Save
|
||||
Generate aggregate parameter passing code with at most 64-bit alignment.
|
||||
|
@ -871,7 +871,8 @@ See RS/6000 and PowerPC Options.
|
||||
-msave-toc-indirect -mno-save-toc-indirect @gol
|
||||
-mpower8-fusion -mno-mpower8-fusion -mpower8-vector -mno-power8-vector @gol
|
||||
-mcrypto -mno-crypto -mdirect-move -mno-direct-move @gol
|
||||
-mquad-memory -mno-quad-memory}
|
||||
-mquad-memory -mno-quad-memory @gol
|
||||
-mcompat-align-parm -mno-compat-align-parm}
|
||||
|
||||
@emph{RX Options}
|
||||
@gccoptlist{-m64bit-doubles -m32bit-doubles -fpu -nofpu@gol
|
||||
@ -18417,6 +18418,22 @@ stack location in the function prologue if the function calls through
|
||||
a pointer on AIX and 64-bit Linux systems. If the TOC value is not
|
||||
saved in the prologue, it is saved just before the call through the
|
||||
pointer. The @option{-mno-save-toc-indirect} option is the default.
|
||||
|
||||
@item -mcompat-align-parm
|
||||
@itemx -mno-compat-align-parm
|
||||
@opindex mcompat-align-parm
|
||||
Generate (do not generate) code to pass structure parameters with a
|
||||
maximum alignment of 64 bits, for compatibility with older versions
|
||||
of GCC.
|
||||
|
||||
Older versions of GCC (prior to 4.9.0) incorrectly did not align a
|
||||
structure parameter on a 128-bit boundary when that structure contained
|
||||
a member requiring 128-bit alignment. This is corrected in more
|
||||
recent versions of GCC. This option may be used to generate code
|
||||
that is compatible with functions compiled with older versions of
|
||||
GCC.
|
||||
|
||||
The @option{-mno-compat-align-parm} option is the default.
|
||||
@end table
|
||||
|
||||
@node RX Options
|
||||
|
@ -1,3 +1,9 @@
|
||||
2013-08-14 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
||||
|
||||
PR target/57949
|
||||
* gcc.target/powerpc/pr57949-1.c: New.
|
||||
* gcc.target/powerpc/pr57949-2.c: New.
|
||||
|
||||
2013-08-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/58145
|
||||
|
19
gcc/testsuite/gcc.target/powerpc/pr57949-1.c
Normal file
19
gcc/testsuite/gcc.target/powerpc/pr57949-1.c
Normal file
@ -0,0 +1,19 @@
|
||||
/* { dg-do compile { target { powerpc64*-*-* && lp64 } } } */
|
||||
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
|
||||
/* { dg-options "-O2 -mcpu=power7" } */
|
||||
|
||||
/* Verify that vs is 16-byte aligned in the absence of -mcompat-align-parm. */
|
||||
|
||||
typedef float v4sf __attribute__ ((vector_size (16)));
|
||||
struct s { long m; v4sf v; };
|
||||
long n;
|
||||
v4sf ve;
|
||||
|
||||
void pr57949 (long d1, long d2, long d3, long d4, long d5, long d6,
|
||||
long d7, long d8, long d9, struct s vs) {
|
||||
n = vs.m;
|
||||
ve = vs.v;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler "li \.\*,144" } } */
|
||||
/* { dg-final { scan-assembler "ld \.\*,128\\(1\\)" } } */
|
19
gcc/testsuite/gcc.target/powerpc/pr57949-2.c
Normal file
19
gcc/testsuite/gcc.target/powerpc/pr57949-2.c
Normal file
@ -0,0 +1,19 @@
|
||||
/* { dg-do compile { target { powerpc64*-*-* && lp64 } } } */
|
||||
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
|
||||
/* { dg-options "-O2 -mcpu=power7 -mcompat-align-parm" } */
|
||||
|
||||
/* Verify that vs is not 16-byte aligned with -mcompat-align-parm. */
|
||||
|
||||
typedef float v4sf __attribute__ ((vector_size (16)));
|
||||
struct s { long m; v4sf v; };
|
||||
long n;
|
||||
v4sf ve;
|
||||
|
||||
void pr57949 (long d1, long d2, long d3, long d4, long d5, long d6,
|
||||
long d7, long d8, long d9, struct s vs) {
|
||||
n = vs.m;
|
||||
ve = vs.v;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler "ld .\*,136\\(1\\)" } } */
|
||||
/* { dg-final { scan-assembler "ld .\*,120\\(1\\)" } } */
|
Loading…
x
Reference in New Issue
Block a user