- 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.
- 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. - 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 * ipa-increase-alignment.cc (increase_alignment_local_var): New. (increase_alignment_global_var): New. (pass_ipa_increase_alignment::gate): Remove. --- gcc/ipa-increase-alignment.cc | 45 ++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/gcc/ipa-increase-alignment.cc b/gcc/ipa-increase-alignment.cc index 6e34124bc03..8f28ad83349 100644 --- a/gcc/ipa-increase-alignment.cc +++ b/gcc/ipa-increase-alignment.cc @@ -148,10 +148,35 @@ get_vec_alignment_for_type (tree type) return (alignment > TYPE_ALIGN (type)) ? alignment : 0; } -/* Entry point to increase_alignment pass. */ -static unsigned int -increase_alignment (void) +/* 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 (); @@ -178,6 +203,14 @@ increase_alignment (void) } 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; } @@ -204,12 +237,6 @@ public: : 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 -- 2.25.2