On Tue, 19 Feb 2013, Richard Sandiford wrote: > > Index: gcc.target/mips/umips-lwp-swp-2.c > > =================================================================== > > --- gcc.target/mips/umips-lwp-swp-2.c (revision 0) > > +++ gcc.target/mips/umips-lwp-swp-2.c (revision 0) > > @@ -0,0 +1,19 @@ > > +/* { dg-options "-mgp32 (-mmicromips)" } */ > > +/* { dg-skip-if "code quality test" { *-*-* } { "-O0" "-O1" "-Os" } { "" } > > } */ > > +int a[2]; > > + > > +MICROMIPS f (b) > > +{ > > + unsigned int i; > > + int *p; > > + for (p = &a[b], i = b; --i < ~0; ) > > + *--p = i * 3 + (int)a; > > + > > +} > > + > > +MICROMIPS main () > > +{ > > + a[0] = a[1] = 0; > > + f (2); > > +} > > +/* { dg-final { scan-assembler "\tswp\t\\\$3,0\\(\\\$3\\)" } }*/ > > Is this a test of the swap_p case? Thanks if so, but could you add a > comment saying where the SWP gets generated, and why the test needs > to be skipped at -O1 and -Os?
TBH, it is -Os where size really matters, so IMHO it is the -Os optimisation level where LWP/SWP should be used where possible in the first place, even if it hurts performance for some reason (and where e.g. -O2 might decide to go for individual accesses instead). Not to be meant as a show-stopper for this initial implementation, but if the optimisation does not work for LWP/SWP at -Os for some reason, then I think there's something going seriously wrong somewhere (instruction lengths set wrong for example?) which looks to me worth investigating and acting upon accordingly as the next step. I saw cases with instruction lengths set too high with our trunk just about yesterday and MIPS16 code, e.g.: .file 1 "foo.c" .section .mdebug.abi32 .previous .gnu_attribute 4, 1 .abicalls .option pic0 .text .align 2 .globl foo .set mips16 .ent foo .type foo, @function foo: .frame $sp,32,$31 # vars= 0, regs= 1/0, args= 16, gp= 8 .mask 0x80000000,-4 .fmask 0x00000000,0 save 32,$31 # 11 *mips16e_save_restore [length = 4] .set noreorder .set nomacro jal bar # 22 call_split/2 [length = 8] li $4,0 # 5 *movsi_mips16/4 [length = 4] .set macro .set reorder restore 32,$31 # 18 *mips16e_save_restore [length = 4] j $31 # 20 simple_return_internal [length = 2] .end foo .size foo, .-foo -- it looks all wrong to me except for the final J. Of course I realise where it originally comes from, but I think it would be good if the initial pessimistic estimates were actually adjusted as more is known about actual insns produced. I wonder if we may have similar issues with microMIPS instruction size calculation triggering here. Maciej