+2014-12-17 H.J. Lu <hongjiu.lu@intel.com>
+ Jakub Jelinek <jakub@redhat.com>
+ Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/61296
+ * config/i386/i386-opts.h (ix86_align_data): New enum.
+ * config/i386/i386.c (ix86_data_alignment): Return the ABI
+ alignment value for -malign-data=abi, the cachine line size
+ for -malign-data=cachineline and the older GCC compatible
+ alignment value for for -malign-data=compat.
+ * config/i386/i386.opt (malign-data=): New.
+ * doc/invoke.texi: Document -malign-data=.
+
2014-12-17 Marek Polacek <polacek@redhat.com>
PR middle-end/63568
PMODE_DI /* Pmode == DImode. */
};
+enum ix86_align_data {
+ ix86_align_data_type_compat,
+ ix86_align_data_type_abi,
+ ix86_align_data_type_cacheline
+};
+
enum asm_dialect {
ASM_ATT,
ASM_INTEL
those compilers, ensure we don't decrease alignment from what we
used to assume. */
- int max_align_compat
- = optimize_size ? BITS_PER_WORD : MIN (256, MAX_OFILE_ALIGNMENT);
+ int max_align_compat = MIN (256, MAX_OFILE_ALIGNMENT);
/* A data structure, equal or greater than the size of a cache line
(64 bytes in the Pentium 4 and other recent Intel processors, including
if (max_align < BITS_PER_WORD)
max_align = BITS_PER_WORD;
+ switch (ix86_align_data_type)
+ {
+ case ix86_align_data_type_abi: opt = false; break;
+ case ix86_align_data_type_compat: max_align = BITS_PER_WORD; break;
+ case ix86_align_data_type_cacheline: break;
+ }
+
if (opt
&& AGGREGATE_TYPE_P (type)
&& TYPE_SIZE (type)
Target RejectNegative Report InverseMask(NO_ALIGN_STRINGOPS, ALIGN_STRINGOPS) Save
Align destination of the string operations
+malign-data=
+Target RejectNegative Joined Var(ix86_align_data_type) Enum(ix86_align_data) Init(ix86_align_data_type_compat)
+Use the given data alignment
+
+Enum
+Name(ix86_align_data) Type(enum ix86_align_data)
+Known data alignment choices (for use with the -malign-data= option):
+
+EnumValue
+Enum(ix86_align_data) String(compat) Value(ix86_align_data_type_compat)
+
+EnumValue
+Enum(ix86_align_data) String(abi) Value(ix86_align_data_type_abi)
+
+EnumValue
+Enum(ix86_align_data) String(cacheline) Value(ix86_align_data_type_cacheline)
+
march=
Target RejectNegative Joined Var(ix86_arch_string)
Generate code for given CPU
-m32 -m64 -mx32 -m16 -mlarge-data-threshold=@var{num} @gol
-msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv @gol
-mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol
--mstack-protector-guard=@var{guard}}
+-malign-data=@var{type} -mstack-protector-guard=@var{guard}}
@emph{i386 and x86-64 Windows Options}
@gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
@code{long double}. Hence they are not binary-compatible
with code compiled without that switch.
+@item -malign-data=@var{type}
+@opindex malign-data
+Control how GCC aligns variables. Supported values for @var{type} are
+@samp{compat} uses increased alignment value compatible uses GCC 4.8
+and earlier, @samp{abi} uses alignment value as specified by the
+psABI, and @samp{cacheline} uses increased alignment value to match
+the cache line size. @samp{compat} is the default.
+
@item -mlarge-data-threshold=@var{threshold}
@opindex mlarge-data-threshold
When @option{-mcmodel=medium} is specified, data objects larger than
+2014-12-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/61296
+ * gcc.target/i386/pr61296-2.c: New.
+ * gcc.target/i386/pr61296-2.c: Likewise.
+ * gcc.target/i386/pr61296-3.c: Likewise.
+ * gcc.target/i386/pr61296-4.c: Likewise.
+ * gcc.target/i386/pr61296-5.c: Likewise.
+ * gcc.target/i386/pr61296-6.c: Likewise.
+ * gcc.target/i386/pr61296-7.c: Likewise.
+
2014-12-17 Tejas Belagod <tejas.belagod@arm.com>
PR testsuite/64328
--- /dev/null
+/* PR target/61296 */
+/* { dg-do compile { target { *-*-linux* } } } */
+/* { dg-options "-O2" } */
+
+struct foo
+{
+ char i1[8];
+ char i2[8];
+ char i3[8];
+ char i4[8];
+ char i5[8];
+ char i6[8];
+ char i7[8];
+ char i8[8];
+ char i9[8];
+ char i10[8];
+ char i11[8];
+ char i12[8];
+ char i13[8];
+ char i14[8];
+ char i15[8];
+ char i16[8];
+};
+
+struct foo x = { 1 };
+
+/* { dg-final { scan-assembler ".align\[ \t]*32\[^:]*\[\n\r]x:" } } */
--- /dev/null
+/* PR target/61296 */
+/* { dg-do compile { target { *-*-linux* } } } */
+/* { dg-options "-O2 -malign-data=cacheline" } */
+
+struct foo
+{
+ char i1[8];
+ char i2[8];
+ char i3[8];
+ char i4[8];
+ char i5[8];
+ char i6[8];
+ char i7[8];
+ char i8[8];
+ char i9[8];
+ char i10[8];
+ char i11[8];
+ char i12[8];
+ char i13[8];
+ char i14[8];
+ char i15[8];
+ char i16[8];
+};
+
+struct foo x = { 1 };
+
+/* { dg-final { scan-assembler ".align\[ \t]*64\[^:]*\[\n\r]x:" } } */
--- /dev/null
+/* PR target/61296 */
+/* { dg-do compile { target { *-*-linux* } } } */
+/* { dg-options "-O2 -malign-data=abi" } */
+
+struct foo
+{
+ char i1[8];
+ char i2[8];
+ char i3[8];
+ char i4[8];
+ char i5[8];
+ char i6[8];
+ char i7[8];
+ char i8[8];
+ char i9[8];
+ char i10[8];
+ char i11[8];
+ char i12[8];
+ char i13[8];
+ char i14[8];
+ char i15[8];
+ char i16[8];
+};
+
+struct foo x = { 1 };
+
+/* { dg-final { scan-assembler-not ".align\[ \t]*\[0-9\]+\[^:]*\[\n\r]x:" } } */
--- /dev/null
+/* PR target/61296 */
+/* { dg-do compile { target { *-*-linux* } } } */
+/* { dg-options "-O2 -malign-data=cacheline -malign-data=abi" } */
+
+struct foo
+{
+ char i1[8];
+ char i2[8];
+ char i3[8];
+ char i4[8];
+ char i5[8];
+ char i6[8];
+ char i7[8];
+ char i8[8];
+ char i9[8];
+ char i10[8];
+ char i11[8];
+ char i12[8];
+ char i13[8];
+ char i14[8];
+ char i15[8];
+ char i16[8];
+};
+
+struct foo x = { 1 };
+
+/* { dg-final { scan-assembler-not ".align\[ \t]*\[0-9\]+\[^:]*\[\n\r]x:" } } */
--- /dev/null
+/* PR target/61296 */
+/* { dg-do compile { target { *-*-linux* } } } */
+/* { dg-options "-O2 -malign-data=abi -malign-data=cacheline" } */
+
+struct foo
+{
+ char i1[8];
+ char i2[8];
+ char i3[8];
+ char i4[8];
+ char i5[8];
+ char i6[8];
+ char i7[8];
+ char i8[8];
+ char i9[8];
+ char i10[8];
+ char i11[8];
+ char i12[8];
+ char i13[8];
+ char i14[8];
+ char i15[8];
+ char i16[8];
+};
+
+struct foo x = { 1 };
+
+/* { dg-final { scan-assembler ".align\[ \t]*64\[^:]*\[\n\r]x:" } } */
--- /dev/null
+/* PR target/61296 */
+/* { dg-do compile { target { *-*-linux* } } } */
+/* { dg-options "-O2 -malign-data=cacheline -malign-data=compat" } */
+
+struct foo
+{
+ char i1[8];
+ char i2[8];
+ char i3[8];
+ char i4[8];
+ char i5[8];
+ char i6[8];
+ char i7[8];
+ char i8[8];
+ char i9[8];
+ char i10[8];
+ char i11[8];
+ char i12[8];
+ char i13[8];
+ char i14[8];
+ char i15[8];
+ char i16[8];
+};
+
+struct foo x = { 1 };
+
+/* { dg-final { scan-assembler ".align\[ \t]*32\[^:]*\[\n\r]x:" } } */
--- /dev/null
+/* PR target/61296 */
+/* { dg-do compile { target { *-*-linux* } } } */
+/* { dg-options "-O2 -malign-data=compat -malign-data=abi" } */
+
+struct foo
+{
+ char i1[8];
+ char i2[8];
+ char i3[8];
+ char i4[8];
+ char i5[8];
+ char i6[8];
+ char i7[8];
+ char i8[8];
+ char i9[8];
+ char i10[8];
+ char i11[8];
+ char i12[8];
+ char i13[8];
+ char i14[8];
+ char i15[8];
+ char i16[8];
+};
+
+struct foo x = { 1 };
+
+/* { dg-final { scan-assembler-not ".align\[ \t]*\[0-9\]+\[^:]*\[\n\r]x:" } } */