re PR target/54703 (_mm_sub_pd is incorrectly substituted with vandnps)

PR target/54703
	* simplify-rtx.c (simplify_binary_operation_1): Perform
	(x - (x & y)) -> (x & ~y) optimization only for integral
	modes.

	* gcc.target/i386/pr54703.c: New test.

From-SVN: r191802
This commit is contained in:
Jakub Jelinek 2012-09-27 12:53:42 +02:00 committed by Jakub Jelinek
parent 7c28a6b710
commit 54730221d5
4 changed files with 50 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2012-09-27 Jakub Jelinek <jakub@redhat.com>
PR target/54703
* simplify-rtx.c (simplify_binary_operation_1): Perform
(x - (x & y)) -> (x & ~y) optimization only for integral
modes.
2012-09-24 Eric Botcazou <ebotcazou@adacore.com>
* tree-streamer-in.c (unpack_ts_type_common_value_fields): Stream in

View File

@ -1,7 +1,7 @@
/* RTL simplification functions for GNU compiler.
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011 Free Software Foundation, Inc.
2011, 2012 Free Software Foundation, Inc.
This file is part of GCC.
@ -2239,7 +2239,7 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
neg_const_int (mode, op1));
/* (x - (x & y)) -> (x & ~y) */
if (GET_CODE (op1) == AND)
if (INTEGRAL_MODE_P (mode) && GET_CODE (op1) == AND)
{
if (rtx_equal_p (op0, XEXP (op1, 0)))
{

View File

@ -1,3 +1,8 @@
2012-09-27 Jakub Jelinek <jakub@redhat.com>
PR target/54703
* gcc.target/i386/pr54703.c: New test.
2012-09-24 Janis Johnson <janisjo@codesourcery.com>
Backport from mainline:

View File

@ -0,0 +1,36 @@
/* PR target/54703 */
/* { dg-do run { target sse2_runtime } } */
/* { dg-options "-O -msse2" } */
/* { dg-additional-options "-mavx -mtune=bdver1" { target avx_runtime } } */
extern void abort (void);
typedef double V __attribute__((vector_size(16)));
union {
unsigned long long m[2];
V v;
} u = { { 0xffffffffff000000ULL, 0xffffffffff000000ULL } };
static inline V
foo (V x)
{
V y = __builtin_ia32_andpd (x, u.v);
V z = __builtin_ia32_subpd (x, y);
return __builtin_ia32_mulpd (y, z);
}
void
test (V *x)
{
V a = { 2.1, 2.1 };
*x = foo (foo (a));
}
int
main ()
{
test (&u.v);
if (u.m[0] != 0x3acbf487f0a30550ULL || u.m[1] != u.m[0])
abort ();
return 0;
}