Hi Richard: Tested and committed with fixes, thanks your review :)
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 > >>