From: Jakub Jelinek Date: Wed, 28 Mar 2012 08:01:00 +0000 (+0200) Subject: re PR target/52736 (miscompilation: store to aliased __m128d is 8 Bytes off) X-Git-Tag: upstream/12.2.0~77171 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=be47bf24cbd5e88ebbde79ff7c5352e51c613f47;p=platform%2Fupstream%2Fgcc.git re PR target/52736 (miscompilation: store to aliased __m128d is 8 Bytes off) PR target/52736 * config/i386/sse.md (sse2_loadlpd splitter): Use offset 0 instead of 8 in adjust_address. * gcc.target/i386/pr52736.c: New test. From-SVN: r185904 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a7a7661..12b1609 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-03-28 Jakub Jelinek + + PR target/52736 + * config/i386/sse.md (sse2_loadlpd splitter): Use offset 0 + instead of 8 in adjust_address. + 2012-03-27 Aurelien Buhrig PR middle-end/51893 diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 9a4728c..96e43a2 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -4901,7 +4901,7 @@ (vec_select:DF (match_dup 0) (parallel [(const_int 1)]))))] "TARGET_SSE2 && reload_completed" [(set (match_dup 0) (match_dup 1))] - "operands[0] = adjust_address (operands[0], DFmode, 8);") + "operands[0] = adjust_address (operands[0], DFmode, 0);") (define_insn "sse2_movsd" [(set (match_operand:V2DF 0 "nonimmediate_operand" "=x,x,x,x,m,x,x,x,o") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6231db2..f042018 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-03-28 Jakub Jelinek + + PR target/52736 + * gcc.target/i386/pr52736.c: New test. + 2012-03-27 Martin Jambor PR middle-end/52693 diff --git a/gcc/testsuite/gcc.target/i386/pr52736.c b/gcc/testsuite/gcc.target/i386/pr52736.c new file mode 100644 index 0000000..f35c1fd --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr52736.c @@ -0,0 +1,29 @@ +/* PR target/52736 */ +/* { dg-do run } */ +/* { dg-options "-O1 -msse2" } */ +/* { dg-require-effective-target sse2_runtime } */ + +#include + +typedef double D __attribute__((may_alias)); +__attribute__((aligned(16))) static const double r[4] = { 1., 5., 1., 3. }; + +__attribute__((noinline, noclone)) +void +foo (int x) +{ + asm volatile ("" : "+g" (x) : : "memory"); + if (x != 3) + __builtin_abort (); +} + +int +main () +{ + __m128d t = _mm_set1_pd (5.); + ((D *)(&t))[0] = 1.; + foo (_mm_movemask_pd (_mm_cmpeq_pd (t, _mm_load_pd (&r[0])))); + ((D *)(&t))[1] = 3.; + foo (_mm_movemask_pd (_mm_cmpeq_pd (t, _mm_load_pd (&r[2])))); + return 0; +}