This patch fixes a bug in the bswap pass.
authorWilco Dijkstra <wdijkstr@arm.com>
Tue, 28 Jun 2016 13:57:47 +0000 (13:57 +0000)
committerWilco Dijkstra <wilco@gcc.gnu.org>
Tue, 28 Jun 2016 13:57:47 +0000 (13:57 +0000)
This patch fixes a bug in the bswap pass.  In big-endian BIT_FIELD_REF uses
big-endian bit numbering so we need to adjust the bit position.
The existing version could potentially generate incorrect code however GCC
doesn't emit a BIT_FIELD_REF to access the low byte in a register, so the
symbolic number never matches in big-endian.

    gcc/
* tree-ssa-math-opts.c (find_bswap_or_nop_1): Adjust bitnumbering
for big-endian BIT_FIELD_REF.

From-SVN: r237822

gcc/ChangeLog
gcc/tree-ssa-math-opts.c

index f88c40470e3107b2aa01b0d74b9309b1ed39719b..d9d41ad9ec1cdaaa81c76e3e6c09d6ce79f1d5c4 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-28  Wilco Dijkstra  <wdijkstr@arm.com>
+
+       * tree-ssa-math-opts.c (find_bswap_or_nop_1): Adjust bitnumbering
+       for big-endian BIT_FIELD_REF.
+
 2016-06-28  Pat Haugen  <pthaugen@us.ibm.com>
 
        * config/rs6000/rs6000.md ('type' attribute): Add htmsimple/dfp types.
index 513ef0b3f4eb29a35eae8a0eb14ee8f8c24fcfd9..d31c12fd818a713ca3d251b9464015b147235bbe 100644 (file)
@@ -2307,6 +2307,10 @@ find_bswap_or_nop_1 (gimple *stmt, struct symbolic_number *n, int limit)
          && bitsize % BITS_PER_UNIT == 0
          && init_symbolic_number (n, TREE_OPERAND (rhs1, 0)))
        {
+         /* Handle big-endian bit numbering in BIT_FIELD_REF.  */
+         if (BYTES_BIG_ENDIAN)
+           bitpos = TYPE_PRECISION (n->type) - bitpos - bitsize;
+
          /* Shift.  */
          if (!do_shift_rotate (RSHIFT_EXPR, n, bitpos))
            return NULL;