From: Uros Bizjak Date: Wed, 25 May 2011 13:26:42 +0000 (+0200) Subject: re PR target/49133 (modification of aliased __m128d miscompiles) X-Git-Tag: releases/gcc-4.5.4~625 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=98acbc277c2430de858116f9f0ee86b3f6a1d7af;p=thirdparty%2Fgcc.git re PR target/49133 (modification of aliased __m128d miscompiles) PR target/49133 * config/i386/sse.md (sse2_loadhpd): Remove shufpd alternative. testsuite/ChangeLog: PR target/49133 * g++.dg/other/pr49133.C: New test. From-SVN: r174195 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9cbe84247d78..4a9b07794052 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-05-25 Uros Bizjak + + PR target/49133 + * config/i386/sse.md (sse2_loadhpd): Remove shufpd alternative. + 2011-05-21 Eric Botcazou * config/sparc/sparc.md (setjmp): Handle PIC mode and use the hard diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index ec09fda1710e..67f55ee7abe1 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -4964,24 +4964,22 @@ ;; Avoid combining registers from different units in a single alternative, ;; see comment above inline_secondary_memory_needed function in i386.c (define_insn "sse2_loadhpd" - [(set (match_operand:V2DF 0 "nonimmediate_operand" "=x,x,x,o,o,o") + [(set (match_operand:V2DF 0 "nonimmediate_operand" "=x,x,o,o,o") (vec_concat:V2DF (vec_select:DF - (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,x,0,0,0") + (match_operand:V2DF 1 "nonimmediate_operand" " 0,0,0,0,0") (parallel [(const_int 0)])) - (match_operand:DF 2 "nonimmediate_operand" " m,x,0,x,*f,r")))] + (match_operand:DF 2 "nonimmediate_operand" " m,x,x,*f,r")))] "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))" "@ movhpd\t{%2, %0|%0, %2} unpcklpd\t{%2, %0|%0, %2} - shufpd\t{$1, %1, %0|%0, %1, 1} # # #" - [(set_attr "type" "ssemov,sselog,sselog,ssemov,fmov,imov") - (set_attr "prefix_data16" "1,*,*,*,*,*") - (set_attr "length_immediate" "*,*,1,*,*,*") - (set_attr "mode" "V1DF,V2DF,V2DF,DF,DF,DF")]) + [(set_attr "type" "ssemov,sselog,ssemov,fmov,imov") + (set_attr "prefix_data16" "1,*,*,*,*") + (set_attr "mode" "V1DF,V2DF,DF,DF,DF")]) (define_split [(set (match_operand:V2DF 0 "memory_operand" "") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5526d710a7a6..7763aa8515df 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-25 Uros Bizjak + + PR target/49133 + * g++.dg/other/pr49133.C: New test. + 2011-05-20 Jason Merrill * g++.dg/init/new32.C: New. diff --git a/gcc/testsuite/g++.dg/other/pr49133.C b/gcc/testsuite/g++.dg/other/pr49133.C new file mode 100644 index 000000000000..a59687f9c742 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr49133.C @@ -0,0 +1,36 @@ +/* { dg-do run { target i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O2 -msse2" } */ +/* { dg-require-effective-target sse2_runtime } */ + +#include + +extern "C" void abort (); + +typedef double double_a __attribute__((__may_alias__)); + +struct V +{ + __m128d data; +}; + +int +main() +{ + V a; + __m128d b; + + b = _mm_set_pd (1., 0.); + a.data = _mm_set_pd (1., 0.); + a.data = _mm_add_pd (a.data, + _mm_and_pd (_mm_cmpeq_pd (a.data, _mm_set1_pd (0.)), + _mm_set1_pd (2.))); + reinterpret_cast(&a.data)[1] += 1.; + b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (0.)), + _mm_set1_pd (1.))); + b = _mm_add_pd (b, _mm_and_pd (_mm_cmpeq_pd (b, _mm_set1_pd (1.)), + _mm_set1_pd (1.))); + if (_mm_movemask_pd (_mm_cmpeq_pd (a.data, b)) != 0x3) + abort(); + + return 0; +}