Jeff Law wrote:
> On 11/11/13 07:32, Ulrich Weigand wrote:
> > However, looking more closely, it seems 
> > store_unaligned_arguments_into_pseudos
> > is not really useful for PARALLEL arguments in the first place.  What this
> > routine does is load arguments into args[i].aligned_regs.  But if we have
> > an argument where args[i].reg is a PARALLEL, args[i].aligned_regs will in
> > fact never be used later on at all!   Instead, PARALLEL will always be
> > handled directly via emit_group_move (in load_register_parameters), so
> > the code generated by store_unaligned_arguments_into_pseudos for such cases
> > is simply dead anyway.

> Does this work on the PA, particularly the 32bit ABI?
>           /* Structures 5 to 8 bytes in size are passed in the general
>               registers in the same manner as other non floating-point
>               objects.  The data is right-justified and zero-extended
>               to 64 bits.  This is opposite to the normal justification
>               used on big endian targets and requires special treatment.
>               We now define BLOCK_REG_PADDING to pad these objects.
>               Aggregates, complex and vector types are passed in the same
>               manner as structures.  */

It seems this is exactly one of the cases I mention above, where current
code generates code to load up "aligned registers" which are then never
used again.

I'm not really set up to test PA, but I built a cross to hppa-linux,
and compiled this simple test passing a 5-byte struct:

struct test { char x[5]; };

struct test x;
void func (struct test);

void caller (void)
{
  func (x);
}

And indeed with my patch, I'm getting a lot less code at -O0.  However,
building with -O2 both with and without my patch, the resulting assembler
files are identical again -- which appears to confirm that this extra
code is in fact dead ...

Bye,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU/Linux compilers and toolchain
  ulrich.weig...@de.ibm.com

Reply via email to