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: r174215
This commit is contained in:
Uros Bizjak 2011-05-25 18:39:22 +02:00 committed by Uros Bizjak
parent d37155aa5a
commit 81e97b147a
4 changed files with 52 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2011-05-25 Uros Bizjak <ubizjak@gmail.com>
PR target/49133
* config/i386/sse.md (sse2_loadhpd): Remove shufpd alternative.
2011-05-23 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR rtl-optimization/49007

View File

@ -4402,22 +4402,21 @@
(set_attr "mode" "V1DF,V2DF,DF,DF,DF")])
(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 "mode" "V1DF,V2DF,V2DF,DF,DF,DF")])
[(set_attr "type" "ssemov,sselog,ssemov,fmov,imov")
(set_attr "mode" "V1DF,V2DF,DF,DF,DF")])
(define_split
[(set (match_operand:V2DF 0 "memory_operand" "")

View File

@ -1,3 +1,8 @@
2011-05-25 Uros Bizjak <ubizjak@gmail.com>
PR target/49133
* g++.dg/other/pr49133.C: New test.
2011-05-20 Jason Merrill <jason@redhat.com>
* g++.dg/init/new32.C: New.

View File

@ -0,0 +1,37 @@
/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2 -msse2" } */
/* { dg-require-effective-target sse2 } */
/* { 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;
}