[Bug rtl-optimization/65220] [4.8/4.9/5 Regression] integer division in stack alignment for VLA allocation
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Feb 26 13:57:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65220
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
We hit
rtx
allocate_dynamic_stack_space (rtx size, unsigned size_align,
unsigned required_align, bool cannot_accumulate)
{
...
/* ??? STACK_POINTER_OFFSET is always defined now. */
#if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET)
must_align = true;
extra_align = BITS_PER_UNIT;
#endif
...
if (must_align)
{
/* CEIL_DIV_EXPR needs to worry about the addition overflowing,
but we know it can't. So add ourselves and then do
TRUNC_DIV_EXPR. */
target = expand_binop (Pmode, add_optab, target,
gen_int_mode (required_align / BITS_PER_UNIT - 1,
Pmode),
NULL_RTX, 1, OPTAB_LIB_WIDEN);
target = expand_divmod (0, TRUNC_DIV_EXPR, Pmode, target,
gen_int_mode (required_align / BITS_PER_UNIT,
Pmode),
NULL_RTX, 1);
target = expand_mult (Pmode, target,
gen_int_mode (required_align / BITS_PER_UNIT,
Pmode),
NULL_RTX, 1);
}
thus unconditionally trigger the must_align path (even if in this case
alignment is 32 and thus already properly aligned?). expand_divmod
doesn't handle power-of-two divisions it seems.
More information about the Gcc-bugs
mailing list