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