This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Base subreg rules on REGMODE_NATURAL_SIZE rather than UNITS_PER_WORD
- From: Jeff Law <law at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org, richard dot sandiford at linaro dot org
- Date: Fri, 13 Oct 2017 12:49:27 -0600
- Subject: Re: Base subreg rules on REGMODE_NATURAL_SIZE rather than UNITS_PER_WORD
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=law at redhat dot com
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3D3F8806B4
- References: <87fubkgscq.fsf@linaro.org>
On 09/18/2017 05:26 AM, Richard Sandiford wrote:
> Originally subregs operated at the word level and subreg offsets
> were measured in words. The offset units were later changed from
> words to bytes (SUBREG_WORD became SUBREG_BYTE), but the fundamental
> assumption that subregs should operate at the word level remained.
> Whether (subreg:M1 (reg:M2 R2) N) is well-formed depended on the
> way that M1 and M2 partitioned into words and whether the subword
> part of N represented a lowpart. However, some questions depended
> instead on the macro REGMODE_NATURAL_SIZE, which was introduced
> as part of the patch that moved from SUBREG_WORD to SUBREG_BYTE.
> It is used to decide whether setting (subreg:M1 (reg:M2 R2) N)
> clobbers all of R2 or just part of it (df_read_modify_subreg).
>
> Using words doesn't really make sense for modern vector
> architectures. Vector registers are usually bigger than
> a word and:
>
> (a) setting the scalar lowpart of them usually clobbers the
> rest of the register (contrary to the subreg rules,
> where only the containing words should be clobbered).
>
> (b) high words of vector registers are often not independently
> addressable, even though that's what the subreg rules expect.
>
> This patch therefore uses REGMODE_NATURAL_SIZE instead of
> UNITS_PER_WORD to determine the size of the independently
> addressable blocks in an inner register.
>
> This is needed for SVE because the number of words in a vector
> mode isn't known at compile time, so isn't a sensible basis
> for calculating the number of registers.
>
> The only existing port to define REGMODE_NATURAL_SIZE is
> 64-bit SPARC, where FP registers are 32 bits. (This is the
> opposite of the use case for SVE, since the natural division
> is smaller than a word.) I compiled the testsuite before and
> after the patch for sparc64-linux-gnu and the only test whose
> assembly changed was g++.dg/debug/pr65678.C, where the order
> of two independent stores was reversed and where a different
> register was picked for one pseudo. The new code was
> otherwise equivalent to the old code.
>
> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu.
> Also tested by comparing the testsuite assembly output on at least one
> target per CPU directory, with only the SPARC differences just mentioned.
> OK to install?
>
> Richard
>
>
> 2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
> Alan Hayward <alan.hayward@arm.com>
> David Sherwood <david.sherwood@arm.com>
>
> gcc/
> * doc/rtl.texi: Rewrite the subreg rules so that they partition
> the inner register into REGMODE_NATURAL_SIZE bytes rather than
> UNITS_PER_WORD bytes.
> * emit-rtl.c (validate_subreg): Divide subregs into blocks
> based on REGMODE_NATURAL_SIZE of the inner mode.
> (gen_lowpart_common): Split the SCALAR_FLOAT_MODE_P and
> !SCALAR_FLOAT_MODE_P cases. Use REGMODE_NATURAL_SIZE for the latter.
> * expr.c (store_constructor): Use REGMODE_NATURAL_SIZE to test
> whether something is likely to occupy more than one register.
OK. Though I must admit, I expected a larger change after reading the
intro.
jeff