Commit c99102b8 by Bernd Schmidt Committed by Bernd Schmidt

re PR target/40697 (inefficient code to extract least bits from an integer value)

gcc/
	PR target/40697
	* optabs.c (avoid_expensive_constant): Use rtx_cost to find out
	the cost of loading the constant rather than assuming
	COSTS_N_INSNS (1).
	* config/arm/arm.c (thumb1_rtx_costs) <case CONST_INT>: If the
	outer code is AND, do the same tests as the andsi3 expander and
	return COSTS_N_INSNS (1) if and is cheap.

testsuite/
	PR target/40697
	* gcc.target/arm/thumb-andsi.c: New test.

From-SVN: r157582
parent 002b2dee
......@@ -4,6 +4,14 @@
* ira-lives.c (check_and_make_def_conflict): Ignore conflict for a
use that may match DEF.
PR target/40697
* optabs.c (avoid_expensive_constant): Use rtx_cost to find out
the cost of loading the constant rather than assuming
COSTS_N_INSNS (1).
* config/arm/arm.c (thumb1_rtx_costs) <case CONST_INT>: If the
outer code is AND, do the same tests as the andsi3 expander and
return COSTS_N_INSNS (1) if and is cheap.
2010-03-19 Michael Matz <matz@suse.de>
PR c++/43116
......
......@@ -6228,6 +6228,15 @@ thumb1_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer)
else if ((outer == IOR || outer == XOR || outer == AND)
&& INTVAL (x) < 256 && INTVAL (x) >= -256)
return COSTS_N_INSNS (1);
else if (outer == AND)
{
int i;
/* This duplicates the tests in the andsi3 expander. */
for (i = 9; i <= 31; i++)
if ((((HOST_WIDE_INT) 1) << i) - 1 == INTVAL (x)
|| (((HOST_WIDE_INT) 1) << i) - 1 == ~INTVAL (x))
return COSTS_N_INSNS (2);
}
else if (outer == ASHIFT || outer == ASHIFTRT
|| outer == LSHIFTRT)
return 0;
......
......@@ -1389,11 +1389,11 @@ static rtx
avoid_expensive_constant (enum machine_mode mode, optab binoptab,
rtx x, bool unsignedp)
{
bool speed = optimize_insn_for_speed_p ();
if (mode != VOIDmode
&& optimize
&& CONSTANT_P (x)
&& rtx_cost (x, binoptab->code, optimize_insn_for_speed_p ())
> COSTS_N_INSNS (1))
&& rtx_cost (x, binoptab->code, speed) > rtx_cost (x, SET, speed))
{
if (CONST_INT_P (x))
{
......
......@@ -2,7 +2,10 @@
PR rtl-optimization/42258
* gcc.target/arm/thumb1-mul-moves.c: New test.
PR target/40697
* gcc.target/arm/thumb-andsi.c: New test.
2010-03-19 Michael Matz <matz@suse.de>
PR c++/43116
......
/* { dg-do compile } */
/* { dg-options "-Os -mthumb -march=armv5te" } */
unsigned get_least_bits(unsigned value)
{
return value << 9 >> 9;
}
/* { dg-final { scan-assembler "lsl" } } */
/* { dg-final { scan-assembler "lsr" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment