[Bug middle-end/40135] using alias-set zero for union accesses necessary because of RTL alias oracle
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Sep 9 09:00:00 GMT 2014
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=40135
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
For reference I see for example
FAIL: gcc.target/i386/avx2-vpblendd128-2.c execution test
FAIL: gcc.target/i386/avx2-vpblendd256-2.c execution test
FAIL: gcc.target/i386/avx2-vpblendw-2.c execution test
FAIL: gcc.target/i386/avx2-vpbroadcastd128-2.c execution test
FAIL: gcc.target/i386/avx2-vpbroadcastd256-2.c execution test
FAIL: gcc.target/i386/avx2-vpbroadcastw128-2.c execution test
FAIL: gcc.target/i386/avx2-vpbroadcastw256-2.c execution test
FAIL: gcc.target/i386/avx2-vpermd-2.c execution test
FAIL: gcc.target/i386/avx2-vpermps-2.c execution test
FAIL: gcc.target/i386/avx2-vpmaxsd-2.c execution test
FAIL: gcc.target/i386/avx2-vpmaxsw-2.c execution test
FAIL: gcc.target/i386/avx2-vpmaxud-2.c execution test
FAIL: gcc.target/i386/avx2-vpmaxuw-2.c execution test
FAIL: gcc.target/i386/avx2-vpminsd-2.c execution test
FAIL: gcc.target/i386/avx2-vpminsw-2.c execution test
FAIL: gcc.target/i386/avx2-vpminud-2.c execution test
FAIL: gcc.target/i386/avx2-vpminuw-2.c execution test
FAIL: gcc.target/i386/avx2-vpmuldq-2.c execution test
FAIL: gcc.target/i386/avx2-vpmulhrsw-2.c execution test
FAIL: gcc.target/i386/avx2-vpmulhuw-2.c execution test
FAIL: gcc.target/i386/avx2-vpmulhw-2.c execution test
FAIL: gcc.target/i386/avx2-vpmulld-2.c execution test
...
FAIL: gcc.target/i386/avx2-vpunpckhdq-2.c execution test
FAIL: gcc.target/i386/avx2-vpunpckhwd-2.c execution test
FAIL: gcc.target/i386/avx2-vpunpckldq-2.c execution test
FAIL: gcc.target/i386/avx2-vpunpcklwd-2.c execution test
but for example gcc.target/i386/avx2-vpblendd128-2.c contains "invalid"
type-punning through unions:
static void
init_pblendd128 (int *src1, int *src2, int seed)
{
int i, sign = 1;
for (i = 0; i < 4; i++)
{
src1[i] = (i + seed) * (i + seed) * sign;
src2[i] = (i + seed + 20) * sign;
sign = -sign;
}
}
...
static void
avx2_test (void)
{
union128i_d src1, src2, dst;
int dst_ref[4];
int i;
for (i = 0; i < NUM; i++)
{
init_pblendd128 (src1.a, src2.a, i);
dst.x = _mm_blend_epi32 (src1.x, src2.x, MASK);
which stores into src1/src2 via a pointer access and only reads via a direct
access to the union.
That's not how the GCC extension specifies union type-punning. I've filed
PR63211 for that.
Here the stores do not end up in alias-set zero and with removing the
c-common.c hack the loads also end up not using alias-set zero. Without
the fix the loads use alias-set zero and thus keep the int-stores live.
There is also no easy must-alias to identify here as the stores happen
in a loop.
More information about the Gcc-bugs
mailing list