On Sat, Jul 4, 2020 at 9:11 AM Richard Biener
<richard.guent...@gmail.com> wrote:
>
> On July 3, 2020 11:16:46 PM GMT+02:00, Jason Merrill <ja...@redhat.com> wrote:
> >On 6/29/20 5:00 AM, Richard Biener wrote:
> >> On Fri, Jun 26, 2020 at 10:11 PM H.J. Lu <hjl.to...@gmail.com> wrote:
> >>>
> >>> On Thu, Jun 25, 2020 at 1:10 AM Richard Biener
> >>> <richard.guent...@gmail.com> wrote:
> >>>>
> >>>> On Thu, Jun 25, 2020 at 2:53 AM Sunil Pandey <skpg...@gmail.com>
> >wrote:
> >>>>>
> >>>>> On Wed, Jun 24, 2020 at 12:30 AM Richard Biener
> >>>>> <richard.guent...@gmail.com> wrote:
> >>>>>>
> >>>>>> On Tue, Jun 23, 2020 at 5:31 PM Sunil K Pandey via Gcc-patches
> >>>>>> <gcc-patches@gcc.gnu.org> wrote:
> >>>>>>>
> >>>>>>> From: Sunil K Pandey <skpg...@gmail.com>
> >>>>>>>
> >>>>>>> Default for this hook is NOP. For x86, in 32 bit mode, this hook
> >>>>>>> sets alignment of long long on stack to 32 bits if preferred
> >stack
> >>>>>>> boundary is 32 bits.
> >>>>>>>
> >>>>>>>   - This patch fixes
> >>>>>>>          gcc.target/i386/pr69454-2.c
> >>>>>>>          gcc.target/i386/stackalign/longlong-1.c
> >>>>>>>   - Regression test on x86-64, no new fail introduced.
> >>>>>>
> >>>>>> I think the name is badly chosen,
> >TARGET_LOWER_LOCAL_DECL_ALIGNMENT
> >>>>>
> >>>>> Yes, I can change the target hook name.
> >>>>>
> >>>>>> would be better suited (and then asks for LOCAL_DECL_ALIGNMENT to
> >be
> >>>>>> renamed to INCREASE_LOCAL_DECL_ALIGNMENT).
> >>>>>
> >>>>> It seems like LOCAL_DECL_ALIGNMENT macro documentation is
> >incorrect.
> >>>>> It increases as well as decreases alignment based on
> >condition(-m32
> >>>>> -mpreferred-stack-boundary=2)
> >>>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95885
> >>>>>
> >>>>>>
> >>>>>> You're calling it from do_type_align which IMHO is dangerous
> >since that's
> >>>>>> invoked from FIELD_DECL layout as well.  Instead invoke it from
> >>>>>> layout_decl itself where we do
> >>>>>>
> >>>>>>    if (code != FIELD_DECL)
> >>>>>>      /* For non-fields, update the alignment from the type.  */
> >>>>>>      do_type_align (type, decl);
> >>>>>>
> >>>>>> and invoke the hook _after_ do_type_align.  Also avoid
> >>>>>> invoking the hook on globals or hard regs and only
> >>>>>> invoke it on VAR_DECLs, thus only
> >>>>>>
> >>>>>>    if (VAR_P (decl) && !is_global_var (decl) &&
> >!DECL_HARD_REGISTER (decl))
> >>>>>
> >>>>> It seems like decl property is not fully populated at this point
> >call
> >>>>> to is_global_var (decl) on global variable return false.
> >>>>>
> >>>>> $ cat foo.c
> >>>>> long long x;
> >>>>> int main()
> >>>>> {
> >>>>> if (__alignof__(x) != 8)
> >>>>>    __builtin_abort();
> >>>>> return 0;
> >>>>> }
> >>>>>
> >>>>> Breakpoint 1, layout_decl (decl=0x7ffff7ffbb40, known_align=0)
> >>>>>      at /local/skpandey/gccwork/gccwork/gcc/gcc/stor-layout.c:674
> >>>>> 674     do_type_align (type, decl);
> >>>>> Missing separate debuginfos, use: dnf debuginfo-install
> >>>>> gmp-6.1.2-10.fc31.x86_64 isl-0.16.1-9.fc31.x86_64
> >>>>> libmpc-1.1.0-4.fc31.x86_64 mpfr-3.1.6-5.fc31.x86_64
> >>>>> zlib-1.2.11-20.fc31.x86_64
> >>>>> (gdb) call debug_tree(decl)
> >>>>>   <var_decl 0x7ffff7ffbb40 x
> >>>>>      type <integer_type 0x7fffea801888 long long int DI
> >>>>>          size <integer_cst 0x7fffea7e8d38 constant 64>
> >>>>>          unit-size <integer_cst 0x7fffea7e8d50 constant 8>
> >>>>>          align:64 warn_if_not_align:0 symtab:0 alias-set -1
> >>>>> canonical-type 0x7fffea801888 precision:64 min <integer_cst
> >>>>> 0x7fffea7e8fd8 -9223372036854775808> max <integer_cst
> >0x7fffea806000
> >>>>> 9223372036854775807>
> >>>>>          pointer_to_this <pointer_type 0x7fffea8110a8>>
> >>>>>      DI foo.c:1:11 size <integer_cst 0x7fffea7e8d38 64> unit-size
> >>>>> <integer_cst 0x7fffea7e8d50 8>
> >>>>>      align:1 warn_if_not_align:0>
> >>>>>
> >>>>> (gdb) p is_global_var(decl)
> >>>>> $1 = false
> >>>>> (gdb)
> >>>>>
> >>>>>
> >>>>> What about calling hook here
> >>>>>
> >>>>>   603 do_type_align (tree type, tree decl)
> >>>>>   604 {
> >>>>>   605   if (TYPE_ALIGN (type) > DECL_ALIGN (decl))
> >>>>>   606     {
> >>>>>   607       SET_DECL_ALIGN (decl, TYPE_ALIGN (type));
> >>>>>   608       if (TREE_CODE (decl) == FIELD_DECL)
> >>>>>   609         DECL_USER_ALIGN (decl) = TYPE_USER_ALIGN (type);
> >>>>>   610       else
> >>>>>   611         /* Lower local decl alignment */
> >>>>>   612         if (VAR_P (decl)
> >>>>>   613             && !is_global_var (decl)
> >>>>>   614             && !DECL_HARD_REGISTER (decl)
> >>>>>   615             && cfun != NULL)
> >>>>>   616           targetm.lower_local_decl_alignment (decl);
> >>>>>   617     }
> >>>>
> >>>> But that doesn't change anything (obviously).  layout_decl
> >>>> is called quite early, too early it looks like.
> >>>>
> >>>> Now there doesn't seem to be any other good place where
> >>>> we are sure to catch the decl before we evaluate things
> >>>> like __alignof__
> >>>>
> >>>> void __attribute__((noipa))
> >>>> foo (__SIZE_TYPE__ align, long long *p)
> >>>> {
> >>>>    if ((__SIZE_TYPE__)p & (align-1))
> >>>>      __builtin_abort ();
> >>>> }
> >>>> int main()
> >>>> {
> >>>>    long long y;
> >>>>    foo (_Alignof y, &y);
> >>>>    return 0;
> >>>> }
> >>>>
> >>>> Joseph/Jason - do you have a good recommendation
> >>>> how to deal with targets where natural alignment
> >>>> is supposed to be lowered for optimization purposes?
> >>>> (this case is for i?86 to avoid dynamic stack re-alignment
> >>>> to align long long to 8 bytes with -mpreferred-stack-boundary=2)
> >>>>
> >>>> I note that for -mincoming-stack-boundary=2 we do perform
> >>>> dynamic stack re-alignment already.
> >>>>
> >>>> I can't find a suitable existing target macro/hook for this,
> >>>> but my gut feeling is that the default alignment should
> >>>> instead be the lower one and instead the alignment for
> >>>> globals should be raised as optimization?
> >>>>
> >>>
> >>> Here is the updated patch from Sunil.
> >>
> >> It does not address the fundamental issue that during
> >> do_type_align the is_global_var predicate is not
> >> reliable.  This means that for
> >>
> >> int main()
> >> {
> >>    extern long z;
> >> }
> >>
> >> the new hook (with -m32 -mpreferred-stack-boundary=2)
> >> will lower the alignment of 'z' which looks wrong.  During
> >> layout_decl we can unfortunately not distinguish between
> >> locals and globals.  We need to find another spot to adjust
> >> alignment of locals.  For C that might be in finish_decl,
> >> for C++ there's probably another suitable place.
> >
> >cp_finish_decl could work, but layout_decl seems like the right spot;
> >if
> >the problem is that the appropriate flags currently aren't being set in
> >
> >time, can't we fix that?
>
> The first and usually only call to layout_decl is from build_decl which gets 
> nothing more than the type... But yes, I also initially thought that's the 
> correct spot but it turns out it isn't.

I added a new function lower_decl_alignment and invoked from
cp_decl_finish/decl_finish. Attached is revised patch.
>
> >> Note it needs to be a place before the frontends possibly
> >> inspect the alignment of the decl
> >> In C++ constexpr evalualtion might also expose alignment
> >> "early" so we really need a frontend solution here.
> >
> >Yes, we need to know the alignment right after the declaration.
> >
> >Jason
>
From 95c521f974ee90c47a236164e0f030347936bc2e Mon Sep 17 00:00:00 2001
From: Sunil K Pandey <skpg...@gmail.com>
Date: Thu, 18 Jun 2020 08:40:45 -0700
Subject: [PATCH] Add TARGET_LOWER_LOCAL_DECL_ALIGNMENT [PR95237]

Default for this hook is NOP. For x86, in 32 bit mode, this hook
sets alignment of long long on stack to 32 bits if preferred stack
boundary is 32 bits.

 - This patch fixes
        gcc.target/i386/pr69454-2.c
        gcc.target/i386/stackalign/longlong-1.c
 - Regression test on x86-64, no new fail introduced.

Tested on x86-64.

gcc/c/ChangeLog:

        * c-decl.c (finish_decl): Call lower_decl_alignment to
        lower local decl alignment.

gcc/ChangeLog:

        * config/i386/i386.c (ix86_lower_local_decl_alignment): New
        function.
        (TARGET_LOWER_LOCAL_DECL_ALIGNMENT): Define.
        * doc/tm.texi: Regenerate.
        * doc/tm.texi.in: TARGET_LOWER_LOCAL_DECL_ALIGNMENT): New
        hook.
        * stor-layout.c (lower_decl_alignment): New function.
        * stor-layout.h (lower_decl_alignment): Declare.
        * target.def (lower_local_decl_alignment): New hook.

gcc/cp/ChangeLog:

        * decl.c (cp_finish_decl): Call lower_decl_alignment to
        lower local decl alignment.

gcc/testsuite/ChangeLog:

        * c-c++-common/pr95237-1.c: New test.
        * c-c++-common/pr95237-2.c: New test.
        * c-c++-common/pr95237-3.c: New test.
        * c-c++-common/pr95237-4.c: New test.
        * c-c++-common/pr95237-5.c: New test.
        * c-c++-common/pr95237-6.c: New test.
        * c-c++-common/pr95237-7.c: New test.
        * c-c++-common/pr95237-8.c: New test.
        * c-c++-common/pr95237-9.c: New test.
---
 gcc/c/c-decl.c                         |  2 ++
 gcc/config/i386/i386.c                 | 13 +++++++++++++
 gcc/cp/decl.c                          |  2 ++
 gcc/doc/tm.texi                        |  5 +++++
 gcc/doc/tm.texi.in                     |  2 ++
 gcc/stor-layout.c                      | 11 +++++++++++
 gcc/stor-layout.h                      |  1 +
 gcc/target.def                         |  7 +++++++
 gcc/testsuite/c-c++-common/pr95237-1.c | 16 ++++++++++++++++
 gcc/testsuite/c-c++-common/pr95237-2.c | 10 ++++++++++
 gcc/testsuite/c-c++-common/pr95237-3.c | 10 ++++++++++
 gcc/testsuite/c-c++-common/pr95237-4.c | 10 ++++++++++
 gcc/testsuite/c-c++-common/pr95237-5.c | 16 ++++++++++++++++
 gcc/testsuite/c-c++-common/pr95237-6.c | 24 ++++++++++++++++++++++++
 gcc/testsuite/c-c++-common/pr95237-7.c | 19 +++++++++++++++++++
 gcc/testsuite/c-c++-common/pr95237-8.c | 10 ++++++++++
 gcc/testsuite/c-c++-common/pr95237-9.c | 10 ++++++++++
 17 files changed, 168 insertions(+)
 create mode 100644 gcc/testsuite/c-c++-common/pr95237-1.c
 create mode 100644 gcc/testsuite/c-c++-common/pr95237-2.c
 create mode 100644 gcc/testsuite/c-c++-common/pr95237-3.c
 create mode 100644 gcc/testsuite/c-c++-common/pr95237-4.c
 create mode 100644 gcc/testsuite/c-c++-common/pr95237-5.c
 create mode 100644 gcc/testsuite/c-c++-common/pr95237-6.c
 create mode 100644 gcc/testsuite/c-c++-common/pr95237-7.c
 create mode 100644 gcc/testsuite/c-c++-common/pr95237-8.c
 create mode 100644 gcc/testsuite/c-c++-common/pr95237-9.c

diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index 81bd2ee94f0..1ae99e30ed1 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -5601,6 +5601,8 @@ finish_decl (tree decl, location_t init_loc, tree init,
     }
 
   invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
+  /* Lower local decl alignment.  */
+  lower_decl_alignment (decl);
 }
 
 /* Given a parsed parameter declaration, decode it into a PARM_DECL.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 5c373c091ce..25706654b3e 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -16919,6 +16919,16 @@ ix86_minimum_alignment (tree exp, machine_mode mode,
 
   return align;
 }
+
+/* Implement TARGET_LOWER_LOCAL_DECL_ALIGNMENT.  */
+
+static void
+ix86_lower_local_decl_alignment (tree decl)
+{
+  unsigned new_align = LOCAL_DECL_ALIGNMENT (decl);
+  if (new_align < DECL_ALIGN (decl))
+    SET_DECL_ALIGN (decl, new_align);
+}
 
 /* Find a location for the static chain incoming to a nested function.
    This is a register, unless all free registers are used by arguments.  */
@@ -23521,6 +23531,9 @@ ix86_run_selftests (void)
 #undef TARGET_CAN_CHANGE_MODE_CLASS
 #define TARGET_CAN_CHANGE_MODE_CLASS ix86_can_change_mode_class
 
+#undef TARGET_LOWER_LOCAL_DECL_ALIGNMENT
+#define TARGET_LOWER_LOCAL_DECL_ALIGNMENT ix86_lower_local_decl_alignment
+
 #undef TARGET_STATIC_RTX_ALIGNMENT
 #define TARGET_STATIC_RTX_ALIGNMENT ix86_static_rtx_alignment
 #undef TARGET_CONSTANT_ALIGNMENT
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 60a09e9497a..184ceacf1db 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -8008,6 +8008,8 @@ cp_finish_decl (tree decl, tree init, bool 
init_const_expr_p,
     }
 
   invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
+  /* Lower local decl alignment.  */
+  lower_decl_alignment (decl);
 }
 
 /* For class TYPE return itself or some its bases that contain
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 6e7d9dc54a9..91867280b42 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -1086,6 +1086,11 @@ On 32-bit ELF the largest supported section alignment in 
bits is
 @samp{(0x80000000 * 8)}, but this is not representable on 32-bit hosts.
 @end defmac
 
+@deftypefn {Target Hook} void TARGET_LOWER_LOCAL_DECL_ALIGNMENT (tree 
@var{decl})
+Define this hook to lower alignment of local decl
+@samp{(@var{decl}}.
+@end deftypefn
+
 @deftypefn {Target Hook} HOST_WIDE_INT TARGET_STATIC_RTX_ALIGNMENT 
(machine_mode @var{mode})
 This hook returns the preferred alignment in bits for a
 statically-allocated rtx, such as a constant pool entry.  @var{mode}
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 3be984bbd5c..d76c85d5800 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -1036,6 +1036,8 @@ On 32-bit ELF the largest supported section alignment in 
bits is
 @samp{(0x80000000 * 8)}, but this is not representable on 32-bit hosts.
 @end defmac
 
+@hook TARGET_LOWER_LOCAL_DECL_ALIGNMENT
+
 @hook TARGET_STATIC_RTX_ALIGNMENT
 
 @defmac DATA_ALIGNMENT (@var{type}, @var{basic-align})
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index bde6fa22b58..d41aadc4877 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -1137,6 +1137,17 @@ update_alignment_for_field (record_layout_info rli, tree 
field,
   return desired_align;
 }
 
+/* Lower DECL alignment.  */
+
+void
+lower_decl_alignment (tree decl)
+{
+  if (VAR_P (decl)
+      && !is_global_var (decl)
+      && !DECL_HARD_REGISTER (decl))
+    targetm.lower_local_decl_alignment (decl);
+}
+
 /* Issue a warning if the record alignment, RECORD_ALIGN, is less than
    the field alignment of FIELD or FIELD isn't aligned. */
 
diff --git a/gcc/stor-layout.h b/gcc/stor-layout.h
index 48c89992f53..4650afa19ce 100644
--- a/gcc/stor-layout.h
+++ b/gcc/stor-layout.h
@@ -24,6 +24,7 @@ extern void set_min_and_max_values_for_integral_type (tree, 
int, signop);
 extern void fixup_signed_type (tree);
 extern unsigned int update_alignment_for_field (record_layout_info, tree,
                                                 unsigned int);
+extern void lower_decl_alignment (tree);
 extern record_layout_info start_record_layout (tree);
 extern tree bit_from_pos (tree, tree);
 extern tree byte_from_pos (tree, tree);
diff --git a/gcc/target.def b/gcc/target.def
index 07059a87caf..6efaee62c19 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -3348,6 +3348,13 @@ HOOK_VECTOR_END (addr_space)
 #undef HOOK_PREFIX
 #define HOOK_PREFIX "TARGET_"
 
+DEFHOOK
+(lower_local_decl_alignment,
+ "Define this hook to lower alignment of local decl\n\
+@samp{(@var{decl}}.",
+ void, (tree decl),
+ hook_void_tree)
+
 DEFHOOK
 (static_rtx_alignment,
  "This hook returns the preferred alignment in bits for a\n\
diff --git a/gcc/testsuite/c-c++-common/pr95237-1.c 
b/gcc/testsuite/c-c++-common/pr95237-1.c
new file mode 100644
index 00000000000..8947a9fed26
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr95237-1.c
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+/* { dg-require-effective-target ia32 } */
+/* { dg-options "-mpreferred-stack-boundary=2" { target { i?86-*-* x86_64-*-* 
} } } */
+typedef __UINTPTR_TYPE__ uintptr_t;
+void __attribute__((noipa)) foo (long long *p, uintptr_t a)
+{
+  if ((uintptr_t)p & (a-1))
+      __builtin_abort ();
+}
+int main()
+{
+       long long x;
+       uintptr_t a = __alignof__(x);
+       foo(&x, a);
+       return 0;
+}
diff --git a/gcc/testsuite/c-c++-common/pr95237-2.c 
b/gcc/testsuite/c-c++-common/pr95237-2.c
new file mode 100644
index 00000000000..87949a9e122
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr95237-2.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-require-effective-target ia32 } */
+/* { dg-options "-mpreferred-stack-boundary=2" { target { i?86-*-* x86_64-*-* 
} } } */
+long long x;
+int main()
+{
+       if (__alignof__(x) != 8)
+         __builtin_abort();
+       return 0;
+}
diff --git a/gcc/testsuite/c-c++-common/pr95237-3.c 
b/gcc/testsuite/c-c++-common/pr95237-3.c
new file mode 100644
index 00000000000..6941b6f154b
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr95237-3.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-require-effective-target ia32 } */
+/* { dg-options "-mpreferred-stack-boundary=2" { target { i?86-*-* x86_64-*-* 
} } } */
+int main()
+{
+       long long x;
+       if (__alignof__(x) != 4)
+         __builtin_abort();
+       return 0;
+}
diff --git a/gcc/testsuite/c-c++-common/pr95237-4.c 
b/gcc/testsuite/c-c++-common/pr95237-4.c
new file mode 100644
index 00000000000..deace53cc26
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr95237-4.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-require-effective-target ia32 } */
+/* { dg-options "-mpreferred-stack-boundary=4" { target { i?86-*-* x86_64-*-* 
} } } */
+int main()
+{
+       long long x;
+       if (__alignof__(x) != 8)
+         __builtin_abort();
+       return 0;
+}
diff --git a/gcc/testsuite/c-c++-common/pr95237-5.c 
b/gcc/testsuite/c-c++-common/pr95237-5.c
new file mode 100644
index 00000000000..9dc5cfcd739
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr95237-5.c
@@ -0,0 +1,16 @@
+/* { dg-do compile { target ia32 } } */
+/* { dg-options "-mpreferred-stack-boundary=2 -Os -w" { target { i?86-*-* 
x86_64-*-* } } } */
+
+int a;
+
+long long __attribute__((noinline))
+b (void)
+{
+}
+
+void
+c (void)
+{
+  if (b())
+    a = 1;
+}
diff --git a/gcc/testsuite/c-c++-common/pr95237-6.c 
b/gcc/testsuite/c-c++-common/pr95237-6.c
new file mode 100644
index 00000000000..ce1568fa282
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr95237-6.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-O2" { target { i?86-*-* x86_64-*-* } } } */
+#include <stddef.h>
+#ifdef  __x86_64__
+# define EXP_ALIGN 8
+#else
+# define EXP_ALIGN 4
+#endif
+
+struct test
+{
+  char a;
+  long long b;
+};
+struct test global_var;
+int main()
+{
+       struct test local_var;
+       if (__alignof__(global_var) != EXP_ALIGN
+           || __alignof__(local_var) != EXP_ALIGN
+           || offsetof(struct test, b) != EXP_ALIGN)
+         __builtin_abort();
+       return 0;
+}
diff --git a/gcc/testsuite/c-c++-common/pr95237-7.c 
b/gcc/testsuite/c-c++-common/pr95237-7.c
new file mode 100644
index 00000000000..8410009d00e
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr95237-7.c
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+/* { dg-require-effective-target ia32 } */
+/* { dg-options "-mpreferred-stack-boundary=2" { target { i?86-*-* x86_64-*-* 
} } } */
+#include <stddef.h>
+struct test
+{
+  char a;
+  long long b;
+};
+struct test global_var;
+int main()
+{
+       struct test local_var;
+       if (__alignof__(global_var) != 4
+           || __alignof__(local_var) != 4
+           || offsetof(struct test, b) != 4)
+         __builtin_abort();
+       return 0;
+}
diff --git a/gcc/testsuite/c-c++-common/pr95237-8.c 
b/gcc/testsuite/c-c++-common/pr95237-8.c
new file mode 100644
index 00000000000..8ba98abafc9
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr95237-8.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-require-effective-target ia32 } */
+/* { dg-options "-mpreferred-stack-boundary=2" { target { i?86-*-* x86_64-*-* 
} } } */
+int main()
+{
+       extern long long x;
+       if (__alignof__(x) != 8)
+         __builtin_abort();
+       return 0;
+}
diff --git a/gcc/testsuite/c-c++-common/pr95237-9.c 
b/gcc/testsuite/c-c++-common/pr95237-9.c
new file mode 100644
index 00000000000..687517cbc0a
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr95237-9.c
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-require-effective-target ia32 } */
+/* { dg-options "-mpreferred-stack-boundary=2" { target { i?86-*-* x86_64-*-* 
} } } */
+int main()
+{
+       static long long x;
+       if (__alignof__(x) != 8)
+         __builtin_abort();
+       return 0;
+}
-- 
2.25.4

Reply via email to