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 >>