This is one of the issues that -Wlogical-not-parentheses detected. Interestingly, this code has been added in 2002 (!). I believe the logical not there should be just removed; the comment above it says /* We must now have a BIT_AND_EXPR with a constant that is one less than power of 2 and which is larger than BIGGEST_ALIGNMENT. */ so if the constant is not one less than power of 2 (exact_log2 returns -1), we should bail out.
Bootstrapped/regtested on x86_64-linux, ok for trunk? Should I backport this to 4.9/4.8 after a while? 2014-08-21 Marek Polacek <pola...@redhat.com> PR c/61271 * expr.c (is_aligning_offset): Remove logical not. diff --git gcc/expr.c gcc/expr.c index 920d47b..05d81dc 100644 --- gcc/expr.c +++ gcc/expr.c @@ -10721,7 +10721,7 @@ is_aligning_offset (const_tree offset, const_tree exp) || !tree_fits_uhwi_p (TREE_OPERAND (offset, 1)) || compare_tree_int (TREE_OPERAND (offset, 1), BIGGEST_ALIGNMENT / BITS_PER_UNIT) <= 0 - || !exact_log2 (tree_to_uhwi (TREE_OPERAND (offset, 1)) + 1) < 0) + || exact_log2 (tree_to_uhwi (TREE_OPERAND (offset, 1)) + 1) < 0) return 0; /* Look at the first operand of BIT_AND_EXPR and strip any conversion. Marek