aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-02-27 08:37:51 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-02-27 08:37:51 +0000
commit4ceae7e9576c605219f2da69e2450476330548a7 (patch)
tree06fd165b874d97de0da7df34ee59c6359791e72a /gcc/builtins.c
parentd083ae5fae0b816b0e39018124d5dea9f824a61c (diff)
downloadgcc-4ceae7e9576c605219f2da69e2450476330548a7.zip
gcc-4ceae7e9576c605219f2da69e2450476330548a7.tar.gz
gcc-4ceae7e9576c605219f2da69e2450476330548a7.tar.bz2
re PR testsuite/63175 (FAIL: gcc.dg/vect/costmodel/ppc/costmodel-bb-slp-9a.c scan-tree-dump-times slp2" basic block vectorized using SLP" 1)
2015-02-27 Richard Biener <rguenther@suse.de> PR middle-end/63175 * builtins.c (get_object_alignment_2): Make sure to re-apply the ANDed mask after recursing to its operand gets us a new misalignment bit position. From-SVN: r221043
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 8f3c0bc..fb871e6 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -359,13 +359,15 @@ get_object_alignment_2 (tree exp, unsigned int *alignp,
tree addr = TREE_OPERAND (exp, 0);
unsigned ptr_align;
unsigned HOST_WIDE_INT ptr_bitpos;
+ unsigned HOST_WIDE_INT ptr_bitmask = ~0;
+ /* If the address is explicitely aligned, handle that. */
if (TREE_CODE (addr) == BIT_AND_EXPR
&& TREE_CODE (TREE_OPERAND (addr, 1)) == INTEGER_CST)
{
- align = (TREE_INT_CST_LOW (TREE_OPERAND (addr, 1))
- & -TREE_INT_CST_LOW (TREE_OPERAND (addr, 1)));
- align *= BITS_PER_UNIT;
+ ptr_bitmask = TREE_INT_CST_LOW (TREE_OPERAND (addr, 1));
+ ptr_bitmask *= BITS_PER_UNIT;
+ align = ptr_bitmask & -ptr_bitmask;
addr = TREE_OPERAND (addr, 0);
}
@@ -373,6 +375,9 @@ get_object_alignment_2 (tree exp, unsigned int *alignp,
= get_pointer_alignment_1 (addr, &ptr_align, &ptr_bitpos);
align = MAX (ptr_align, align);
+ /* Re-apply explicit alignment to the bitpos. */
+ ptr_bitpos &= ptr_bitmask;
+
/* The alignment of the pointer operand in a TARGET_MEM_REF
has to take the variable offset parts into account. */
if (TREE_CODE (exp) == TARGET_MEM_REF)