On Tue, Jul 02, 2019 at 07:36:21PM -0400, Michael Meissner wrote:
> On Mon, Jul 01, 2019 at 04:27:05PM -0500, Segher Boessenkool wrote:
> > The entry before the 8 is split as well.  Maybe that should be "4", to
> > stand out?  I don't know what works better; your choice.
> 
> I'll look into it.  Note, the length is used in two places.  One at the end to
> generate the appropriate branches, but the other is in rs6000_insn_cost inside
> rs6000.c.

We'll need to update our insn_cost for prefixed, sure, it currently does
  int n = get_attr_length (insn) / 4;
to figure out how many machine instructions a pattern is, and then uses
"n" differently for the different types of insn.  We'll need to refine
this a bit for prefixed instructions.

> This occurs before the final passes, so it is important that even
> though the insn will be split, that the length is still set.  However, things
> are rather inconsistant, in that sometimes the length field is accurate, and
> sometimes not.

It *has* to be correct; it is allowed to be pessimistic though.  This
is used to determine if a B-form branch can reach, for example.  You get
ICEs if it isn't correct.  Only on very few testcases, of course :-(

> I'm finding that the rs6000_insn_cost issue really muddies things up,
> particularly if a vector load/store insn is done in gpr registers, where it 
> can
> be 4 insns.

Yeah, it doesn't handle vectors specially *at all* currently, not even
for FP in vectors.  It is pretty much just a switch over the "type", and
for everything vector it gets to
    default:
      cost = COSTS_N_INSNS (n);
(with the above "n") which is a pretty coarse approximation to the truth ;-)

You could try #undef'ing TARGET_INSN_COST (in rs6000.c) for now, and hope
that rs6000_rtx_costs does better for what you need right now.  In the end
it will have to be fixed properly, insn_cost is quite important.


Segher

Reply via email to