On 17/11/16 17:45, Segher Boessenkool wrote:
On Thu, Nov 17, 2016 at 04:50:46PM +0000, Kyrill Tkachov wrote:
Is loading/storing a pair as cheap as loading/storing a single register?
In that case you could shrink-wrap per pair of registers instead.
I suppose it can vary by microarchitecture. For the purposes of codegen
I'd say
it's more expensive than load/storing a single register (as there's more
memory bandwidth required after all)
but cheaper than two separate loads stores (alignment quirks
notwithstanding).
Interesting idea. That could help with code size too. I'll try it out.
I'm encountering some difficulties implementing this idea.
I want to still keep the per-register structures across the hooks but
basically restrict the number
of components in a basic block to an even number of FPRs and GPRs. I tried
doing this in COMPONENTS_FOR_BB
So your COMPONENTS_FOR_BB returns both components in a pair whenever one
of those is needed?  That should work afaics.


I mean I still want to have one component per register and since
emit_{prologue,epilogue}_components knows how to form pairs from the
components passed down to it I just need to restrict the number of
components in any particular basic block to an even number.
So say a function can wrap 5 registers: x22,x23,x24,x25,x26.
I want get_separate_components to return 5 components since in that hook
we don't know how these registers are distributed across each basic block.
components_for_bb has that information.
In components_for_bb I want to restrict the components for a basic block to
an even number, so if normally all 5 registers would be valid for wrapping
in that bb I'd only choose 4 so I could form 2 pairs. But selecting only 4
of the 5 registers, say only x22,x23,x24,x25 leads to x26 not being saved
or restored at all, even during the normal prologue and epilogue because
x26 was marked as a component in components_for_bb and therefore omitted from
the prologue and epilogue.
So I'm thinking x26 should be removed from the wrappable components of
a basic block by disqualify_components. I'm trying that approach now.

Thanks,
Kyrill

but apparently this ended up not saving/restoring some of the registers at
all because the components that were
"filtered out" that way still made their way to the bitmap passed into
SET_HANDLED_COMPONENTS and so the normal
prologue/epilogue didn't end up saving and restoring them.
I am not sure what this means?  "filtered out"?


Segher

Reply via email to