aix: align double complex
AIX word-aligns floating point doubles. This behavior also extends to double _Complex, which had been overlooked when compiler support for double _Complex was added. This patch adds DCmode to the modes whose alignment is adjusted and adds a testcase to confirm the correct alignment. gcc/ChangeLog: 2021-03-10 David Edelsohn <dje.gcc@gmail.com> PR target/99492 * config/rs6000/aix.h (ADJUST_FIELD_ALIGN): Add check for DCmode. * config/rs6000/rs6000.c (rs6000_special_round_type_align): Same. gcc/testsuite/ChangeLog: 2021-03-10 David Edelsohn <dje.gcc@gmail.com> PR target/99492 * gcc.target/powerpc/pr99492.c: New testcase.
This commit is contained in:
parent
8c21bc6646
commit
4fa6356be1
3 changed files with 54 additions and 2 deletions
|
@ -224,7 +224,8 @@
|
|||
/* AIX word-aligns FP doubles but doubleword-aligns 64-bit ints. */
|
||||
#define ADJUST_FIELD_ALIGN(FIELD, TYPE, COMPUTED) \
|
||||
((TARGET_ALIGN_NATURAL == 0 \
|
||||
&& TYPE_MODE (strip_array_types (TYPE)) == DFmode) \
|
||||
&& (TYPE_MODE (strip_array_types (TYPE)) == DFmode \
|
||||
|| TYPE_MODE (strip_array_types (TYPE)) == DCmode)) \
|
||||
? MIN ((COMPUTED), 32) \
|
||||
: (COMPUTED))
|
||||
|
||||
|
|
|
@ -7855,7 +7855,8 @@ rs6000_special_round_type_align (tree type, unsigned int computed,
|
|||
while (TREE_CODE (type) == ARRAY_TYPE)
|
||||
type = TREE_TYPE (type);
|
||||
|
||||
if (type != error_mark_node && TYPE_MODE (type) == DFmode)
|
||||
if (type != error_mark_node
|
||||
&& (TYPE_MODE (type) == DFmode || TYPE_MODE (type) == DCmode))
|
||||
align = MAX (align, 64);
|
||||
}
|
||||
|
||||
|
|
50
gcc/testsuite/gcc.target/powerpc/pr99492.c
Normal file
50
gcc/testsuite/gcc.target/powerpc/pr99492.c
Normal file
|
@ -0,0 +1,50 @@
|
|||
/* { dg-do run { target { powerpc*-ibm-aix* } } } */
|
||||
/* { dg-options "" } */
|
||||
|
||||
void abort (void);
|
||||
|
||||
struct A {
|
||||
double _Complex a[64];
|
||||
};
|
||||
|
||||
struct B {
|
||||
double b[64];
|
||||
};
|
||||
|
||||
struct C {
|
||||
char c1;
|
||||
double _Complex c2;
|
||||
};
|
||||
|
||||
struct D {
|
||||
char c1;
|
||||
double c2;
|
||||
};
|
||||
|
||||
int main() {
|
||||
if (__alignof(double _Complex) != 8)
|
||||
abort();
|
||||
|
||||
if (__alignof(struct A) != 8)
|
||||
abort;
|
||||
|
||||
if (__alignof(struct C) != 4)
|
||||
abort;
|
||||
|
||||
if (__builtin_offsetof(struct C, c2) != 4)
|
||||
abort();
|
||||
|
||||
if (__alignof(double) != 8)
|
||||
abort();
|
||||
|
||||
if (__alignof(struct B) != 8)
|
||||
abort();
|
||||
|
||||
if (__alignof(struct D) != 4)
|
||||
abort();
|
||||
|
||||
if (__builtin_offsetof(struct D, c2) != 4)
|
||||
abort();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue