simplify-rtx.c (simplify_binary_operation_1): Optimize shuffle of concatenations.

2012-05-30  Marc Glisse  <marc.glisse@inria.fr>

gcc/
	* simplify-rtx.c (simplify_binary_operation_1): Optimize shuffle of
	concatenations.

gcc/testsuite/
	* gcc.target/i386/shuf-concat.c: New test.

From-SVN: r188006
This commit is contained in:
Marc Glisse 2012-05-30 12:48:06 +02:00 committed by Marc Glisse
parent ab068278e9
commit 66c540d27c
4 changed files with 44 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2012-05-30 Marc Glisse <marc.glisse@inria.fr>
* simplify-rtx.c (simplify_binary_operation_1): Optimize shuffle of
concatenations.
2012-05-30 Richard Guenther <rguenther@suse.de>
PR middle-end/53522

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.
@ -3242,6 +3242,27 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
return gen_rtx_CONST_VECTOR (mode, v);
}
/* If we build {a,b} then permute it, build the result directly. */
if (XVECLEN (trueop1, 0) == 2
&& CONST_INT_P (XVECEXP (trueop1, 0, 0))
&& CONST_INT_P (XVECEXP (trueop1, 0, 1))
&& GET_CODE (trueop0) == VEC_CONCAT
&& GET_CODE (XEXP (trueop0, 0)) == VEC_CONCAT
&& GET_MODE (XEXP (trueop0, 0)) == mode
&& GET_CODE (XEXP (trueop0, 1)) == VEC_CONCAT
&& GET_MODE (XEXP (trueop0, 1)) == mode)
{
unsigned int i0 = INTVAL (XVECEXP (trueop1, 0, 0));
unsigned int i1 = INTVAL (XVECEXP (trueop1, 0, 1));
rtx subop0, subop1;
gcc_assert (i0 < 4 && i1 < 4);
subop0 = XEXP (XEXP (trueop0, i0 / 2), i0 % 2);
subop1 = XEXP (XEXP (trueop0, i1 / 2), i1 % 2);
return simplify_gen_binary (VEC_CONCAT, mode, subop0, subop1);
}
}
if (XVECLEN (trueop1, 0) == 1

View File

@ -1,3 +1,7 @@
2012-05-30 Marc Glisse <marc.glisse@inria.fr>
* gcc.target/i386/shuf-concat.c: New test.
2012-05-30 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/53519

View File

@ -0,0 +1,13 @@
/* { dg-do compile } */
/* { dg-options "-O -msse2 -mfpmath=sse" } */
typedef double v2df __attribute__ ((__vector_size__ (16)));
v2df f(double d,double e){
v2df x={-d,d};
v2df y={-e,e};
return __builtin_ia32_shufpd(x,y,1);
}
/* { dg-final { scan-assembler-not "\tv?shufpd\[ \t\]" } } */
/* { dg-final { scan-assembler-times "\tv?unpcklpd\[ \t\]" 1 } } */