<div dir="ltr">We can merge all three patches to 5.0.</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Mon, Jul 31, 2017 at 9:59 AM, Hans Wennborg <span dir="ltr"><<a href="mailto:hans@chromium.org" target="_blank">hans@chromium.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Craig, Simon asked for this to be merged to 5.0 together with r309382<br>
and r309383 for PR33830. What do you think?<br>
<br>
On Sat, Jul 29, 2017 at 8:33 AM, Simon Pilgrim via cfe-commits<br>
<<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
> Author: rksimon<br>
> Date: Sat Jul 29 08:33:34 2017<br>
> New Revision: 309488<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=309488&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=309488&view=rev</a><br>
> Log:<br>
> [X86][AVX] Ensure vector non-temporal load/store intrinsics force pointer alignment (PR33830)<br>
><br>
> Clang specifies a max type alignment of 16 bytes on darwin targets (annoyingly in the driver not via cc1), meaning that the builtin nontemporal stores don't correctly align the loads/stores to 32 or 64 bytes when required, resulting in lowering to temporal unaligned loads/stores.<br>
><br>
> This patch casts the vectors to explicitly aligned types prior to the load/store to ensure that the require alignment is respected.<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D35996" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D35996</a><br>
><br>
> Modified:<br>
>     cfe/trunk/lib/Headers/<wbr>avx2intrin.h<br>
>     cfe/trunk/lib/Headers/<wbr>avx512fintrin.h<br>
>     cfe/trunk/lib/Headers/<wbr>avxintrin.h<br>
>     cfe/trunk/test/CodeGen/x86-<wbr>nontemporal.c<br>
><br>
> Modified: cfe/trunk/lib/Headers/<wbr>avx2intrin.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/avx2intrin.h?rev=309488&r1=309487&r2=309488&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Headers/<wbr>avx2intrin.h?rev=309488&r1=<wbr>309487&r2=309488&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/Headers/<wbr>avx2intrin.h (original)<br>
> +++ cfe/trunk/lib/Headers/<wbr>avx2intrin.h Sat Jul 29 08:33:34 2017<br>
> @@ -832,7 +832,8 @@ _mm256_xor_si256(__m256i __a, __m256i __<br>
>  static __inline__ __m256i __DEFAULT_FN_ATTRS<br>
>  _mm256_stream_load_si256(__<wbr>m256i const *__V)<br>
>  {<br>
> -  return (__m256i)__builtin_<wbr>nontemporal_load((const __v4di *)__V);<br>
> +  typedef __v4di __v4di_aligned __attribute__((aligned(32)));<br>
> +  return (__m256i)__builtin_<wbr>nontemporal_load((const __v4di_aligned *)__V);<br>
>  }<br>
><br>
>  static __inline__ __m128 __DEFAULT_FN_ATTRS<br>
><br>
> Modified: cfe/trunk/lib/Headers/<wbr>avx512fintrin.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/avx512fintrin.h?rev=309488&r1=309487&r2=309488&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Headers/<wbr>avx512fintrin.h?rev=309488&r1=<wbr>309487&r2=309488&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/Headers/<wbr>avx512fintrin.h (original)<br>
> +++ cfe/trunk/lib/Headers/<wbr>avx512fintrin.h Sat Jul 29 08:33:34 2017<br>
> @@ -9035,25 +9035,29 @@ _mm512_kxor (__mmask16 __A, __mmask16 __<br>
>  static __inline__ void __DEFAULT_FN_ATTRS<br>
>  _mm512_stream_si512 (__m512i * __P, __m512i __A)<br>
>  {<br>
> -  __builtin_nontemporal_store((_<wbr>_v8di)__A, (__v8di*)__P);<br>
> +  typedef __v8di __v8di_aligned __attribute__((aligned(64)));<br>
> +  __builtin_nontemporal_store((_<wbr>_v8di_aligned)__A, (__v8di_aligned*)__P);<br>
>  }<br>
><br>
>  static __inline__ __m512i __DEFAULT_FN_ATTRS<br>
>  _mm512_stream_load_si512 (void *__P)<br>
>  {<br>
> -  return (__m512i) __builtin_nontemporal_load((<wbr>const __v8di *)__P);<br>
> +  typedef __v8di __v8di_aligned __attribute__((aligned(64)));<br>
> +  return (__m512i) __builtin_nontemporal_load((<wbr>const __v8di_aligned *)__P);<br>
>  }<br>
><br>
>  static __inline__ void __DEFAULT_FN_ATTRS<br>
>  _mm512_stream_pd (double *__P, __m512d __A)<br>
>  {<br>
> -  __builtin_nontemporal_store((_<wbr>_v8df)__A, (__v8df*)__P);<br>
> +  typedef __v8df __v8df_aligned __attribute__((aligned(64)));<br>
> +  __builtin_nontemporal_store((_<wbr>_v8df_aligned)__A, (__v8df_aligned*)__P);<br>
>  }<br>
><br>
>  static __inline__ void __DEFAULT_FN_ATTRS<br>
>  _mm512_stream_ps (float *__P, __m512 __A)<br>
>  {<br>
> -  __builtin_nontemporal_store((_<wbr>_v16sf)__A, (__v16sf*)__P);<br>
> +  typedef __v16sf __v16sf_aligned __attribute__((aligned(64)));<br>
> +  __builtin_nontemporal_store((_<wbr>_v16sf_aligned)__A, (__v16sf_aligned*)__P);<br>
>  }<br>
><br>
>  static __inline__ __m512d __DEFAULT_FN_ATTRS<br>
><br>
> Modified: cfe/trunk/lib/Headers/<wbr>avxintrin.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/avxintrin.h?rev=309488&r1=309487&r2=309488&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Headers/<wbr>avxintrin.h?rev=309488&r1=<wbr>309487&r2=309488&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/lib/Headers/<wbr>avxintrin.h (original)<br>
> +++ cfe/trunk/lib/Headers/<wbr>avxintrin.h Sat Jul 29 08:33:34 2017<br>
> @@ -3590,7 +3590,8 @@ _mm_maskstore_ps(float *__p, __m128i __m<br>
>  static __inline void __DEFAULT_FN_ATTRS<br>
>  _mm256_stream_si256(__m256i *__a, __m256i __b)<br>
>  {<br>
> -  __builtin_nontemporal_store((_<wbr>_v4di)__b, (__v4di*)__a);<br>
> +  typedef __v4di __v4di_aligned __attribute__((aligned(32)));<br>
> +  __builtin_nontemporal_store((_<wbr>_v4di_aligned)__b, (__v4di_aligned*)__a);<br>
>  }<br>
><br>
>  /// \brief Moves double-precision values from a 256-bit vector of [4 x double]<br>
> @@ -3609,7 +3610,8 @@ _mm256_stream_si256(__m256i *__a, __m256<br>
>  static __inline void __DEFAULT_FN_ATTRS<br>
>  _mm256_stream_pd(double *__a, __m256d __b)<br>
>  {<br>
> -  __builtin_nontemporal_store((_<wbr>_v4df)__b, (__v4df*)__a);<br>
> +  typedef __v4df __v4df_aligned __attribute__((aligned(32)));<br>
> +  __builtin_nontemporal_store((_<wbr>_v4df_aligned)__b, (__v4df_aligned*)__a);<br>
>  }<br>
><br>
>  /// \brief Moves single-precision floating point values from a 256-bit vector<br>
> @@ -3629,7 +3631,8 @@ _mm256_stream_pd(double *__a, __m256d __<br>
>  static __inline void __DEFAULT_FN_ATTRS<br>
>  _mm256_stream_ps(float *__p, __m256 __a)<br>
>  {<br>
> -  __builtin_nontemporal_store((_<wbr>_v8sf)__a, (__v8sf*)__p);<br>
> +  typedef __v8sf __v8sf_aligned __attribute__((aligned(32)));<br>
> +  __builtin_nontemporal_store((_<wbr>_v8sf_aligned)__a, (__v8sf_aligned*)__p);<br>
>  }<br>
><br>
>  /* Create vectors */<br>
><br>
> Modified: cfe/trunk/test/CodeGen/x86-<wbr>nontemporal.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86-nontemporal.c?rev=309488&r1=309487&r2=309488&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGen/x86-nontemporal.c?rev=<wbr>309488&r1=309487&r2=309488&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- cfe/trunk/test/CodeGen/x86-<wbr>nontemporal.c (original)<br>
> +++ cfe/trunk/test/CodeGen/x86-<wbr>nontemporal.c Sat Jul 29 08:33:34 2017<br>
> @@ -1,12 +1,12 @@<br>
>  // RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=CHECK<br>
>  // RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=CHECK<br>
><br>
> -// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -emit-llvm -o - -Wall -Werror -fmax-type-align=16 | FileCheck %s --check-prefix=CHECK16<br>
> -// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -fno-signed-char -emit-llvm -o - -Wall -Werror -fmax-type-align=16 | FileCheck %s --check-prefix=CHECK16<br>
> +// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -emit-llvm -o - -Wall -Werror -fmax-type-align=16 | FileCheck %s --check-prefix=CHECK<br>
> +// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse4.1 -target-feature +avx -target-feature +avx2 -target-feature +avx512f -fno-signed-char -emit-llvm -o - -Wall -Werror -fmax-type-align=16 | FileCheck %s --check-prefix=CHECK<br>
><br>
>  #include <x86intrin.h><br>
><br>
> -// FIXME: (PR33830) Tests showing failure to correctly align non-temporal load/stores on darwin targets where fmax-type-align is set to 16.<br>
> +// (PR33830) Tests ensure the correct alignment of non-temporal load/stores on darwin targets where fmax-type-align is set to 16.<br>
><br>
>  //<br>
>  // 128-bit vectors<br>
> @@ -43,36 +43,24 @@ __m128i test_mm_stream_load_si128(__<wbr>m128<br>
>  void test_mm256_stream_pd(double* A, __m256d B) {<br>
>    // CHECK-LABEL: test_mm256_stream_pd<br>
>    // CHECK: store <4 x double> %{{.*}}, <4 x double>* %{{.*}}, align 32, !nontemporal<br>
> -<br>
> -  // CHECK16-LABEL: test_mm256_stream_pd<br>
> -  // CHECK16: store <4 x double> %{{.*}}, <4 x double>* %{{.*}}, align 16, !nontemporal<br>
>    _mm256_stream_pd(A, B);<br>
>  }<br>
><br>
>  void test_mm256_stream_ps(float* A, __m256 B) {<br>
>    // CHECK-LABEL: test_mm256_stream_ps<br>
>    // CHECK: store <8 x float> %{{.*}}, <8 x float>* %{{.*}}, align 32, !nontemporal<br>
> -<br>
> -  // CHECK16-LABEL: test_mm256_stream_ps<br>
> -  // CHECK16: store <8 x float> %{{.*}}, <8 x float>* %{{.*}}, align 16, !nontemporal<br>
>    _mm256_stream_ps(A, B);<br>
>  }<br>
><br>
>  void test_mm256_stream_si256(__<wbr>m256i* A, __m256i B) {<br>
>    // CHECK-LABEL: test_mm256_stream_si256<br>
>    // CHECK: store <4 x i64> %{{.*}}, <4 x i64>* %{{.*}}, align 32, !nontemporal<br>
> -<br>
> -  // CHECK16-LABEL: test_mm256_stream_si256<br>
> -  // CHECK16: store <4 x i64> %{{.*}}, <4 x i64>* %{{.*}}, align 16, !nontemporal<br>
>    _mm256_stream_si256(A, B);<br>
>  }<br>
><br>
>  __m256i test_mm256_stream_load_si256(_<wbr>_m256i const *A) {<br>
>    // CHECK-LABEL: test_mm256_stream_load_si256<br>
>    // CHECK: load <4 x i64>, <4 x i64>* %{{.*}}, align 32, !nontemporal<br>
> -<br>
> -  // CHECK16-LABEL: test_mm256_stream_load_si256<br>
> -  // CHECK16: load <4 x i64>, <4 x i64>* %{{.*}}, align 16, !nontemporal<br>
>    return _mm256_stream_load_si256(A);<br>
>  }<br>
><br>
> @@ -83,35 +71,23 @@ __m256i test_mm256_stream_load_si256(_<wbr>_m<br>
>  void test_mm512_stream_pd(double* A, __m512d B) {<br>
>    // CHECK-LABEL: test_mm512_stream_pd<br>
>    // CHECK: store <8 x double> %{{.*}}, <8 x double>* %{{.*}}, align 64, !nontemporal<br>
> -<br>
> -  // CHECK16-LABEL: test_mm512_stream_pd<br>
> -  // CHECK16: store <8 x double> %{{.*}}, <8 x double>* %{{.*}}, align 16, !nontemporal<br>
>    _mm512_stream_pd(A, B);<br>
>  }<br>
><br>
>  void test_mm512_stream_ps(float* A, __m512 B) {<br>
>    // CHECK-LABEL: test_mm512_stream_ps<br>
>    // CHECK: store <16 x float> %{{.*}}, <16 x float>* %{{.*}}, align 64, !nontemporal<br>
> -<br>
> -  // CHECK16-LABEL: test_mm512_stream_ps<br>
> -  // CHECK16: store <16 x float> %{{.*}}, <16 x float>* %{{.*}}, align 16, !nontemporal<br>
>    _mm512_stream_ps(A, B);<br>
>  }<br>
><br>
>  void test_mm512_stream_si512(__<wbr>m512i* A, __m512i B) {<br>
>    // CHECK-LABEL: test_mm512_stream_si512<br>
>    // CHECK: store <8 x i64> %{{.*}}, <8 x i64>* %{{.*}}, align 64, !nontemporal<br>
> -<br>
> -  // CHECK16-LABEL: test_mm512_stream_si512<br>
> -  // CHECK16: store <8 x i64> %{{.*}}, <8 x i64>* %{{.*}}, align 16, !nontemporal<br>
>    _mm512_stream_si512(A, B);<br>
>  }<br>
><br>
>  __m512i test_mm512_stream_load_si512(<wbr>void *A) {<br>
>    // CHECK-LABEL: test_mm512_stream_load_si512<br>
>    // CHECK: load <8 x i64>, <8 x i64>* %{{.*}}, align 64, !nontemporal<br>
> -<br>
> -  // CHECK16-LABEL: test_mm512_stream_load_si512<br>
> -  // CHECK16: load <8 x i64>, <8 x i64>* %{{.*}}, align 16, !nontemporal<br>
>    return _mm512_stream_load_si512(A);<br>
>  }<br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>