diff options
author | Richard Sandiford <richard.sandiford@linaro.org> | 2017-12-20 12:56:32 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2017-12-20 12:56:32 +0000 |
commit | 7df9b6f12abfa68c13d9485855dbe22da3167d49 (patch) | |
tree | 0fa30a79b53135aaf28e24184ec7b99dcb0c15f9 | |
parent | 06889da8cc1feb59b65058c51e224bf78248781a (diff) | |
download | gcc-7df9b6f12abfa68c13d9485855dbe22da3167d49.zip gcc-7df9b6f12abfa68c13d9485855dbe22da3167d49.tar.gz gcc-7df9b6f12abfa68c13d9485855dbe22da3167d49.tar.bz2 |
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 <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* builtins.c (get_object_alignment_2): Track polynomial offsets
and sizes. Update the alignment handling.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r255893
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/builtins.c | 13 |
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3aca9c5..c0c6c81 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,13 @@ Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> + * builtins.c (get_object_alignment_2): Track polynomial offsets + and sizes. Update the alignment handling. + +2017-12-20 Richard Sandiford <richard.sandiford@linaro.org> + Alan Hayward <alan.hayward@arm.com> + David Sherwood <david.sherwood@arm.com> + * tree.h (get_inner_reference): Add a version that returns the offset and size as poly_int64_pods rather than HOST_WIDE_INTs. * cfgexpand.c (expand_debug_expr): Track polynomial offsets. Simply diff --git a/gcc/builtins.c b/gcc/builtins.c index 3e8ea95..277bbe8 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; } |