Hi, this makes sure that stack allocated SSA_NAMEs are at least MODE_ALIGNED. Also increase the MEM_ALIGN for the corresponding rtl objects.
Tested on x86_64-pc-linux-gnu and arm-none-eabi. OK for trunk? Thanks Bernd.
From e8f80c0ed18c49e8b8ad4145401a2c1afa50af60 Mon Sep 17 00:00:00 2001 From: Bernd Edlinger <bernd.edlin...@hotmail.de> Date: Sun, 1 Nov 2020 07:32:20 +0100 Subject: [PATCH] Fix PR97205 This makes sure that stack allocated SSA_NAMEs are at least MODE_ALIGNED. Also increase the MEM_ALIGN for the corresponding rtl objects. gcc: 2020-11-01 Bernd Edlinger <bernd.edlin...@hotmail.de> PR target/97205 * cfgexpand.c (align_local_variable): Make SSA_NAMEs at least MODE_ALIGNED. (expand_one_stack_var_at): Increase MEM_ALIGN for SSA_NAMEs. testsuite: 2020-11-01 Bernd Edlinger <bernd.edlin...@hotmail.de> PR target/97205 * gcc.c-torture/compile/pr97205.c: New test. --- gcc/cfgexpand.c | 26 ++++++++++++++++++++------ gcc/testsuite/gcc.c-torture/compile/pr97205.c | 7 +++++++ 2 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr97205.c diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index f3f17d3..3aec250 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -366,7 +366,15 @@ align_local_variable (tree decl, bool really_expand) unsigned int align; if (TREE_CODE (decl) == SSA_NAME) - align = TYPE_ALIGN (TREE_TYPE (decl)); + { + tree type = TREE_TYPE (decl); + machine_mode mode = TYPE_MODE (type); + + align = TYPE_ALIGN (type); + if (mode != BLKmode + && align < GET_MODE_ALIGNMENT (mode)) + align = GET_MODE_ALIGNMENT (mode); + } else { align = LOCAL_DECL_ALIGNMENT (decl); @@ -1022,6 +1030,14 @@ expand_one_stack_var_at (tree decl, rtx base, unsigned base_align, } set_rtl (decl, x); + + if (TREE_CODE (decl) == SSA_NAME + && GET_MODE (x) != BLKmode + && MEM_ALIGN (x) < GET_MODE_ALIGNMENT (GET_MODE (x))) + { + gcc_checking_assert (GET_MODE_ALIGNMENT (GET_MODE (x)) <= base_align); + set_mem_align (x, GET_MODE_ALIGNMENT (GET_MODE (x))); + } } class stack_vars_data @@ -1327,13 +1343,11 @@ expand_one_stack_var_1 (tree var) { tree type = TREE_TYPE (var); size = tree_to_poly_uint64 (TYPE_SIZE_UNIT (type)); - byte_align = TYPE_ALIGN_UNIT (type); } else - { - size = tree_to_poly_uint64 (DECL_SIZE_UNIT (var)); - byte_align = align_local_variable (var, true); - } + size = tree_to_poly_uint64 (DECL_SIZE_UNIT (var)); + + byte_align = align_local_variable (var, true); /* We handle highly aligned variables in expand_stack_vars. */ gcc_assert (byte_align * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT); diff --git a/gcc/testsuite/gcc.c-torture/compile/pr97205.c b/gcc/testsuite/gcc.c-torture/compile/pr97205.c new file mode 100644 index 0000000..6600011 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr97205.c @@ -0,0 +1,7 @@ +int a; +typedef __attribute__((aligned(2))) int x; +int f () +{ + x b = a; + return b; +} -- 1.9.1