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
This commit is contained in:
parent
eda328bf1d
commit
f6922a5660
2 changed files with 9 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue