re PR target/70799 (STV pass does not convert DImode shifts)
PR target/70799 * config/i386/i386.c (dimode_scalar_to_vector_candidate_p): Handle ASHIFT and LSHIFTRT. (dimode_scalar_chain::compute_convert_gain): Ditto. (dimode_scalar_chain::convert_insn): Ditto. testsuite/ChangeLog: PR target/70799 * gcc.target/i386/pr70799-2.c: New test. From-SVN: r241974
This commit is contained in:
parent
eba5aec8e3
commit
90a2ffc01a
@ -1,3 +1,11 @@
|
|||||||
|
2016-11-08 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR target/70799
|
||||||
|
* config/i386/i386.c (dimode_scalar_to_vector_candidate_p):
|
||||||
|
Handle ASHIFT and LSHIFTRT.
|
||||||
|
(dimode_scalar_chain::compute_convert_gain): Ditto.
|
||||||
|
(dimode_scalar_chain::convert_insn): Ditto.
|
||||||
|
|
||||||
2016-11-08 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
2016-11-08 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
|
||||||
|
|
||||||
* gimple-ssa-store-merging.c: Include selftest.h
|
* gimple-ssa-store-merging.c: Include selftest.h
|
||||||
|
@ -2805,11 +2805,24 @@ dimode_scalar_to_vector_candidate_p (rtx_insn *insn)
|
|||||||
|
|
||||||
switch (GET_CODE (src))
|
switch (GET_CODE (src))
|
||||||
{
|
{
|
||||||
|
case ASHIFT:
|
||||||
|
case LSHIFTRT:
|
||||||
|
/* Consider only non-variable shifts narrower
|
||||||
|
than general register width. */
|
||||||
|
if (!(CONST_INT_P (XEXP (src, 1))
|
||||||
|
&& IN_RANGE (INTVAL (XEXP (src, 1)), 0, 31)))
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
|
||||||
case PLUS:
|
case PLUS:
|
||||||
case MINUS:
|
case MINUS:
|
||||||
case IOR:
|
case IOR:
|
||||||
case XOR:
|
case XOR:
|
||||||
case AND:
|
case AND:
|
||||||
|
if (!REG_P (XEXP (src, 1))
|
||||||
|
&& !MEM_P (XEXP (src, 1))
|
||||||
|
&& !CONST_INT_P (XEXP (src, 1)))
|
||||||
|
return false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REG:
|
case REG:
|
||||||
@ -2832,11 +2845,6 @@ dimode_scalar_to_vector_candidate_p (rtx_insn *insn)
|
|||||||
|| !REG_P (XEXP (XEXP (src, 0), 0))))
|
|| !REG_P (XEXP (XEXP (src, 0), 0))))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!REG_P (XEXP (src, 1))
|
|
||||||
&& !MEM_P (XEXP (src, 1))
|
|
||||||
&& !CONST_INT_P (XEXP (src, 1)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ((GET_MODE (XEXP (src, 0)) != DImode
|
if ((GET_MODE (XEXP (src, 0)) != DImode
|
||||||
&& !CONST_INT_P (XEXP (src, 0)))
|
&& !CONST_INT_P (XEXP (src, 0)))
|
||||||
|| (GET_MODE (XEXP (src, 1)) != DImode
|
|| (GET_MODE (XEXP (src, 1)) != DImode
|
||||||
@ -3387,6 +3395,13 @@ dimode_scalar_chain::compute_convert_gain ()
|
|||||||
gain += 2 * ix86_cost->int_store[2] - ix86_cost->sse_store[1];
|
gain += 2 * ix86_cost->int_store[2] - ix86_cost->sse_store[1];
|
||||||
else if (MEM_P (src) && REG_P (dst))
|
else if (MEM_P (src) && REG_P (dst))
|
||||||
gain += 2 * ix86_cost->int_load[2] - ix86_cost->sse_load[1];
|
gain += 2 * ix86_cost->int_load[2] - ix86_cost->sse_load[1];
|
||||||
|
else if (GET_CODE (src) == ASHIFT
|
||||||
|
|| GET_CODE (src) == LSHIFTRT)
|
||||||
|
{
|
||||||
|
gain += ix86_cost->add;
|
||||||
|
if (CONST_INT_P (XEXP (src, 0)))
|
||||||
|
gain -= vector_const_cost (XEXP (src, 0));
|
||||||
|
}
|
||||||
else if (GET_CODE (src) == PLUS
|
else if (GET_CODE (src) == PLUS
|
||||||
|| GET_CODE (src) == MINUS
|
|| GET_CODE (src) == MINUS
|
||||||
|| GET_CODE (src) == IOR
|
|| GET_CODE (src) == IOR
|
||||||
@ -3738,6 +3753,12 @@ dimode_scalar_chain::convert_insn (rtx_insn *insn)
|
|||||||
|
|
||||||
switch (GET_CODE (src))
|
switch (GET_CODE (src))
|
||||||
{
|
{
|
||||||
|
case ASHIFT:
|
||||||
|
case LSHIFTRT:
|
||||||
|
convert_op (&XEXP (src, 0), insn);
|
||||||
|
PUT_MODE (src, V2DImode);
|
||||||
|
break;
|
||||||
|
|
||||||
case PLUS:
|
case PLUS:
|
||||||
case MINUS:
|
case MINUS:
|
||||||
case IOR:
|
case IOR:
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2016-11-08 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR target/70799
|
||||||
|
* gcc.target/i386/pr70799-2.c: New test.
|
||||||
|
|
||||||
2016-11-08 Janus Weil <janus@gcc.gnu.org>
|
2016-11-08 Janus Weil <janus@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/77596
|
PR fortran/77596
|
||||||
|
17
gcc/testsuite/gcc.target/i386/pr70799-2.c
Normal file
17
gcc/testsuite/gcc.target/i386/pr70799-2.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/* PR target/pr70799 */
|
||||||
|
/* { dg-do compile { target { ia32 } } } */
|
||||||
|
/* { dg-options "-O2 -march=slm -mno-stackrealign" } */
|
||||||
|
/* { dg-final { scan-assembler "psllq" } } */
|
||||||
|
/* { dg-final { scan-assembler "psrlq" } } */
|
||||||
|
|
||||||
|
unsigned long long a, b;
|
||||||
|
|
||||||
|
void test1 (void)
|
||||||
|
{
|
||||||
|
a = b << 21;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test2 (void)
|
||||||
|
{
|
||||||
|
a = b >> 21;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user