Daniel Jacobowitz <d...@codesourcery.com> writes:
> On Wed, Feb 03, 2010 at 06:23:19AM -0800, Ian Lance Taylor wrote:
>> fanqifei <fanqi...@gmail.com> writes:
>> 
>> > According to the internal manual, insn length attribute can be used to
>> > to calculate the length of emitted code chunks when verifying branch
>> > distances.
>> > Can it be used in code size optimization?
>> 
>> I suppose it could, but it isn't.  Instead of asking the backend for
>> the length of instructions, the compiler asks the backend for the cost
>> of instructions.  The backend is free to determine that cost however
>> it likes.  When using -Os, using the size of the instruction is a good
>> measure of cost.
>
> It seems to me that there's a hard ordering problem here: we can't
> determine insn lengths, using the current framework, until very late.
> We need at least (A) whole instructions, not just RTL expressions; (B)
> register allocation to select alternatives; (C) branch shortening to
> determine branch alternatives.
>
> I'm curious if anyone thinks there's a generic solution to this (that
> doesn't involve a complete instruction selection rewrite :-).

Yeah, it's something I've often wanted too, since at the moment you end
up duplicating a lot of the instruction selection in C code.  E.g. the
MIPS port has stuff like:

      if (float_mode_p
          && (ISA_HAS_NMADD4_NMSUB4 (mode) || ISA_HAS_NMADD3_NMSUB3 (mode))
          && TARGET_FUSED_MADD
          && !HONOR_NANS (mode)
          && !HONOR_SIGNED_ZEROS (mode))
        {
          /* See if we can use NMADD or NMSUB.  See mips.md for the
             associated patterns.  */
          rtx op0 = XEXP (x, 0);
          rtx op1 = XEXP (x, 1);
          if (GET_CODE (op0) == MULT && GET_CODE (XEXP (op0, 0)) == NEG)
            {
              *total = (mips_fp_mult_cost (mode)
                        + rtx_cost (XEXP (XEXP (op0, 0), 0), SET, speed)
                        + rtx_cost (XEXP (op0, 1), SET, speed)
                        + rtx_cost (op1, SET, speed));
              return true;
            }
          if (GET_CODE (op1) == MULT)
            {
              *total = (mips_fp_mult_cost (mode)
                        + rtx_cost (op0, SET, speed)
                        + rtx_cost (XEXP (op1, 0), SET, speed)
                        + rtx_cost (XEXP (op1, 1), SET, speed));
              return true;
            }
        }

Ugh!

But I could never see a cure that was better than the disease without
(as you say) a rewrite.  I think (A) is the main problem: we already
have code to estimate constraints selection before reload, so we could
at least guess at (B) and (C).  (Which is what the costs have to do
anyway really.)

Richard

Reply via email to