This message describes the arrangement of the patches on the SVE branch.
We've tried to make them fit a plausible submission order, with each
patch having its own covering note and rationale (but no changelog :-)).
They should also be bisect-friendly.
The patches break down into the following broad stages:
A. General fixes
These patches fix bugs or accidental missed optimisations that aren’t
directly related to SVE. Usually the changes were done as part of
general SVE work and it only became clear later that they were fixing
real rather than theoretical problems.
The baseline is a couple of weeks old now and at least one these
issues has already been fixed on trunk.
Patches covered:
"Move misplaced assignment in num_sign_bit_copies1"
...
"Use df_read_modify_subreg_p in cprop.c"
B. Prepare for machine mode changes
These patches fix preexisting problems that would trigger an ICE with
the patches from stage C. They don’t appear to have any independent
effect on code generation.
Patches covered:
"Add more subreg offset helpers"
...
"Set mode of decimal floats before calling layout_type"
C. Rework the handling of machine modes
These patches add wrapper classes around the machine_mode enum for
situations in which the mode has known properties, as described in
the earlier message about variable mode sizes.
Patches covered:
"Add an E_ prefix to mode names and update case statements"
...
"Widening optab cleanup"
D. Prepare for the introduction of polynomial integers
These patches fix various problems that would cause build failures
with the patches from stage F. They also rework interfaces to make F
possible, including partial conversions of some macros to target hooks.
Patches covered:
"Add a full_integral_type_p helper function"
...
"Pass slp_index down to vect_analyze_stmt"
E. Add new tree and rtl constructs for representing variable-length vectors
These patches add a tree VEC_DUPLICATE_EXPR to go alongside the
existing rtl code VEC_DUPLICATE. They also add codes for creating
linear series and allow both duplicate and series constants to be
treated as gimple values.
Patches covered:
"Add rtx const vec_duplicate helpers"
...
"Treat VEC_{DUPLICATE,SERIES}_EXPR as gimple constants"
F. Add and use a "polynomial integer" class
These patches add a class to represent integers of the form C0 + C1*X1
+ ... + Cn*Xn, where each Ci is a compile-time constant and each
indeterminate Xi is a runtime parameter. See the earlier message
about variable mode sizes for more details.
Patches covered:
"Add poly-int.h"
...
"Use poly_int rtx accessors instead of hwi accessors"
G. Tweak the subreg rules
These patches divide SUBREG_REGs into REMODE_NATURAL_SIZE-sized
independently-addressable chunks rather than UNITS_PER_WORD-sized
independently-addressable chunks. This is a no-op for most targets
since the default value of REGMODE_NATURAL_SIZE is UNITS_PER_WORD.
The only existing target to override it is 64-bit SPARC, where this
appears to be a very minor improvement.
Patches covered:
"Base subreg rules on REGMODE_NATURAL_SIZE rather than UNITS_PER_WORD"
"Prevent invalid register mode changes in combine"
H. Prepare for the SVE port
These patches make various changes needed before a working SVE port
can be added. They subdivide into target-independent changes and
AArch64-specific changes.
Patches covered:
"Fix type of bitstart in vectorizable_live_operation"
...
"Improve vector mask pattern handling"
"[AArch64] Move code around"
...
"[AArch64] Tighten address register subreg checks"
I. Add the core SVE port
This stage contains a single patch that adds the core SVE port.
It supports existing vectorisation techniques with variable-length
vectors, with some restrictions.
Patch covered:
"[AArch64] Add SVE support"
J. Add additional SVE support
These patches add support for new vectorisation features and improve
the quality of the code produced for SVE in other areas (mainly ivopts).
Patches covered:
"Fix folding of vector mask EQ/NE expressions"
...
"vect.exp testsuite changes for SVE"
I compiled the GCC testsuite on at least one target per CPU architecture
to check that there were no accidental changes in assembly code between the
end of A (which is expected to change code generation) and the end of G.
Thanks,
Richard