diff options
author | Richard Biener <rguenther@suse.de> | 2015-02-27 08:37:51 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-02-27 08:37:51 +0000 |
commit | 4ceae7e9576c605219f2da69e2450476330548a7 (patch) | |
tree | 06fd165b874d97de0da7df34ee59c6359791e72a /gcc/builtins.c | |
parent | d083ae5fae0b816b0e39018124d5dea9f824a61c (diff) | |
download | gcc-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.c | 11 |
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) |