mirror of git://gcc.gnu.org/git/gcc.git
re PR rtl-optimization/65078 (4.9 and 5.0 generate more spill-fill in comparison with 4.8.2)
PR target/65078 * config/i386/sse.md (movsi/movdi -> vec_extract_*_0 splitter): New. * gcc.target/i386/pr65078-1.c: New test. * gcc.target/i386/pr65078-2.c: New test. * gcc.target/i386/pr65078-3.c: New test. * gcc.target/i386/pr65078-4.c: New test. * gcc.target/i386/pr65078-5.c: New test. * gcc.target/i386/pr65078-6.c: New test. From-SVN: r221485
This commit is contained in:
parent
5e0216f173
commit
fbf524de7b
|
|
@ -1,3 +1,8 @@
|
||||||
|
2015-03-18 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR target/65078
|
||||||
|
* config/i386/sse.md (movsi/movdi -> vec_extract_*_0 splitter): New.
|
||||||
|
|
||||||
2015-03-16 Georg-Johann Lay <avr@gjlay.de>
|
2015-03-16 Georg-Johann Lay <avr@gjlay.de>
|
||||||
|
|
||||||
PR target/65296
|
PR target/65296
|
||||||
|
|
|
||||||
|
|
@ -12805,6 +12805,65 @@
|
||||||
operands[1] = adjust_address (operands[1], <ssescalarmode>mode, offs);
|
operands[1] = adjust_address (operands[1], <ssescalarmode>mode, offs);
|
||||||
})
|
})
|
||||||
|
|
||||||
|
;; Turn SImode or DImode extraction from arbitrary SSE/AVX/AVX512F
|
||||||
|
;; vector modes into vec_extract*.
|
||||||
|
(define_split
|
||||||
|
[(set (match_operand:SWI48x 0 "nonimmediate_operand")
|
||||||
|
(match_operand:SWI48x 1 "register_operand"))]
|
||||||
|
"can_create_pseudo_p ()
|
||||||
|
&& GET_CODE (operands[1]) == SUBREG
|
||||||
|
&& REG_P (SUBREG_REG (operands[1]))
|
||||||
|
&& (GET_MODE_CLASS (GET_MODE (SUBREG_REG (operands[1]))) == MODE_VECTOR_INT
|
||||||
|
|| (GET_MODE_CLASS (GET_MODE (SUBREG_REG (operands[1])))
|
||||||
|
== MODE_VECTOR_FLOAT))
|
||||||
|
&& SUBREG_BYTE (operands[1]) == 0
|
||||||
|
&& TARGET_SSE
|
||||||
|
&& (GET_MODE_SIZE (GET_MODE (SUBREG_REG (operands[1]))) == 16
|
||||||
|
|| (GET_MODE_SIZE (GET_MODE (SUBREG_REG (operands[1]))) == 32
|
||||||
|
&& TARGET_AVX)
|
||||||
|
|| (GET_MODE_SIZE (GET_MODE (SUBREG_REG (operands[1]))) == 64
|
||||||
|
&& TARGET_AVX512F))
|
||||||
|
&& (<MODE>mode == SImode || TARGET_64BIT || MEM_P (operands[0]))"
|
||||||
|
[(set (match_dup 0) (vec_select:SWI48x (match_dup 1)
|
||||||
|
(parallel [(const_int 0)])))]
|
||||||
|
{
|
||||||
|
rtx tmp;
|
||||||
|
operands[1] = SUBREG_REG (operands[1]);
|
||||||
|
switch (GET_MODE_SIZE (GET_MODE (operands[1])))
|
||||||
|
{
|
||||||
|
case 64:
|
||||||
|
if (<MODE>mode == SImode)
|
||||||
|
{
|
||||||
|
tmp = gen_reg_rtx (V8SImode);
|
||||||
|
emit_insn (gen_vec_extract_lo_v16si (tmp,
|
||||||
|
gen_lowpart (V16SImode,
|
||||||
|
operands[1])));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmp = gen_reg_rtx (V4DImode);
|
||||||
|
emit_insn (gen_vec_extract_lo_v8di (tmp,
|
||||||
|
gen_lowpart (V8DImode,
|
||||||
|
operands[1])));
|
||||||
|
}
|
||||||
|
operands[1] = tmp;
|
||||||
|
/* FALLTHRU */
|
||||||
|
case 32:
|
||||||
|
tmp = gen_reg_rtx (<ssevecmode>mode);
|
||||||
|
if (<MODE>mode == SImode)
|
||||||
|
emit_insn (gen_vec_extract_lo_v8si (tmp, gen_lowpart (V8SImode,
|
||||||
|
operands[1])));
|
||||||
|
else
|
||||||
|
emit_insn (gen_vec_extract_lo_v4di (tmp, gen_lowpart (V4DImode,
|
||||||
|
operands[1])));
|
||||||
|
operands[1] = tmp;
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
operands[1] = gen_lowpart (<ssevecmode>mode, operands[1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
(define_insn "*vec_concatv2si_sse4_1"
|
(define_insn "*vec_concatv2si_sse4_1"
|
||||||
[(set (match_operand:V2SI 0 "register_operand" "=Yr,*x,x, Yr,*x,x, x, *y,*y")
|
[(set (match_operand:V2SI 0 "register_operand" "=Yr,*x,x, Yr,*x,x, x, *y,*y")
|
||||||
(vec_concat:V2SI
|
(vec_concat:V2SI
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,13 @@
|
||||||
|
2015-03-18 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR target/65078
|
||||||
|
* gcc.target/i386/pr65078-1.c: New test.
|
||||||
|
* gcc.target/i386/pr65078-2.c: New test.
|
||||||
|
* gcc.target/i386/pr65078-3.c: New test.
|
||||||
|
* gcc.target/i386/pr65078-4.c: New test.
|
||||||
|
* gcc.target/i386/pr65078-5.c: New test.
|
||||||
|
* gcc.target/i386/pr65078-6.c: New test.
|
||||||
|
|
||||||
2015-03-18 Paolo Carlini <paolo.carlini@oracle.com>
|
2015-03-18 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
PR c++/65340
|
PR c++/65340
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
/* PR target/65078 */
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -msse2" } */
|
||||||
|
/* { dg-additional-options "-mregparm=2" { target ia32 } } */
|
||||||
|
/* { dg-final { scan-assembler-not "\\(%\[er\]sp\\)" } } */
|
||||||
|
|
||||||
|
typedef unsigned char V __attribute__((vector_size (16)));
|
||||||
|
typedef unsigned long long W __attribute__((vector_size (16)));
|
||||||
|
typedef unsigned int T __attribute__((vector_size (16)));
|
||||||
|
|
||||||
|
void
|
||||||
|
f1 (unsigned long long *x, V y)
|
||||||
|
{
|
||||||
|
*x = ((W)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(ALL)
|
||||||
|
unsigned long long
|
||||||
|
f2 (V y)
|
||||||
|
{
|
||||||
|
return ((W)y)[0];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
f3 (unsigned int *x, V y)
|
||||||
|
{
|
||||||
|
*x = ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
f4 (V y)
|
||||||
|
{
|
||||||
|
return ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
f5 (unsigned long long *x, W y)
|
||||||
|
{
|
||||||
|
*x = ((W)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(ALL)
|
||||||
|
unsigned long long
|
||||||
|
f6 (W y)
|
||||||
|
{
|
||||||
|
return ((W)y)[0];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
f7 (unsigned int *x, T y)
|
||||||
|
{
|
||||||
|
*x = ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
f8 (T y)
|
||||||
|
{
|
||||||
|
return ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
/* PR target/65078 */
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -mavx" } */
|
||||||
|
/* { dg-additional-options "-mregparm=2" { target ia32 } } */
|
||||||
|
/* { dg-final { scan-assembler-not "\\(%\[er\]sp\\)" } } */
|
||||||
|
|
||||||
|
typedef unsigned char V __attribute__((vector_size (32)));
|
||||||
|
typedef unsigned long long W __attribute__((vector_size (32)));
|
||||||
|
typedef unsigned int T __attribute__((vector_size (32)));
|
||||||
|
|
||||||
|
void
|
||||||
|
f1 (unsigned long long *x, V y)
|
||||||
|
{
|
||||||
|
*x = ((W)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(ALL)
|
||||||
|
unsigned long long
|
||||||
|
f2 (V y)
|
||||||
|
{
|
||||||
|
return ((W)y)[0];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
f3 (unsigned int *x, V y)
|
||||||
|
{
|
||||||
|
*x = ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
f4 (V y)
|
||||||
|
{
|
||||||
|
return ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
f5 (unsigned long long *x, W y)
|
||||||
|
{
|
||||||
|
*x = ((W)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(ALL)
|
||||||
|
unsigned long long
|
||||||
|
f6 (W y)
|
||||||
|
{
|
||||||
|
return ((W)y)[0];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
f7 (unsigned int *x, T y)
|
||||||
|
{
|
||||||
|
*x = ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
f8 (T y)
|
||||||
|
{
|
||||||
|
return ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
/* PR target/65078 */
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -mavx512f" } */
|
||||||
|
/* { dg-additional-options "-mregparm=2" { target ia32 } } */
|
||||||
|
/* { dg-final { scan-assembler-not "\\(%\[er\]sp\\)" } } */
|
||||||
|
|
||||||
|
typedef unsigned char V __attribute__((vector_size (64)));
|
||||||
|
typedef unsigned long long W __attribute__((vector_size (64)));
|
||||||
|
typedef unsigned int T __attribute__((vector_size (64)));
|
||||||
|
|
||||||
|
void
|
||||||
|
f1 (unsigned long long *x, V y)
|
||||||
|
{
|
||||||
|
*x = ((W)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(ALL)
|
||||||
|
unsigned long long
|
||||||
|
f2 (V y)
|
||||||
|
{
|
||||||
|
return ((W)y)[0];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
f3 (unsigned int *x, V y)
|
||||||
|
{
|
||||||
|
*x = ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
f4 (V y)
|
||||||
|
{
|
||||||
|
return ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
f5 (unsigned long long *x, W y)
|
||||||
|
{
|
||||||
|
*x = ((W)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(ALL)
|
||||||
|
unsigned long long
|
||||||
|
f6 (W y)
|
||||||
|
{
|
||||||
|
return ((W)y)[0];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
f7 (unsigned int *x, T y)
|
||||||
|
{
|
||||||
|
*x = ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
f8 (T y)
|
||||||
|
{
|
||||||
|
return ((T)y)[0];
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
/* PR target/65078 */
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -msse -DALL" } */
|
||||||
|
|
||||||
|
#include "pr65078-1.c"
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
/* PR target/65078 */
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -mavx -DALL" } */
|
||||||
|
|
||||||
|
#include "pr65078-2.c"
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
/* PR target/65078 */
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -mavx512f -DALL" } */
|
||||||
|
|
||||||
|
#include "pr65078-3.c"
|
||||||
Loading…
Reference in New Issue