From 7df9b6f12abfa68c13d9485855dbe22da3167d49 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 20 Dec 2017 12:56:32 +0000 Subject: [PATCH] poly_int: get_object_alignment_2 This patch makes get_object_alignment_2 track polynomial offsets and sizes. The real work is done by get_inner_reference, but we then need to handle the alignment correctly. 2017-12-20 Richard Sandiford Alan Hayward David Sherwood gcc/ * builtins.c (get_object_alignment_2): Track polynomial offsets and sizes. Update the alignment handling. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r255893 --- gcc/ChangeLog | 7 +++++++ gcc/builtins.c | 13 +++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3aca9c59ccd..c0c6c81b572 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-12-20 Richard Sandiford + Alan Hayward + David Sherwood + + * builtins.c (get_object_alignment_2): Track polynomial offsets + and sizes. Update the alignment handling. + 2017-12-20 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/builtins.c b/gcc/builtins.c index 3e8ea95d729..277bbe8db26 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -248,7 +248,7 @@ static bool get_object_alignment_2 (tree exp, unsigned int *alignp, unsigned HOST_WIDE_INT *bitposp, bool addr_p) { - HOST_WIDE_INT bitsize, bitpos; + poly_int64 bitsize, bitpos; tree offset; machine_mode mode; int unsignedp, reversep, volatilep; @@ -373,8 +373,17 @@ get_object_alignment_2 (tree exp, unsigned int *alignp, } } + /* Account for the alignment of runtime coefficients, so that the constant + bitpos is guaranteed to be accurate. */ + unsigned int alt_align = ::known_alignment (bitpos - bitpos.coeffs[0]); + if (alt_align != 0 && alt_align < align) + { + align = alt_align; + known_alignment = false; + } + *alignp = align; - *bitposp = bitpos & (*alignp - 1); + *bitposp = bitpos.coeffs[0] & (align - 1); return known_alignment; } -- 2.30.2