Bug 37042 - Strict-aliasing warnings are printed for _mm_load_si128, even though __m128i is __attribute__((__may_alias__)).
Summary: Strict-aliasing warnings are printed for _mm_load_si128, even though __m128i ...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.3.2
: P3 normal
Target Milestone: 4.3.2
Assignee: Richard Biener
URL:
Keywords: diagnostic
Depends on:
Blocks:
 
Reported: 2008-08-06 21:29 UTC by Jonathan Lennox
Modified: 2008-08-11 14:11 UTC (History)
1 user (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build: i686-pc-linux-gnu
Known to work: 4.3.2
Known to fail: 4.3.1
Last reconfirmed: 2008-08-07 08:51:06


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Jonathan Lennox 2008-08-06 21:29:35 UTC
The Intel SSE intrinsic function _mm_load_si128 prints a warning when the data being loaded from is actually an array of int16_t, even though its argument (__m128i*) is declared with __attribute__((__may_alias__)).

$ cat alias-warn-emmintrin.c
#include <emmintrin.h>
#include <stdint.h>

static const int16_t __attribute__((__aligned__(16))) tbl[8] =
{ 1, 2, 3, 4, 5, 6, 7, 8};


__m128i get_vec(void)
{
        __m128i ret;

        ret = _mm_load_si128((__m128i *)tbl);

        return ret;
}

$ ~/GCC/bin/gcc-4.3 -O2 -Wall -msse2 -c alias-warn-emmintrin.c
alias-warn-emmintrin.c: In function ‘get_vec’:
alias-warn-emmintrin.c:12: warning: likely type-punning may break strict-aliasing rules: object ‘*{unknown}’ of main type ‘long long int __vector__’ is referenced at or around /mnt/int_drive/jonathan/GCC/bin/../lib/gcc/i686-pc-linux-gnu/4.3.2/include/emmintrin.h:681 and may be aliased to object ‘tbl’ of main type ‘short int’ which is referenced at or around alias-warn-emmintrin.c:12.

$ ~/GCC/bin/gcc-4.3 -v -O2 -Wall -msse2 -c alias-warn-emmintrin.c
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../gcc-4.3-20080731/configure --enable-threads=posix --prefix=/home/jonathan/GCC --with-local-prefix=/usr/local --enable-languages=c,c++,objc,fortran,obj-c++,java --enable-checking=release --enable-ssp --disable-libssp --disable-libgcj --with-system-zlib --enable-shared --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --program-suffix=-4.3 --enable-version-specific-runtime-libs --without-system-libunwind --with-cpu=generic
Thread model: posix
gcc version 4.3.2 20080731 (prerelease) (GCC)
COLLECT_GCC_OPTIONS='-v' '-O2' '-Wall' '-msse2' '-c' '-mtune=generic'
 /mnt/int_drive/jonathan/GCC/bin/../libexec/gcc/i686-pc-linux-gnu/4.3.2/cc1 -quiet -v -iprefix /mnt/int_drive/jonathan/GCC/bin/../lib/gcc/i686-pc-linux-gnu/4.3.2/ alias-warn-emmintrin.c -quiet -dumpbase alias-warn-emmintrin.c -msse2 -mtune=generic -auxbase alias-warn-emmintrin -O2 -Wall -version -o /tmp/ccKGNLjp.s
ignoring nonexistent directory "/mnt/int_drive/jonathan/GCC/bin/../lib/gcc/i686-pc-linux-gnu/4.3.2/../../../../i686-pc-linux-gnu/include"
ignoring duplicate directory "/mnt/int_drive/jonathan/GCC/bin/../lib/gcc/../../lib/gcc/i686-pc-linux-gnu/4.3.2/include"
ignoring duplicate directory "/mnt/int_drive/jonathan/GCC/bin/../lib/gcc/../../lib/gcc/i686-pc-linux-gnu/4.3.2/include-fixed"
ignoring nonexistent directory "/mnt/int_drive/jonathan/GCC/bin/../lib/gcc/../../lib/gcc/i686-pc-linux-gnu/4.3.2/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /mnt/int_drive/jonathan/GCC/bin/../lib/gcc/i686-pc-linux-gnu/4.3.2/include
 /mnt/int_drive/jonathan/GCC/bin/../lib/gcc/i686-pc-linux-gnu/4.3.2/include-fixed
 /usr/local/include
 /mnt/int_drive/jonathan/GCC/bin/../lib/gcc/../../include
 /usr/include
End of search list.
GNU C (GCC) version 4.3.2 20080731 (prerelease) (i686-pc-linux-gnu)
        compiled by GNU C version 4.3.2 20080731 (prerelease), GMP version 4.2.1, MPFR version 2.2.1.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 3f9a15ebf1f37358d0142d31f7849434
alias-warn-emmintrin.c: In function ‘get_vec’:
alias-warn-emmintrin.c:12: warning: likely type-punning may break strict-aliasing rules: object ‘*{unknown}’ of main type ‘long long int __vector__’ is referenced at or around /mnt/int_drive/jonathan/GCC/bin/../lib/gcc/i686-pc-linux-gnu/4.3.2/include/emmintrin.h:681 and may be aliased to object ‘tbl’ of main type ‘short int’ which is referenced at or around alias-warn-emmintrin.c:12.
COLLECT_GCC_OPTIONS='-v' '-O2' '-Wall' '-msse2' '-c' '-mtune=generic'
 as -V -Qy -o alias-warn-emmintrin.o /tmp/ccKGNLjp.s
GNU assembler version 2.17.50 (i586-suse-linux) using BFD version (GNU Binutils) 2.17.50.20070726-14 (SUSE Linux)
COMPILER_PATH=/mnt/int_drive/jonathan/GCC/bin/../libexec/gcc/i686-pc-linux-gnu/4.3.2/:/mnt/int_drive/jonathan/GCC/bin/../libexec/gcc/
LIBRARY_PATH=/mnt/int_drive/jonathan/GCC/bin/../lib/gcc/i686-pc-linux-gnu/4.3.2/:/mnt/int_drive/jonathan/GCC/bin/../lib/gcc/:/mnt/int_drive/jonathan/GCC/bin/../lib/gcc/i686-pc-linux-gnu/4.3.2/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-O2' '-Wall' '-msse2' '-c' '-mtune=generic'
Comment 1 Richard Biener 2008-08-07 08:50:49 UTC
Confirmed.  This is the other machinery.

typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));

extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_load_si128 (__m128i const *__P)
{
  return *__P;
}

static const short __attribute__((__aligned__(16))) tbl[8] =
{ 1, 2, 3, 4, 5, 6, 7, 8};


__m128i get_vec(void)
{
  __m128i ret;

  ret = _mm_load_si128((__m128i *)tbl);

  return ret;
}
Comment 2 Richard Biener 2008-08-07 08:51:06 UTC
Mine.
Comment 3 Richard Biener 2008-08-07 10:01:23 UTC
Subject: Bug 37042

Author: rguenth
Date: Thu Aug  7 09:59:58 2008
New Revision: 138836

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=138836
Log:
2008-08-07  Richard Guenther  <rguenther@suse.de>

	PR middle-end/37042
	* tree-ssa-alias-warnings.c (nonstandard_alias_p): Ref-all
	pointers can access anything.

	* gcc.dg/Wstrict-aliasing-bogus-ref-all-2.c: New testcase.

Added:
    branches/gcc-4_3-branch/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-ref-all-2.c
Modified:
    branches/gcc-4_3-branch/gcc/ChangeLog
    branches/gcc-4_3-branch/gcc/testsuite/ChangeLog
    branches/gcc-4_3-branch/gcc/tree-ssa-alias-warnings.c

Comment 4 Richard Biener 2008-08-07 10:02:08 UTC
Fixed.
Comment 5 Richard Biener 2008-08-07 10:03:10 UTC
Subject: Bug 37042

Author: rguenth
Date: Thu Aug  7 10:01:48 2008
New Revision: 138837

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=138837
Log:
2008-08-07  Richard Guenther  <rguenther@suse.de>

	PR middle-end/37042
	* tree-ssa-alias-warnings.c (nonstandard_alias_p): Ref-all
	pointers can access anything.

	* gcc.dg/Wstrict-aliasing-bogus-ref-all-2.c: New testcase.

Added:
    trunk/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-ref-all-2.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/tree-ssa-alias-warnings.c

Comment 6 Andrew Pinski 2008-08-10 20:19:11 UTC
Note this testcase fails on powerpc64-linux-gnu with the following warning:
/home/apinski/src/local/gcc/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-ref-all-2.c:8:
warning: GCC vector returned by reference: non-standard ABI extension
with no compatibility guarantee
Comment 7 Jonathan Lennox 2008-08-11 14:11:09 UTC
The fact that the function returns the vector is not an essential part of the test; the return value of the load function just needs not to be optimized out as unused.  So changing the test for broader compatibility is fine as far as I'm concerned.