Commit f6922a56 by Wilco Dijkstra Committed by Wilco Dijkstra

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
parent eda328bf
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> 2016-06-28 Pat Haugen <pthaugen@us.ibm.com>
* config/rs6000/rs6000.md ('type' attribute): Add htmsimple/dfp types. * 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) ...@@ -2307,6 +2307,10 @@ find_bswap_or_nop_1 (gimple *stmt, struct symbolic_number *n, int limit)
&& bitsize % BITS_PER_UNIT == 0 && bitsize % BITS_PER_UNIT == 0
&& init_symbolic_number (n, TREE_OPERAND (rhs1, 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. */ /* Shift. */
if (!do_shift_rotate (RSHIFT_EXPR, n, bitpos)) if (!do_shift_rotate (RSHIFT_EXPR, n, bitpos))
return NULL; return NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment