[PATCH] Fix alignment for local variable [PR90811]
Richard Biener
richard.guenther@gmail.com
Fri Mar 27 14:02:24 GMT 2020
On Fri, Mar 27, 2020 at 2:54 PM Richard Biener
<richard.guenther@gmail.com> wrote:
>
> On Fri, Mar 27, 2020 at 2:04 PM Kito Cheng <kito.cheng@sifive.com> wrote:
> >
> > Hi Richard:
> >
> > The local variable alignment adjustment was removed at this commit:
> > https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=26d7a5e690169ac04acde90070b0092c41b71c7e
Note this idn't really remove the adjustment but it delayed it until
RTL expansion.
/* Compute the byte alignment to use for DECL. Ignore alignment
we can't do with expected alignment of the stack boundary. */
static unsigned int
align_local_variable (tree decl, bool really_expand)
{
unsigned int align;
if (TREE_CODE (decl) == SSA_NAME)
align = TYPE_ALIGN (TREE_TYPE (decl));
else
{
align = LOCAL_DECL_ALIGNMENT (decl);
/* Don't change DECL_ALIGN when called from estimated_stack_frame_size.
That is done before IPA and could bump alignment based on host
backend even for offloaded code which wants different
LOCAL_DECL_ALIGNMENT. */
if (really_expand)
SET_DECL_ALIGN (decl, align);
here we should assert that we never lower a decls alignment since earlier
optimization already made use of the alignment of a decl (which also means
doing layout as far as alignment is concerned earlier will improve
generated code).
The documentation of LOCAL_DECL_ALIGNMENT says the purpose is
to increase alignment. Only x86 implements LOCAL_DECL_ALIGNMENT,
others just LOCAL_ALIGNMENT (x86 also implements that). The difference
must be quite subtle ... Oh, and LOCAL_ALIGNMENT seems completely
unused (besides providing the default implementation for LOCAL_DECL_ALIGNMENT).
Huh.
> > And it's a little bit indirectly, it called from
> > estimate_stack_frame_size, call stack like:
> > estimate_stack_frame_size -> expand_one_var -> add_stack_var ->
> > align_local_variable
> >
> > I created a new pass for local variable alignment adjustment, and then
> > Andrew Pinski suggest me can added into ipa_increase_alignment,
> > because that doing similar things but for global variable.
> >
> > However the ipa_increase_alignment belong tree-vectorizer.c, which is
> > weird place to adjust local variable alignment, so I moved out into a
> > new file, so do you think just create a stand alone simple pass for
> > doing that is better than this way?
>
> I do think that local variable layout probably doesn't belong in that IPA pass
> but elsewhere (way earlier). But my main complaint was that the diff
> doesn't show changes you made to the pass because it first and foremost
> shows moving all the code. That makes reviewing the change impossible.
>
> So at least split the patch into one moving the pass to a separate file and
> one doing the actual changes.
>
> Thanks,
> Richard.
>
> > Thanks :)
> >
> >
> > On Fri, Mar 27, 2020 at 8:33 PM Richard Biener
> > <richard.guenther@gmail.com> wrote:
> > >
> > > On Fri, Mar 27, 2020 at 1:28 PM Kito Cheng <kito.cheng@sifive.com> wrote:
> > > >
> > > > - The alignment for local variable was adjust during estimate_stack_frame_size,
> > > > however it seems wrong spot to adjust that.
> > > >
> > > > - So we must adjust at some point, and here is already a pass to adjust
> > > > alignment, which is ipa-increase-alignment, used for tree vectorization.
> > > >
> > > > - We move out the pass from tree-vectorizer.c into ipa-increase-alignment.cc.
> > > >
> > > > - This patch fix gfortran.dg/pr45636.f90 for arm and riscv.
> > > >
> > > > - Regression test on riscv32/riscv64 and x86_64-linux-gnu, no new fail
> > > > introduced.
> > >
> > > Sorry, but the diff is completely illegible due to the move to a different file.
> > >
> > > I also dont' see that you remove local variable alignment adjustment from
> > > estimate_stack_frame_size (but I would agree that adjusting there is wrong).
> > >
> > > Please do not move the code and re-post.
> > >
> > > Richard.
> > >
> > > > gcc/ChangeLog
> > > >
> > > > PR target/90811
> > > > * Makefile.in (OBJS): Add ipa-increase-alignment.o.
> > > > * tree-vectorizer.c (get_vec_alignment_for_type): Moved to
> > > > ipa-increase-alignment.cc.
> > > > (type_align_map): Ditto.
> > > > (get_vec_alignment_for_array_type): Ditto.
> > > > (get_vec_alignment_for_record_type): Ditto.
> > > > (increase_alignment): Ditto.
> > > > (pass_data_ipa_increase_alignment): Ditto.
> > > > (pass_ipa_increase_alignment): Ditto.
> > > > (make_pass_ipa_increase_alignment): Ditto.
> > > > * ipa-increase-alignment.cc (get_vec_alignment_for_type) Moved
> > > > from ipa-increase-alignment.cc.
> > > > (type_align_map): Ditto.
> > > > (get_vec_alignment_for_array_type): Ditto.
> > > > (get_vec_alignment_for_record_type): Ditto.
> > > > (increase_alignment): Ditto.
> > > > (pass_data_ipa_increase_alignment): Ditto.
> > > > (pass_ipa_increase_alignment): Ditto.
> > > > (make_pass_ipa_increase_alignment): Ditto.
> > > > (increase_alignment): New.
> > > > (increase_alignment_local_var): New.
> > > > (increase_alignment_global_var): New.
> > > > ---
> > > > gcc/Makefile.in | 1 +
> > > > gcc/ipa-increase-alignment.cc | 251 ++++++++++++++++++++++++++++++++++
> > > > gcc/tree-vectorizer.c | 189 -------------------------
> > > > 3 files changed, 252 insertions(+), 189 deletions(-)
> > > > create mode 100644 gcc/ipa-increase-alignment.cc
> > > >
> > > > diff --git a/gcc/Makefile.in b/gcc/Makefile.in
> > > > index fa9923bb270..2c11252911c 100644
> > > > --- a/gcc/Makefile.in
> > > > +++ b/gcc/Makefile.in
> > > > @@ -1408,6 +1408,7 @@ OBJS = \
> > > > ipa-inline.o \
> > > > ipa-comdats.o \
> > > > ipa-visibility.o \
> > > > + ipa-increase-alignment.o \
> > > > ipa-inline-analysis.o \
> > > > ipa-inline-transform.o \
> > > > ipa-predicate.o \
> > > > diff --git a/gcc/ipa-increase-alignment.cc b/gcc/ipa-increase-alignment.cc
> > > > new file mode 100644
> > > > index 00000000000..d09917c185f
> > > > --- /dev/null
> > > > +++ b/gcc/ipa-increase-alignment.cc
> > > > @@ -0,0 +1,251 @@
> > > > +/* Vectorizer
> > > > + Copyright (C) 2003-2020 Free Software Foundation, Inc.
> > > > + Contributed by Dorit Naishlos <dorit@il.ibm.com>
> > > > +
> > > > +This file is part of GCC.
> > > > +
> > > > +GCC is free software; you can redistribute it and/or modify it under
> > > > +the terms of the GNU General Public License as published by the Free
> > > > +Software Foundation; either version 3, or (at your option) any later
> > > > +version.
> > > > +
> > > > +GCC is distributed in the hope that it will be useful, but WITHOUT ANY
> > > > +WARRANTY; without even the implied warranty of MERCHANTABILITY or
> > > > +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
> > > > +for more details.
> > > > +
> > > > +You should have received a copy of the GNU General Public License
> > > > +along with GCC; see the file COPYING3. If not see
> > > > +<http://www.gnu.org/licenses/>. */
> > > > +
> > > > +#include "config.h"
> > > > +#include "system.h"
> > > > +#include "coretypes.h"
> > > > +#include "backend.h"
> > > > +#include "target.h"
> > > > +#include "tree.h"
> > > > +#include "gimple.h"
> > > > +#include "tree-pass.h"
> > > > +#include "cgraph.h"
> > > > +#include "fold-const.h"
> > > > +#include "gimple-iterator.h"
> > > > +#include "tree-cfg.h"
> > > > +#include "cfgloop.h"
> > > > +#include "tree-vectorizer.h"
> > > > +#include "tm_p.h"
> > > > +
> > > > +
> > > > +/* Increase alignment of global arrays to improve vectorization potential.
> > > > + TODO:
> > > > + - Consider also structs that have an array field.
> > > > + - Use ipa analysis to prune arrays that can't be vectorized?
> > > > + This should involve global alignment analysis and in the future also
> > > > + array padding. */
> > > > +
> > > > +static unsigned get_vec_alignment_for_type (tree);
> > > > +static hash_map<tree, unsigned> *type_align_map;
> > > > +
> > > > +/* Return alignment of array's vector type corresponding to scalar type.
> > > > + 0 if no vector type exists. */
> > > > +static unsigned
> > > > +get_vec_alignment_for_array_type (tree type)
> > > > +{
> > > > + gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
> > > > + poly_uint64 array_size, vector_size;
> > > > +
> > > > + tree scalar_type = strip_array_types (type);
> > > > + tree vectype = get_related_vectype_for_scalar_type (VOIDmode, scalar_type);
> > > > + if (!vectype
> > > > + || !poly_int_tree_p (TYPE_SIZE (type), &array_size)
> > > > + || !poly_int_tree_p (TYPE_SIZE (vectype), &vector_size)
> > > > + || maybe_lt (array_size, vector_size))
> > > > + return 0;
> > > > +
> > > > + return TYPE_ALIGN (vectype);
> > > > +}
> > > > +
> > > > +/* Return alignment of field having maximum alignment of vector type
> > > > + corresponding to it's scalar type. For now, we only consider fields whose
> > > > + offset is a multiple of it's vector alignment.
> > > > + 0 if no suitable field is found. */
> > > > +static unsigned
> > > > +get_vec_alignment_for_record_type (tree type)
> > > > +{
> > > > + gcc_assert (TREE_CODE (type) == RECORD_TYPE);
> > > > +
> > > > + unsigned max_align = 0, alignment;
> > > > + HOST_WIDE_INT offset;
> > > > + tree offset_tree;
> > > > +
> > > > + if (TYPE_PACKED (type))
> > > > + return 0;
> > > > +
> > > > + unsigned *slot = type_align_map->get (type);
> > > > + if (slot)
> > > > + return *slot;
> > > > +
> > > > + for (tree field = first_field (type);
> > > > + field != NULL_TREE;
> > > > + field = DECL_CHAIN (field))
> > > > + {
> > > > + /* Skip if not FIELD_DECL or if alignment is set by user. */
> > > > + if (TREE_CODE (field) != FIELD_DECL
> > > > + || DECL_USER_ALIGN (field)
> > > > + || DECL_ARTIFICIAL (field))
> > > > + continue;
> > > > +
> > > > + /* We don't need to process the type further if offset is variable,
> > > > + since the offsets of remaining members will also be variable. */
> > > > + if (TREE_CODE (DECL_FIELD_OFFSET (field)) != INTEGER_CST
> > > > + || TREE_CODE (DECL_FIELD_BIT_OFFSET (field)) != INTEGER_CST)
> > > > + break;
> > > > +
> > > > + /* Similarly stop processing the type if offset_tree
> > > > + does not fit in unsigned HOST_WIDE_INT. */
> > > > + offset_tree = bit_position (field);
> > > > + if (!tree_fits_uhwi_p (offset_tree))
> > > > + break;
> > > > +
> > > > + offset = tree_to_uhwi (offset_tree);
> > > > + alignment = get_vec_alignment_for_type (TREE_TYPE (field));
> > > > +
> > > > + /* Get maximum alignment of vectorized field/array among those members
> > > > + whose offset is multiple of the vector alignment. */
> > > > + if (alignment
> > > > + && (offset % alignment == 0)
> > > > + && (alignment > max_align))
> > > > + max_align = alignment;
> > > > + }
> > > > +
> > > > + type_align_map->put (type, max_align);
> > > > + return max_align;
> > > > +}
> > > > +
> > > > +/* Return alignment of vector type corresponding to decl's scalar type
> > > > + or 0 if it doesn't exist or the vector alignment is lesser than
> > > > + decl's alignment. */
> > > > +static unsigned
> > > > +get_vec_alignment_for_type (tree type)
> > > > +{
> > > > + if (type == NULL_TREE)
> > > > + return 0;
> > > > +
> > > > + gcc_assert (TYPE_P (type));
> > > > +
> > > > + static unsigned alignment = 0;
> > > > + switch (TREE_CODE (type))
> > > > + {
> > > > + case ARRAY_TYPE:
> > > > + alignment = get_vec_alignment_for_array_type (type);
> > > > + break;
> > > > + case RECORD_TYPE:
> > > > + alignment = get_vec_alignment_for_record_type (type);
> > > > + break;
> > > > + default:
> > > > + alignment = 0;
> > > > + break;
> > > > + }
> > > > +
> > > > + return (alignment > TYPE_ALIGN (type)) ? alignment : 0;
> > > > +}
> > > > +
> > > > +/* Adjust alignment for local variable. */
> > > > +static void
> > > > +increase_alignment_local_var (void)
> > > > +{
> > > > + size_t i;
> > > > + tree var;
> > > > + struct cgraph_node *node;
> > > > + unsigned int align;
> > > > +
> > > > + FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
> > > > + {
> > > > + function *fun = node->get_fun ();
> > > > + FOR_EACH_LOCAL_DECL (fun, i, var)
> > > > + {
> > > > + align = LOCAL_DECL_ALIGNMENT (var);
> > > > +
> > > > + SET_DECL_ALIGN (var, align);
> > > > + }
> > > > + }
> > > > +}
> > > > +
> > > > +/* Adjust alignment for global variable, only used for tree vectorization
> > > > + currently. */
> > > > +static void
> > > > +increase_alignment_global_var (void)
> > > > +{
> > > > + if (!(flag_section_anchors && flag_tree_loop_vectorize))
> > > > + return;
> > > > +
> > > > + varpool_node *vnode;
> > > > +
> > > > + vect_location = dump_user_location_t ();
> > > > + type_align_map = new hash_map<tree, unsigned>;
> > > > +
> > > > + /* Increase the alignment of all global arrays for vectorization. */
> > > > + FOR_EACH_DEFINED_VARIABLE (vnode)
> > > > + {
> > > > + tree decl = vnode->decl;
> > > > + unsigned int alignment;
> > > > +
> > > > + if ((decl_in_symtab_p (decl)
> > > > + && !symtab_node::get (decl)->can_increase_alignment_p ())
> > > > + || DECL_USER_ALIGN (decl) || DECL_ARTIFICIAL (decl))
> > > > + continue;
> > > > +
> > > > + alignment = get_vec_alignment_for_type (TREE_TYPE (decl));
> > > > + if (alignment && vect_can_force_dr_alignment_p (decl, alignment))
> > > > + {
> > > > + vnode->increase_alignment (alignment);
> > > > + if (dump_enabled_p ())
> > > > + dump_printf (MSG_NOTE, "Increasing alignment of decl: %T\n", decl);
> > > > + }
> > > > + }
> > > > +
> > > > + delete type_align_map;
> > > > +}
> > > > +
> > > > +/* Entry point to increase_alignment pass. */
> > > > +static unsigned int
> > > > +increase_alignment (void)
> > > > +{
> > > > + increase_alignment_local_var ();
> > > > + increase_alignment_global_var ();
> > > > + return 0;
> > > > +}
> > > > +
> > > > +
> > > > +namespace {
> > > > +
> > > > +const pass_data pass_data_ipa_increase_alignment =
> > > > +{
> > > > + SIMPLE_IPA_PASS, /* type */
> > > > + "increase_alignment", /* name */
> > > > + OPTGROUP_LOOP | OPTGROUP_VEC, /* optinfo_flags */
> > > > + TV_IPA_OPT, /* tv_id */
> > > > + 0, /* properties_required */
> > > > + 0, /* properties_provided */
> > > > + 0, /* properties_destroyed */
> > > > + 0, /* todo_flags_start */
> > > > + 0, /* todo_flags_finish */
> > > > +};
> > > > +
> > > > +class pass_ipa_increase_alignment : public simple_ipa_opt_pass
> > > > +{
> > > > +public:
> > > > + pass_ipa_increase_alignment (gcc::context *ctxt)
> > > > + : simple_ipa_opt_pass (pass_data_ipa_increase_alignment, ctxt)
> > > > + {}
> > > > +
> > > > + virtual unsigned int execute (function *) { return increase_alignment (); }
> > > > +
> > > > +}; // class pass_ipa_increase_alignment
> > > > +
> > > > +} // anon namespace
> > > > +
> > > > +simple_ipa_opt_pass *
> > > > +make_pass_ipa_increase_alignment (gcc::context *ctxt)
> > > > +{
> > > > + return new pass_ipa_increase_alignment (ctxt);
> > > > +}
> > > > diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
> > > > index 8f9444d58a3..e9caf91e174 100644
> > > > --- a/gcc/tree-vectorizer.c
> > > > +++ b/gcc/tree-vectorizer.c
> > > > @@ -1340,195 +1340,6 @@ make_pass_slp_vectorize (gcc::context *ctxt)
> > > > return new pass_slp_vectorize (ctxt);
> > > > }
> > > >
> > > > -
> > > > -/* Increase alignment of global arrays to improve vectorization potential.
> > > > - TODO:
> > > > - - Consider also structs that have an array field.
> > > > - - Use ipa analysis to prune arrays that can't be vectorized?
> > > > - This should involve global alignment analysis and in the future also
> > > > - array padding. */
> > > > -
> > > > -static unsigned get_vec_alignment_for_type (tree);
> > > > -static hash_map<tree, unsigned> *type_align_map;
> > > > -
> > > > -/* Return alignment of array's vector type corresponding to scalar type.
> > > > - 0 if no vector type exists. */
> > > > -static unsigned
> > > > -get_vec_alignment_for_array_type (tree type)
> > > > -{
> > > > - gcc_assert (TREE_CODE (type) == ARRAY_TYPE);
> > > > - poly_uint64 array_size, vector_size;
> > > > -
> > > > - tree scalar_type = strip_array_types (type);
> > > > - tree vectype = get_related_vectype_for_scalar_type (VOIDmode, scalar_type);
> > > > - if (!vectype
> > > > - || !poly_int_tree_p (TYPE_SIZE (type), &array_size)
> > > > - || !poly_int_tree_p (TYPE_SIZE (vectype), &vector_size)
> > > > - || maybe_lt (array_size, vector_size))
> > > > - return 0;
> > > > -
> > > > - return TYPE_ALIGN (vectype);
> > > > -}
> > > > -
> > > > -/* Return alignment of field having maximum alignment of vector type
> > > > - corresponding to it's scalar type. For now, we only consider fields whose
> > > > - offset is a multiple of it's vector alignment.
> > > > - 0 if no suitable field is found. */
> > > > -static unsigned
> > > > -get_vec_alignment_for_record_type (tree type)
> > > > -{
> > > > - gcc_assert (TREE_CODE (type) == RECORD_TYPE);
> > > > -
> > > > - unsigned max_align = 0, alignment;
> > > > - HOST_WIDE_INT offset;
> > > > - tree offset_tree;
> > > > -
> > > > - if (TYPE_PACKED (type))
> > > > - return 0;
> > > > -
> > > > - unsigned *slot = type_align_map->get (type);
> > > > - if (slot)
> > > > - return *slot;
> > > > -
> > > > - for (tree field = first_field (type);
> > > > - field != NULL_TREE;
> > > > - field = DECL_CHAIN (field))
> > > > - {
> > > > - /* Skip if not FIELD_DECL or if alignment is set by user. */
> > > > - if (TREE_CODE (field) != FIELD_DECL
> > > > - || DECL_USER_ALIGN (field)
> > > > - || DECL_ARTIFICIAL (field))
> > > > - continue;
> > > > -
> > > > - /* We don't need to process the type further if offset is variable,
> > > > - since the offsets of remaining members will also be variable. */
> > > > - if (TREE_CODE (DECL_FIELD_OFFSET (field)) != INTEGER_CST
> > > > - || TREE_CODE (DECL_FIELD_BIT_OFFSET (field)) != INTEGER_CST)
> > > > - break;
> > > > -
> > > > - /* Similarly stop processing the type if offset_tree
> > > > - does not fit in unsigned HOST_WIDE_INT. */
> > > > - offset_tree = bit_position (field);
> > > > - if (!tree_fits_uhwi_p (offset_tree))
> > > > - break;
> > > > -
> > > > - offset = tree_to_uhwi (offset_tree);
> > > > - alignment = get_vec_alignment_for_type (TREE_TYPE (field));
> > > > -
> > > > - /* Get maximum alignment of vectorized field/array among those members
> > > > - whose offset is multiple of the vector alignment. */
> > > > - if (alignment
> > > > - && (offset % alignment == 0)
> > > > - && (alignment > max_align))
> > > > - max_align = alignment;
> > > > - }
> > > > -
> > > > - type_align_map->put (type, max_align);
> > > > - return max_align;
> > > > -}
> > > > -
> > > > -/* Return alignment of vector type corresponding to decl's scalar type
> > > > - or 0 if it doesn't exist or the vector alignment is lesser than
> > > > - decl's alignment. */
> > > > -static unsigned
> > > > -get_vec_alignment_for_type (tree type)
> > > > -{
> > > > - if (type == NULL_TREE)
> > > > - return 0;
> > > > -
> > > > - gcc_assert (TYPE_P (type));
> > > > -
> > > > - static unsigned alignment = 0;
> > > > - switch (TREE_CODE (type))
> > > > - {
> > > > - case ARRAY_TYPE:
> > > > - alignment = get_vec_alignment_for_array_type (type);
> > > > - break;
> > > > - case RECORD_TYPE:
> > > > - alignment = get_vec_alignment_for_record_type (type);
> > > > - break;
> > > > - default:
> > > > - alignment = 0;
> > > > - break;
> > > > - }
> > > > -
> > > > - return (alignment > TYPE_ALIGN (type)) ? alignment : 0;
> > > > -}
> > > > -
> > > > -/* Entry point to increase_alignment pass. */
> > > > -static unsigned int
> > > > -increase_alignment (void)
> > > > -{
> > > > - varpool_node *vnode;
> > > > -
> > > > - vect_location = dump_user_location_t ();
> > > > - type_align_map = new hash_map<tree, unsigned>;
> > > > -
> > > > - /* Increase the alignment of all global arrays for vectorization. */
> > > > - FOR_EACH_DEFINED_VARIABLE (vnode)
> > > > - {
> > > > - tree decl = vnode->decl;
> > > > - unsigned int alignment;
> > > > -
> > > > - if ((decl_in_symtab_p (decl)
> > > > - && !symtab_node::get (decl)->can_increase_alignment_p ())
> > > > - || DECL_USER_ALIGN (decl) || DECL_ARTIFICIAL (decl))
> > > > - continue;
> > > > -
> > > > - alignment = get_vec_alignment_for_type (TREE_TYPE (decl));
> > > > - if (alignment && vect_can_force_dr_alignment_p (decl, alignment))
> > > > - {
> > > > - vnode->increase_alignment (alignment);
> > > > - if (dump_enabled_p ())
> > > > - dump_printf (MSG_NOTE, "Increasing alignment of decl: %T\n", decl);
> > > > - }
> > > > - }
> > > > -
> > > > - delete type_align_map;
> > > > - return 0;
> > > > -}
> > > > -
> > > > -
> > > > -namespace {
> > > > -
> > > > -const pass_data pass_data_ipa_increase_alignment =
> > > > -{
> > > > - SIMPLE_IPA_PASS, /* type */
> > > > - "increase_alignment", /* name */
> > > > - OPTGROUP_LOOP | OPTGROUP_VEC, /* optinfo_flags */
> > > > - TV_IPA_OPT, /* tv_id */
> > > > - 0, /* properties_required */
> > > > - 0, /* properties_provided */
> > > > - 0, /* properties_destroyed */
> > > > - 0, /* todo_flags_start */
> > > > - 0, /* todo_flags_finish */
> > > > -};
> > > > -
> > > > -class pass_ipa_increase_alignment : public simple_ipa_opt_pass
> > > > -{
> > > > -public:
> > > > - pass_ipa_increase_alignment (gcc::context *ctxt)
> > > > - : simple_ipa_opt_pass (pass_data_ipa_increase_alignment, ctxt)
> > > > - {}
> > > > -
> > > > - /* opt_pass methods: */
> > > > - virtual bool gate (function *)
> > > > - {
> > > > - return flag_section_anchors && flag_tree_loop_vectorize;
> > > > - }
> > > > -
> > > > - virtual unsigned int execute (function *) { return increase_alignment (); }
> > > > -
> > > > -}; // class pass_ipa_increase_alignment
> > > > -
> > > > -} // anon namespace
> > > > -
> > > > -simple_ipa_opt_pass *
> > > > -make_pass_ipa_increase_alignment (gcc::context *ctxt)
> > > > -{
> > > > - return new pass_ipa_increase_alignment (ctxt);
> > > > -}
> > > > -
> > > > /* If the condition represented by T is a comparison or the SSA name
> > > > result of a comparison, extract the comparison's operands. Represent
> > > > T as NE_EXPR <T, 0> otherwise. */
> > > > --
> > > > 2.25.2
> > > >
More information about the Gcc-patches
mailing list