This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch][i386] PR 70118: Fix ubsan warning on SSE2 loadl_epi64 and storel_epi64
- From: Allan Sandfeld Jensen <linux at carewolf dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Marc Glisse <marc dot glisse at inria dot fr>
- Date: Sat, 26 Nov 2016 23:10:59 +0100
- Subject: [Patch][i386] PR 70118: Fix ubsan warning on SSE2 loadl_epi64 and storel_epi64
- Authentication-results: sourceware.org; auth=none
Use the recently introduced unaligned variant of __m128i and add a similar
__m64 and use those to make it clear these two intrinsics require neither 128-
bit nor 64-bit alignment.
`Allan
Index: gcc/config/i386/emmintrin.h
===================================================================
--- gcc/config/i386/emmintrin.h (revision 242753)
+++ gcc/config/i386/emmintrin.h (working copy)
@@ -703,9 +703,9 @@
}
extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
-_mm_loadl_epi64 (__m128i const *__P)
+_mm_loadl_epi64 (__m128i_u const *__P)
{
- return _mm_set_epi64 ((__m64)0LL, *(__m64 *)__P);
+ return _mm_set_epi64 ((__m64)0LL, *(__m64_u *)__P);
}
extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
@@ -721,9 +721,9 @@
}
extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
-_mm_storel_epi64 (__m128i *__P, __m128i __B)
+_mm_storel_epi64 (__m128i_u *__P, __m128i __B)
{
- *(long long *)__P = ((__v2di)__B)[0];
+ *(__m64_u *)__P = __m64(((__v2di)__B)[0]);
}
extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
Index: gcc/config/i386/mmintrin.h
===================================================================
--- gcc/config/i386/mmintrin.h (revision 242753)
+++ gcc/config/i386/mmintrin.h (working copy)
@@ -37,6 +37,9 @@
vector types, and their scalar components. */
typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__));
+/* Unaligned version of the same type */
+typedef int __m64_u __attribute__ ((__vector_size__ (8), __may_alias__, __aligned__ (1)));
+
/* Internal data types for implementing the intrinsics. */
typedef int __v2si __attribute__ ((__vector_size__ (8)));
typedef short __v4hi __attribute__ ((__vector_size__ (8)));