On Wed, May 20, 2020 at 2:30 PM Kito Cheng <kito.ch...@sifive.com> wrote:
>
> There is an assertion checking to make sure LOCAL_DECL_ALIGNMENT never
> shrink alignment,
>
> But those two testcase did under x86_64 with -m32, I am not sure if
> the behavior is expected or not?
> It should be fixed on target if that behavior is not expected.

Well, it happens that it makes what I said upon discussing the patch true - we
should set alignment during decl layout.  Here the compile is with
-mpreferred-stack-boundary=2 so we cannot get 8 byte alignment unless
we align the stack dynamically which is undesirable.  But on 32bit
long long is naturally aligned.

I guess this was a latent issue before, since we didn't have the assert.

I'll open a bug.

Richard.

>
> On Wed, May 20, 2020 at 8:06 PM Kito Cheng <kito.ch...@sifive.com> wrote:
> >
> > Ok, I will check.
> >
> > On Wed, May 20, 2020 at 8:04 PM Richard Biener
> > <richard.guent...@gmail.com> wrote:
> > >
> > > On Wed, May 20, 2020 at 9:20 AM Kito Cheng <kito.ch...@sifive.com> wrote:
> > > >
> > > > Hi Richard:
> > > >
> > > > Tested and committed with fixes, thanks your review :)
> > >
> > > And we're now hitting
> > >
> > > internal compiler error: in execute, at adjust-alignment.c:73
> > >
> > > for
> > >
> > > FAIL: gcc.target/i386/pr69454-2.c (internal compiler error)
> > > FAIL: gcc.target/i386/pr69454-2.c (test for excess errors)
> > > UNRESOLVED: gcc.target/i386/stackalign/longlong-1.c -mno-stackrealign
> > > scan-assembler-not and[lq]?[^\\\\n]*-8,[^\\\\n]*sp
> > > FAIL: gcc.target/i386/stackalign/longlong-1.c -mno-stackrealign
> > > (internal compiler error)
> > > FAIL: gcc.target/i386/stackalign/longlong-1.c -mno-stackrealign (test
> > > for excess errors)
> > > UNRESOLVED: gcc.target/i386/stackalign/longlong-1.c -mstackrealign
> > > scan-assembler-not and[lq]?[^\\\\n]*-8,[^\\\\n]*sp
> > > FAIL: gcc.target/i386/stackalign/longlong-1.c -mstackrealign (internal
> > > compiler error)
> > > FAIL: gcc.target/i386/stackalign/longlong-1.c -mstackrealign (test for
> > > excess errors)
> > >
> > > on x86_64 with -m32
> > >
> > > Can you please investigate?
> > >
> > > Thanks,
> > > Richard.
> > >
> > > > On Mon, May 18, 2020 at 6:22 PM Richard Biener
> > > > <richard.guent...@gmail.com> wrote:
> > > > >
> > > > > On Mon, May 18, 2020 at 9:27 AM Kito Cheng <kito.ch...@sifive.com> 
> > > > > wrote:
> > > > > >
> > > > > > ping
> > > > > >
> > > > > > On Tue, Apr 14, 2020 at 2:53 PM Kito Cheng <kito.ch...@sifive.com> 
> > > > > > wrote:
> > > > > >>
> > > > > >>  - The alignment for local variable was adjust during 
> > > > > >> estimate_stack_frame_size,
> > > > > >>    however it seems wrong spot to adjust that, expand phase will 
> > > > > >> adjust that
> > > > > >>    but it little too late to some gimple optimization, which rely 
> > > > > >> on certain
> > > > > >>    target hooks need to check alignment, forwprop is an example for
> > > > > >>    that, result of simplify_builtin_call rely on the alignment on 
> > > > > >> some
> > > > > >>    target like ARM or RISC-V.
> > > > > >>
> > > > > >>  - Exclude static local var and hard register var in the process of
> > > > > >>    alignment adjustment.
> > > > > >>
> > > > > >>  - 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.
> > > > > >>
> > > > > >> gcc/ChangeLog
> > > > > >>
> > > > > >>         PR target/90811
> > > > > >>         * Makefile.in (OBJS): Add tree-adjust-alignment.o.
> > > > > >>         * tree-adjust-alignment.cc (pass_data_adjust_alignment): 
> > > > > >> New.
> > > > > >>         (pass_adjust_alignment): New.
> > > > > >>         (-pass_adjust_alignment::execute): New.
> > > > > >>         (make_pass_adjust_alignment): New.
> > > > > >>         * tree-pass.h (make_pass_adjust_alignment): New.
> > > > > >>         * passes.def: Add pass_adjust_alignment.
> > > > > >> ---
> > > > > >>  gcc/Makefile.in              |  1 +
> > > > > >>  gcc/passes.def               |  1 +
> > > > > >>  gcc/tree-adjust-alignment.cc | 92 
> > > > > >> ++++++++++++++++++++++++++++++++++++
> > > > > >>  gcc/tree-pass.h              |  1 +
> > > > > >>  4 files changed, 95 insertions(+)
> > > > > >>  create mode 100644 gcc/tree-adjust-alignment.cc
> > > > > >>
> > > > > >> diff --git a/gcc/Makefile.in b/gcc/Makefile.in
> > > > > >> index fa9923bb270..9b73288f776 100644
> > > > > >> --- a/gcc/Makefile.in
> > > > > >> +++ b/gcc/Makefile.in
> > > > > >> @@ -1545,6 +1545,7 @@ OBJS = \
> > > > > >>         ubsan.o \
> > > > > >>         sanopt.o \
> > > > > >>         sancov.o \
> > > > > >> +       tree-adjust-alignment.o \
> > > > >
> > > > > Please rename the file to just 'adjust-alignment.c'
> > > > >
> > > > > >>         tree-call-cdce.o \
> > > > > >>         tree-cfg.o \
> > > > > >>         tree-cfgcleanup.o \
> > > > > >> diff --git a/gcc/passes.def b/gcc/passes.def
> > > > > >> index 2bf2cb78fc5..92cbe587a8a 100644
> > > > > >> --- a/gcc/passes.def
> > > > > >> +++ b/gcc/passes.def
> > > > > >> @@ -183,6 +183,7 @@ along with GCC; see the file COPYING3.  If not 
> > > > > >> see
> > > > > >>    NEXT_PASS (pass_oacc_device_lower);
> > > > > >>    NEXT_PASS (pass_omp_device_lower);
> > > > > >>    NEXT_PASS (pass_omp_target_link);
> > > > > >> +  NEXT_PASS (pass_adjust_alignment);
> > > > > >>    NEXT_PASS (pass_all_optimizations);
> > > > > >>    PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations)
> > > > > >>        NEXT_PASS (pass_remove_cgraph_callee_edges);
> > > > > >> diff --git a/gcc/tree-adjust-alignment.cc 
> > > > > >> b/gcc/tree-adjust-alignment.cc
> > > > > >> new file mode 100644
> > > > > >> index 00000000000..77f38f6949b
> > > > > >> --- /dev/null
> > > > > >> +++ b/gcc/tree-adjust-alignment.cc
> > > > > >> @@ -0,0 +1,92 @@
> > > > > >> +/* Adjust alignment for local variable.
> > > > > >> +   Copyright (C) 2003-2020 Free Software Foundation, Inc.
> > > > >
> > > > > Just 2020 please
> > > > >
> > > > > >> +   Contributed by Dorit Naishlos <do...@il.ibm.com>
> > > > >
> > > > > Eh?  Please put in your name.
> > > > >
> > > > > >> +
> > > > > >> +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"
> > > > >
> > > > > Did you try to narrow down the set of includes?
> > > > > Please do so, tree-vectorizer.h does not look needed.
> > > > >
> > > > > >> +namespace {
> > > > > >> +
> > > > > >> +const pass_data pass_data_adjust_alignment =
> > > > > >> +{
> > > > > >> +  GIMPLE_PASS, /* type */
> > > > > >> +  "adjust_alignment", /* name */
> > > > > >> +  OPTGROUP_NONE, /* optinfo_flags */
> > > > > >> +  TV_NONE, /* tv_id */
> > > > > >> +  0, /* properties_required */
> > > > > >> +  0, /* properties_provided */
> > > > > >> +  0, /* properties_destroyed */
> > > > > >> +  0, /* todo_flags_start */
> > > > > >> +  0, /* todo_flags_finish */
> > > > > >> +};
> > > > > >> +
> > > > > >> +class pass_adjust_alignment : public gimple_opt_pass
> > > > > >> +{
> > > > > >> +public:
> > > > > >> +  pass_adjust_alignment (gcc::context *ctxt)
> > > > > >> +    : gimple_opt_pass (pass_data_adjust_alignment, ctxt)
> > > > > >> +  {}
> > > > > >> +
> > > > > >> +  virtual unsigned int execute (function *);
> > > > > >> +
> > > > >
> > > > > excessive vertical space
> > > > >
> > > > > >> +}; // class pass_adjust_alignment
> > > > > >> +
> > > > > >> +} // anon namespace
> > > > > >> +
> > > > > >> +/* Entry point to adjust_alignment pass.  */
> > > > > >> +unsigned int
> > > > > >> +pass_adjust_alignment::execute (function *fun) {
> > > > >
> > > > > The { goes to the next line and the following lines indents
> > > > > are off then.
> > > > >
> > > > > >> +  size_t i;
> > > > > >> +  tree var;
> > > > > >> +  unsigned int align;
> > > > >
> > > > > declare variables where they are used, thus...
> > > > >
> > > > > >> +
> > > > > >> +  FOR_EACH_LOCAL_DECL (fun, i, var)
> > > > > >> +    {
> > > > > >> +      /* Don't adjust aligment for static local var and hard 
> > > > > >> register var.  */
> > > > > >> +      if (is_global_var (var) || DECL_HARD_REGISTER (var))
> > > > > >> +       continue;
> > > > > >> +
> > > > > >> +      align = LOCAL_DECL_ALIGNMENT (var);
> > > > >
> > > > >  unsigned align = LOCAL...
> > > > >
> > > > > for example.
> > > > >
> > > > > OK with those changes.
> > > > >
> > > > > Thanks,
> > > > > Richard.
> > > > >
> > > > > >> +
> > > > > >> +      /* Make sure alignment only increase.  */
> > > > > >> +      gcc_assert (align >= DECL_ALIGN (var));
> > > > > >> +
> > > > > >> +      SET_DECL_ALIGN (var, align);
> > > > > >> +    }
> > > > > >> +  return 0;
> > > > > >> +}
> > > > > >> +
> > > > > >> +gimple_opt_pass *
> > > > > >> +make_pass_adjust_alignment (gcc::context *ctxt)
> > > > > >> +{
> > > > > >> +  return new pass_adjust_alignment (ctxt);
> > > > > >> +}
> > > > > >> diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
> > > > > >> index a1207a20a3c..576b3f67434 100644
> > > > > >> --- a/gcc/tree-pass.h
> > > > > >> +++ b/gcc/tree-pass.h
> > > > > >> @@ -480,6 +480,7 @@ extern gimple_opt_pass 
> > > > > >> *make_pass_sprintf_length (gcc::context *ctxt);
> > > > > >>  extern gimple_opt_pass *make_pass_walloca (gcc::context *ctxt);
> > > > > >>  extern gimple_opt_pass *make_pass_coroutine_lower_builtins 
> > > > > >> (gcc::context *ctxt);
> > > > > >>  extern gimple_opt_pass *make_pass_coroutine_early_expand_ifns 
> > > > > >> (gcc::context *ctxt);
> > > > > >> +extern gimple_opt_pass *make_pass_adjust_alignment (gcc::context 
> > > > > >> *ctxt);
> > > > > >>
> > > > > >>  /* IPA Passes */
> > > > > >>  extern simple_ipa_opt_pass *make_pass_ipa_lower_emutls 
> > > > > >> (gcc::context *ctxt);
> > > > > >> --
> > > > > >> 2.26.0
> > > > > >>

Reply via email to