The CRIS port no longer emits an addi insn for (a << N) + b, where N = {1, 2}.
Trivial test-case:
/* Make sure ADDI is combined and emitted successfully.
   See also PRXXXXX.  */
/* { dg-do compile } */
/* { dg-options "-O2" } */
/* { dg-final { scan-assembler "addi" } } */
/* { dg-final { scan-assembler-not "lsl" } } */

int xyzzy (int r10, int r11)
{
  return r11 * 4 + r10;
}

This insn was created and emitted for e.g. 3.2.1
A look at the combine dump shows that the cost for the individual insns is 5
for the shift (the constant counts as 1 as per cris_rtx_costs) and 4 for the
add.  However, the combined cost is 10, also as per cris_rtx_costs, because the
insn is (perhaps wrongly) specified as (plus (mult 4 reg1) reg2) and the MULT
cost is 6 as per cris_rtx_costs and the PLUS counts as 4.
The way the target address cost function is called has changed, and
cris_address_cost needs adjustment.  Actually, it needs a rewrite, but an
adjustment will do for the 4.3 and 4.4/trunk, being in stage 3.
Patch in progress.


-- 
           Summary: [4.2/4.3/4.4 Regression] CRIS port: no addi insn
           Product: gcc
           Version: 4.3.3
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: hp at gcc dot gnu dot org
  GCC host triplet: x86_64-unknown-linux-gnu
GCC target triplet: cris-*-* and crisv32-*-*


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37939

Reply via email to