[clang] d963420 - [Headers][X86] Ensure all AVX broadcast scalar load intrinsics are unaligned
Simon Pilgrim via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 3 06:05:02 PDT 2023
Author: Simon Pilgrim
Date: 2023-07-03T14:04:50+01:00
New Revision: d9634205d999439807a9f6c5a18be58ac1a55ced
URL: https://github.com/llvm/llvm-project/commit/d9634205d999439807a9f6c5a18be58ac1a55ced
DIFF: https://github.com/llvm/llvm-project/commit/d9634205d999439807a9f6c5a18be58ac1a55ced.diff
LOG: [Headers][X86] Ensure all AVX broadcast scalar load intrinsics are unaligned
Similar to the existing _mm_load1_pd/_mm_loaddup_pd and broadcast vector loads, these intrinsic should ensure the loads are unaligned and not assume type alignment
Fixes #62325
Added:
Modified:
clang/lib/Headers/avxintrin.h
clang/test/CodeGen/X86/avx-builtins.c
Removed:
################################################################################
diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h
index bd119220559e47..94fac5e6c9da47 100644
--- a/clang/lib/Headers/avxintrin.h
+++ b/clang/lib/Headers/avxintrin.h
@@ -3017,8 +3017,11 @@ _mm256_zeroupper(void)
static __inline __m128 __DEFAULT_FN_ATTRS128
_mm_broadcast_ss(float const *__a)
{
- float __f = *__a;
- return __extension__ (__m128)(__v4sf){ __f, __f, __f, __f };
+ struct __mm_broadcast_ss_struct {
+ float __f;
+ } __attribute__((__packed__, __may_alias__));
+ float __f = ((const struct __mm_broadcast_ss_struct*)__a)->__f;
+ return __extension__ (__m128){ __f, __f, __f, __f };
}
/// Loads a scalar double-precision floating point value from the
@@ -3036,7 +3039,10 @@ _mm_broadcast_ss(float const *__a)
static __inline __m256d __DEFAULT_FN_ATTRS
_mm256_broadcast_sd(double const *__a)
{
- double __d = *__a;
+ struct __mm256_broadcast_sd_struct {
+ double __d;
+ } __attribute__((__packed__, __may_alias__));
+ double __d = ((const struct __mm256_broadcast_sd_struct*)__a)->__d;
return __extension__ (__m256d)(__v4df){ __d, __d, __d, __d };
}
@@ -3055,7 +3061,10 @@ _mm256_broadcast_sd(double const *__a)
static __inline __m256 __DEFAULT_FN_ATTRS
_mm256_broadcast_ss(float const *__a)
{
- float __f = *__a;
+ struct __mm256_broadcast_ss_struct {
+ float __f;
+ } __attribute__((__packed__, __may_alias__));
+ float __f = ((const struct __mm256_broadcast_ss_struct*)__a)->__f;
return __extension__ (__m256)(__v8sf){ __f, __f, __f, __f, __f, __f, __f, __f };
}
diff --git a/clang/test/CodeGen/X86/avx-builtins.c b/clang/test/CodeGen/X86/avx-builtins.c
index 761ab6e9eb2cb0..b68d192051b9bf 100644
--- a/clang/test/CodeGen/X86/avx-builtins.c
+++ b/clang/test/CodeGen/X86/avx-builtins.c
@@ -99,7 +99,7 @@ __m256 test_mm256_broadcast_ps(__m128* A) {
__m256d test_mm256_broadcast_sd(double* A) {
// CHECK-LABEL: test_mm256_broadcast_sd
- // CHECK: load double, ptr %{{.*}}
+ // CHECK: load double, ptr %{{.*}}, align 1{{$}}
// CHECK: insertelement <4 x double> undef, double %{{.*}}, i32 0
// CHECK: insertelement <4 x double> %{{.*}}, double %{{.*}}, i32 1
// CHECK: insertelement <4 x double> %{{.*}}, double %{{.*}}, i32 2
@@ -109,7 +109,7 @@ __m256d test_mm256_broadcast_sd(double* A) {
__m128 test_mm_broadcast_ss(float* A) {
// CHECK-LABEL: test_mm_broadcast_ss
- // CHECK: load float, ptr %{{.*}}
+ // CHECK: load float, ptr %{{.*}}, align 1{{$}}
// CHECK: insertelement <4 x float> undef, float %{{.*}}, i32 0
// CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 1
// CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 2
@@ -119,7 +119,7 @@ __m128 test_mm_broadcast_ss(float* A) {
__m256 test_mm256_broadcast_ss(float* A) {
// CHECK-LABEL: test_mm256_broadcast_ss
- // CHECK: load float, ptr %{{.*}}
+ // CHECK: load float, ptr %{{.*}}, align 1{{$}}
// CHECK: insertelement <8 x float> undef, float %{{.*}}, i32 0
// CHECK: insertelement <8 x float> %{{.*}}, float %{{.*}}, i32 1
// CHECK: insertelement <8 x float> %{{.*}}, float %{{.*}}, i32 2
More information about the cfe-commits
mailing list