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