Hi!
On Thu, Nov 14, 2019 at 06:09:09PM -0500, Michael Meissner wrote:
> In this case, the current code re-uses the temporary for calculating the
> offset
> of the element to load up the address of the vector, losing the offset.
Reusing the same pseudo is *always* a bad idea. You get better
optimisation if most code is "SSA-like": write to every pseudo only
once. Of course you need to violate this where you woule have PHIs in
actual SSA.
> I needed to add a new constraint (em) in addition to new predicate functions.
> I discovered that with the predicate function alone, the register allocator
> would re-create the address. The constraint prevents this combination.
It's a reasonable thing to have as a contraint, too.
Once again, how should things work in inline assembler? Can we allow
prefixed addressing there, or should "m" in inline asm mean "em"?
> I also modified the vector extract code to generate a single PC-relative load
> if the vector has a PC-relative address and the offset is constant.
That should be handled by the RTL optimisers anyway, no? Or is this
for post-reload splitters (a bad idea always).
> * config/rs6000/rs6000.c (rs6000_adjust_vec_address): Add support
> for optimizing extracting a constant vector element from a vector
> that uses a prefixed address. If the element number is variable
> and the address uses a prefixed address, abort.
It doesn't abort. Erm, wait, it *does* ICE. Please make that more
prominent (in the code). It's not clear why you mention it in the
changelog while allt he other details are just "add support"?
I find the control flow very hard to read here.
> + /* Optimize PC-relative addresses with a constant offset. */
> + else if (pcrel_p && CONST_INT_P (element_offset))
> + {
> + rtx addr2 = addr;
addr isn't used after this anyway, so you can clobber it just fine.
> + /* With only one temporary base register, we can't support a PC-relative
> + address added to a variable offset. This is because the PADDI
> instruction
> + requires RA to be 0 when doing a PC-relative add (i.e. no register to
> add
> + to). */
> + else if (pcrel_p)
> + gcc_unreachable ();
That comment suggests we just ICE when we get unwanted input. Such a
comment belongs where we prevent such code from being formed in the
first place (or nowhere, if it is obvious).
Segher