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: r185905
This commit is contained in:
Jakub Jelinek 2012-03-28 10:03:11 +02:00 committed by Jakub Jelinek
parent f7bb11f848
commit 3381e23cf6
4 changed files with 41 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2012-03-28 Jakub Jelinek <jakub@redhat.com>
PR target/52736
* config/i386/sse.md (sse2_loadlpd splitter): Use offset 0
instead of 8 in adjust_address.
2012-03-27 Eric Botcazou <ebotcazou@adacore.com>
* expmed.c (store_bit_field): Assert that BITREGION_START is a multiple

View File

@ -4890,7 +4890,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")

View File

@ -1,3 +1,8 @@
2012-03-28 Jakub Jelinek <jakub@redhat.com>
PR target/52736
* gcc.target/i386/pr52736.c: New test.
2012-03-27 Richard Guenther <rguenther@suse.de>
PR middle-end/52720

View File

@ -0,0 +1,29 @@
/* PR target/52736 */
/* { dg-do run } */
/* { dg-options "-O1 -msse2" } */
/* { dg-require-effective-target sse2_runtime } */
#include <x86intrin.h>
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;
}