This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Combine simplify_set WORD_REGISTER_OPERATIONS
- From: Alan Modra <amodra at gmail dot com>
- To: Jeff Law <law at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org, Segher Boessenkool <segher at kernel dot crashing dot org>
- Date: Tue, 9 Feb 2016 21:47:54 +1030
- Subject: Re: Combine simplify_set WORD_REGISTER_OPERATIONS
- Authentication-results: sourceware.org; auth=none
- References: <20160131221641 dot GV17028 at bubble dot grove dot modra dot org> <56B8C1F8 dot 2050109 at redhat dot com>
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