kamlesh kumar via llvm-dev
2019-Oct-17 03:57 UTC
[llvm-dev] Static assert fails when compiler for i386
Hi Devs, Consider below testcase. $cat test.cpp #include <vector> #include<type_traits> typedef int _int4 __attribute__((vector_size(16))); typedef union{ int data[4]; struct {int x, y, z, w;}; _int4 vec; } int4; typedef int4 int3; int main() { static_assert(std::alignment_of<int4>::value <= alignof(max_align_t), "over aligned!"); } $clang++ -m32 error: static_assert failed due to requirement 'std::alignment_of<int4>::value <= alignof(max_align_t)' "over aligned it goes smooth when compile for x86_64. Following changes fixes this. diff --git a/clang/lib/Headers/__stddef_max_align_t.h b/clang/lib/Headers/__stddef_max_align_t.h index e3b439285d0..46f705a09c3 100644 --- a/clang/lib/Headers/__stddef_max_align_t.h +++ b/clang/lib/Headers/__stddef_max_align_t.h @@ -21,6 +21,10 @@ typedef struct { __attribute__((__aligned__(__alignof__(long long)))); long double __clang_max_align_nonce2 __attribute__((__aligned__(__alignof__(long double)))); + #ifdef __i386__ + typedef double xx __attribute__((vector_size(16))); + xx __clang_max_align_nonce3 __attribute__((__aligned__(__alignof__(xx)))); + #endif } max_align_t; #endif Like to know community thought on this? -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191017/8c456137/attachment.html>
Rui Ueyama via llvm-dev
2019-Oct-17 04:55 UTC
[llvm-dev] Static assert fails when compiler for i386
max_align_t is a type whose alignment requirement is as large as any *scalar* type, but your int4 is not a scalar type but a union containing a vector _int4, so it looks like your assertion is simply incorrect. On Thu, Oct 17, 2019 at 12:58 PM kamlesh kumar via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Hi Devs, > Consider below testcase. > $cat test.cpp > #include <vector> > #include<type_traits> > typedef int _int4 __attribute__((vector_size(16))); > typedef union{ > int data[4]; > struct {int x, y, z, w;}; > _int4 vec; > } int4; > typedef int4 int3; > int main() > { > static_assert(std::alignment_of<int4>::value <= alignof(max_align_t), "over > aligned!"); > } > > $clang++ -m32 > error: static_assert failed due to requirement > 'std::alignment_of<int4>::value <= alignof(max_align_t)' "over aligned > it goes smooth when compile for x86_64. > Following changes fixes this. > > diff --git a/clang/lib/Headers/__stddef_max_align_t.h > b/clang/lib/Headers/__stddef_max_align_t.h > index e3b439285d0..46f705a09c3 100644 > --- a/clang/lib/Headers/__stddef_max_align_t.h > +++ b/clang/lib/Headers/__stddef_max_align_t.h > @@ -21,6 +21,10 @@ typedef struct { > __attribute__((__aligned__(__alignof__(long long)))); > long double __clang_max_align_nonce2 > __attribute__((__aligned__(__alignof__(long double)))); > + #ifdef __i386__ > + typedef double xx __attribute__((vector_size(16))); > + xx __clang_max_align_nonce3 > __attribute__((__aligned__(__alignof__(xx)))); > + #endif > } max_align_t; > #endif > > Like to know community thought on this? > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191017/98303f18/attachment.html>
kamlesh kumar via llvm-dev
2019-Oct-17 05:33 UTC
[llvm-dev] Static assert fails when compiler for i386
Thank you, Rui for clarification. On Thu, Oct 17, 2019 at 10:25 AM Rui Ueyama <ruiu at google.com> wrote:> max_align_t is a type whose alignment requirement is as large as any > *scalar* type, but your int4 is not a scalar type but a union containing > a vector _int4, so it looks like your assertion is simply incorrect. > > On Thu, Oct 17, 2019 at 12:58 PM kamlesh kumar via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> Hi Devs, >> Consider below testcase. >> $cat test.cpp >> #include <vector> >> #include<type_traits> >> typedef int _int4 __attribute__((vector_size(16))); >> typedef union{ >> int data[4]; >> struct {int x, y, z, w;}; >> _int4 vec; >> } int4; >> typedef int4 int3; >> int main() >> { >> static_assert(std::alignment_of<int4>::value <= alignof(max_align_t), "over >> aligned!"); >> } >> >> $clang++ -m32 >> error: static_assert failed due to requirement >> 'std::alignment_of<int4>::value <= alignof(max_align_t)' "over aligned >> it goes smooth when compile for x86_64. >> Following changes fixes this. >> >> diff --git a/clang/lib/Headers/__stddef_max_align_t.h >> b/clang/lib/Headers/__stddef_max_align_t.h >> index e3b439285d0..46f705a09c3 100644 >> --- a/clang/lib/Headers/__stddef_max_align_t.h >> +++ b/clang/lib/Headers/__stddef_max_align_t.h >> @@ -21,6 +21,10 @@ typedef struct { >> __attribute__((__aligned__(__alignof__(long long)))); >> long double __clang_max_align_nonce2 >> __attribute__((__aligned__(__alignof__(long double)))); >> + #ifdef __i386__ >> + typedef double xx __attribute__((vector_size(16))); >> + xx __clang_max_align_nonce3 >> __attribute__((__aligned__(__alignof__(xx)))); >> + #endif >> } max_align_t; >> #endif >> >> Like to know community thought on this? >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191017/4384b534/attachment.html>