OSDN Git Service

gcc/
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Mar 2010 18:41:22 +0000 (18:41 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 19 Mar 2010 18:41:22 +0000 (18:41 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157582 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/optabs.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/thumb-andsi.c [new file with mode: 0644]

index bdc8dae..7afdbac 100644 (file)
@@ -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
index 870e56e..cc023c1 100644 (file)
@@ -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;
index 747166b..a82619e 100644 (file)
@@ -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))
        {
index a13e712..6c7e19c 100644 (file)
@@ -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
diff --git a/gcc/testsuite/gcc.target/arm/thumb-andsi.c b/gcc/testsuite/gcc.target/arm/thumb-andsi.c
new file mode 100644 (file)
index 0000000..9e8e4d4
--- /dev/null
@@ -0,0 +1,10 @@
+/* { 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" } } */