aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2011-05-24 17:31:12 +0200
committerUros Bizjak <uros@gcc.gnu.org>2011-05-24 17:31:12 +0200
commitdf1f7315c7fbad1fa24e4bf0490e42a9cc090dda (patch)
treed41e6208245b29ca5a23d1fe3357c55118a03276
parent9fb38494a969437a79eec4757cb600081fa92b39 (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/sse.md18
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/other/pr49133.C36
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;
+}