When we compute excessive byte alignment get_pointer_alignment_1
may end up returning an alignment of zero due to overflow when
multiplying with BITS_PER_UNIT.  This in turn causes get_object_alignment
to return a too conservative (byte) alignment.

Fixed as follows.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2015-12-04  Richard Biener  <rguent...@suse.de>

        PR middle-end/68636
        * builtins.c (get_pointer_alignment_1): Take care of byte to
        bit alignment computation overflow.

Index: gcc/builtins.c
===================================================================
--- gcc/builtins.c      (revision 231058)
+++ gcc/builtins.c      (working copy)
@@ -497,6 +497,10 @@ get_pointer_alignment_1 (tree exp, unsig
        {
          *bitposp = ptr_misalign * BITS_PER_UNIT;
          *alignp = ptr_align * BITS_PER_UNIT;
+         /* Make sure to return a sensible alignment when the multiplication
+            by BITS_PER_UNIT overflowed.  */
+         if (*alignp == 0)
+           *alignp = 1u << (HOST_BITS_PER_INT - 1);
          /* We cannot really tell whether this result is an approximation.  */
          return true;
        }

Reply via email to