diff options
author | Wilco Dijkstra <wdijkstr@arm.com> | 2016-06-28 13:57:47 +0000 |
---|---|---|
committer | Wilco Dijkstra <wilco@gcc.gnu.org> | 2016-06-28 13:57:47 +0000 |
commit | f6922a5660bc593d7eed186c0538eb28269fcbe5 (patch) | |
tree | c094454f4fad5edb0815ce22ddd5ab07dd9d866e /gcc/tree-ssa-math-opts.c | |
parent | eda328bf1dd994826252fa0435d2e58103c2c2d8 (diff) | |
download | gcc-f6922a5660bc593d7eed186c0538eb28269fcbe5.zip gcc-f6922a5660bc593d7eed186c0538eb28269fcbe5.tar.gz gcc-f6922a5660bc593d7eed186c0538eb28269fcbe5.tar.bz2 |
This patch fixes a bug in the bswap pass.
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
Diffstat (limited to 'gcc/tree-ssa-math-opts.c')
-rw-r--r-- | gcc/tree-ssa-math-opts.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index 513ef0b..d31c12f 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -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; |