aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-12-20 12:56:32 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-12-20 12:56:32 +0000
commit7df9b6f12abfa68c13d9485855dbe22da3167d49 (patch)
tree0fa30a79b53135aaf28e24184ec7b99dcb0c15f9
parent06889da8cc1feb59b65058c51e224bf78248781a (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/builtins.c13
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;
}