re PR target/37939 (CRIS port: no addi insn)
authorHans-Peter Nilsson <hp@axis.com>
Sat, 1 Nov 2008 22:16:09 +0000 (22:16 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Sat, 1 Nov 2008 22:16:09 +0000 (22:16 +0000)
PR target/37939
* config/cris/cris.c (cris_rtx_costs) <MULT>: Return 0 for an ADDI
operand.

From-SVN: r141524

gcc/ChangeLog
gcc/config/cris/cris.c

index b811061..9e558d3 100644 (file)
@@ -1,3 +1,9 @@
+2008-11-01  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR target/37939
+       * config/cris/cris.c (cris_rtx_costs) <MULT>: Return 0 for an ADDI
+       operand.
+
 2008-11-01  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/37976
index 1d0a34b..88d8999 100644 (file)
@@ -1796,6 +1796,21 @@ cris_rtx_costs (rtx x, int code, int outer_code, int *total,
       return true;
 
     case MULT:
+      /* If we have one arm of an ADDI, make sure it gets the cost of
+        one insn, i.e. zero cost for this operand, and just the cost
+        of the PLUS, as the insn is created by combine from a PLUS
+        and an ASHIFT, and the MULT cost below would make the
+        combined value be larger than the separate insns.  The insn
+        validity is checked elsewhere by combine.
+
+        FIXME: this case is a stop-gap for 4.3 and 4.4, this whole
+        function should be rewritten.  */
+      if (outer_code == PLUS && BIAP_INDEX_P (x))
+       {
+         *total = 0;
+         return true;
+       }
+
       /* Identify values that are no powers of two.  Powers of 2 are
          taken care of already and those values should not be changed.  */
       if (!CONST_INT_P (XEXP (x, 1))