On Mon, Feb 08, 2016 at 09:27:36AM -0700, Jeff Law wrote: > On 01/31/2016 03:16 PM, Alan Modra wrote: > >The comment says this test is supposed to prevent "a narrower > >operation than requested", but it actually only allows a larger > >subreg, not one the same size. Fix that. > > > >Bootstrapped and regression tested powerpc64-linux. OK for stage1? > > > >Note that this bug was found when investigating why gcc-6 does not > >suffer from pr69548, ie. this bug was masking a powerpc backend bug. > > > > * combine.c (simplify_set): Correct WORD_REGISTER_OPERATIONS test. > > Is there a strong need to apply this to gcc6?
No, better to wait for gcc-7, I think. > Can we construct a testcase > where this makes a difference in the code we generate? I instrumented the combine.c code in question with this if (!WORD_REGISTER_OPERATIONS && (GET_MODE_SIZE (GET_MODE (src)) == GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))) { FILE *f = fopen ("/tmp/alan", "a"); fprintf (f, "%s\n", main_input_filename); print_inline_rtx (f, src, 0); fprintf (f, "\n"); fclose (f); } to see what popped out when bootstrapping gcc on x86_64. There were quite a lot of hits, DI -> DF, SI -> SF, V4SF -> TI etc, especially in the testsuite (I should have dumped options too).. Here's the first one: /src/gcc.git/libgcc/config/libbid/bid64_div.c (subreg:DF (plus:DI (subreg:DI (reg:DF 841) 0) (const_int 1 [0x1])) 0) This one resulted in using lea vs. add, so slightly better code. One from the testsuite: /src/gcc.git/gcc/testsuite/gcc.dg/sso/p4.c (subreg:SF (bswap:SI (reg:SI 99 [ Local_R2.F ])) 0) When compiling with -Og, this showed before after .loc 3 49 0 .loc 3 49 0 movl -32(%ebp), %eax movl -32(%ebp), %eax bswap %eax bswap %eax movl %eax, -44(%ebp) movl %eax, -28(%ebp) flds -44(%ebp) fstps -28(%ebp) Quite an improvement, if you care about -Og code. I didn't see any worse code, except some cases that I think were caused by register allocation differences. > My inclination would be to approve for gcc-7 as-is, but I'm more hesitant > for gcc-6. > > jeff -- Alan Modra Australia Development Lab, IBM