diff options
author | Uros Bizjak <uros@gcc.gnu.org> | 2011-05-24 17:31:12 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2011-05-24 17:31:12 +0200 |
commit | df1f7315c7fbad1fa24e4bf0490e42a9cc090dda (patch) | |
tree | d41e6208245b29ca5a23d1fe3357c55118a03276 /gcc | |
parent | 9fb38494a969437a79eec4757cb600081fa92b39 (diff) | |
download | gcc-df1f7315c7fbad1fa24e4bf0490e42a9cc090dda.zip gcc-df1f7315c7fbad1fa24e4bf0490e42a9cc090dda.tar.gz gcc-df1f7315c7fbad1fa24e4bf0490e42a9cc090dda.tar.bz2 |
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: r174122
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/sse.md | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/pr49133.C | 36 |
4 files changed, 55 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 34827e3..3e4b663 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-05-24 Uros Bizjak <ubizjak@gmail.com> + + PR target/49133 + * config/i386/sse.md (sse2_loadhpd): Remove shufpd alternative. + 2011-05-24 Eric Botcazou <ebotcazou@adacore.com> Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index ddd66fd..2bffb09 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -4270,30 +4270,28 @@ ;; 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,x,x,o,o ,o") + "=x,x,x,x,o,o ,o") (vec_concat:V2DF (vec_select:DF (match_operand:V2DF 1 "nonimmediate_operand" - " 0,x,0,x,x,0,0 ,0") + " 0,x,0,x,0,0 ,0") (parallel [(const_int 0)])) (match_operand:DF 2 "nonimmediate_operand" - " m,m,x,x,0,x,*f,r")))] + " m,m,x,x,x,*f,r")))] "TARGET_SSE2 && !(MEM_P (operands[1]) && MEM_P (operands[2]))" "@ movhpd\t{%2, %0|%0, %2} vmovhpd\t{%2, %1, %0|%0, %1, %2} unpcklpd\t{%2, %0|%0, %2} vunpcklpd\t{%2, %1, %0|%0, %1, %2} - shufpd\t{$1, %1, %0|%0, %1, 1} # # #" - [(set_attr "isa" "noavx,avx,noavx,avx,noavx,base,base,base") - (set_attr "type" "ssemov,ssemov,sselog,sselog,sselog,ssemov,fmov,imov") - (set_attr "prefix_data16" "1,*,*,*,*,*,*,*") - (set_attr "length_immediate" "*,*,*,*,1,*,*,*") - (set_attr "prefix" "orig,vex,orig,vex,orig,*,*,*") - (set_attr "mode" "V1DF,V1DF,V2DF,V2DF,V2DF,DF,DF,DF")]) + [(set_attr "isa" "noavx,avx,noavx,avx,base,base,base") + (set_attr "type" "ssemov,ssemov,sselog,sselog,ssemov,fmov,imov") + (set_attr "prefix_data16" "1,*,*,*,*,*,*") + (set_attr "prefix" "orig,vex,orig,vex,*,*,*") + (set_attr "mode" "V1DF,V1DF,V2DF,V2DF,DF,DF,DF")]) (define_split [(set (match_operand:V2DF 0 "memory_operand" "") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 48fb720..bdc0f3e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-05-24 Uros Bizjak <ubizjak@gmail.com> + + PR target/49133 + * g++.dg/other/pr49133.C: New test. + 2011-05-24 Uros Bizjak <ubizjak@gmail.com> Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> @@ -450,7 +455,7 @@ 2011-05-08 Ville Voutilainen <ville.voutilainen@gmail.com> - * g++.dg/inherit/virtual9.C: New. + * g++.dg/inherit/virtual9.C: New. 2011-05-09 Dodji Seketeli <dodji@redhat.com> diff --git a/gcc/testsuite/g++.dg/other/pr49133.C b/gcc/testsuite/g++.dg/other/pr49133.C new file mode 100644 index 0000000..a59687f --- /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 <xmmintrin.h> + +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<double_a *>(&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; +} |