optabs.c (expand_binop): Tighten conditions for doubleword expansions.

* optabs.c (expand_binop): Tighten conditions for doubleword
	expansions.
	(widen_bswap): Assert that mode bitsize and precision are the
	same.
	* stor-layout.c (get_best_mode): Skip modes that have lower
	precision than bitsize.
	* recog.c (simplify_while_replacing): Assert that bitsize and
	precision are the same.

From-SVN: r176040
This commit is contained in:
Bernd Schmidt 2011-07-08 13:03:38 +00:00 committed by Bernd Schmidt
parent 86cdf39313
commit 0d44736e75
4 changed files with 22 additions and 6 deletions

View File

@ -16,6 +16,15 @@
* rtlanal.c (nonzero_bits1): Don't compare GET_MODE_SIZE against * rtlanal.c (nonzero_bits1): Don't compare GET_MODE_SIZE against
a bitsize. a bitsize.
* optabs.c (expand_binop): Tighten conditions for doubleword
expansions.
(widen_bswap): Assert that mode bitsize and precision are the
same.
* stor-layout.c (get_best_mode): Skip modes that have lower
precision than bitsize.
* recog.c (simplify_while_replacing): Assert that bitsize and
precision are the same.
2011-07-08 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2011-07-08 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* Makefile.in (LIBGCOV): Remove. * Makefile.in (LIBGCOV): Remove.

View File

@ -1428,12 +1428,12 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
takes operands of this mode and makes a wider mode. */ takes operands of this mode and makes a wider mode. */
if (binoptab == smul_optab if (binoptab == smul_optab
&& GET_MODE_WIDER_MODE (mode) != VOIDmode && GET_MODE_2XWIDER_MODE (mode) != VOIDmode
&& (optab_handler ((unsignedp ? umul_widen_optab : smul_widen_optab), && (optab_handler ((unsignedp ? umul_widen_optab : smul_widen_optab),
GET_MODE_WIDER_MODE (mode)) GET_MODE_2XWIDER_MODE (mode))
!= CODE_FOR_nothing)) != CODE_FOR_nothing))
{ {
temp = expand_binop (GET_MODE_WIDER_MODE (mode), temp = expand_binop (GET_MODE_2XWIDER_MODE (mode),
unsignedp ? umul_widen_optab : smul_widen_optab, unsignedp ? umul_widen_optab : smul_widen_optab,
op0, op1, NULL_RTX, unsignedp, OPTAB_DIRECT); op0, op1, NULL_RTX, unsignedp, OPTAB_DIRECT);
@ -1575,6 +1575,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
&& mclass == MODE_INT && mclass == MODE_INT
&& (CONST_INT_P (op1) || optimize_insn_for_speed_p ()) && (CONST_INT_P (op1) || optimize_insn_for_speed_p ())
&& GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD && GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD
&& GET_MODE_PRECISION (mode) == GET_MODE_BITSIZE (mode)
&& optab_handler (binoptab, word_mode) != CODE_FOR_nothing && optab_handler (binoptab, word_mode) != CODE_FOR_nothing
&& optab_handler (ashl_optab, word_mode) != CODE_FOR_nothing && optab_handler (ashl_optab, word_mode) != CODE_FOR_nothing
&& optab_handler (lshr_optab, word_mode) != CODE_FOR_nothing) && optab_handler (lshr_optab, word_mode) != CODE_FOR_nothing)
@ -1647,7 +1648,7 @@ expand_binop (enum machine_mode mode, optab binoptab, rtx op0, rtx op1,
if ((binoptab == rotl_optab || binoptab == rotr_optab) if ((binoptab == rotl_optab || binoptab == rotr_optab)
&& mclass == MODE_INT && mclass == MODE_INT
&& CONST_INT_P (op1) && CONST_INT_P (op1)
&& GET_MODE_SIZE (mode) == 2 * UNITS_PER_WORD && GET_MODE_PRECISION (mode) == 2 * BITS_PER_WORD
&& optab_handler (ashl_optab, word_mode) != CODE_FOR_nothing && optab_handler (ashl_optab, word_mode) != CODE_FOR_nothing
&& optab_handler (lshr_optab, word_mode) != CODE_FOR_nothing) && optab_handler (lshr_optab, word_mode) != CODE_FOR_nothing)
{ {
@ -2463,6 +2464,8 @@ widen_bswap (enum machine_mode mode, rtx op0, rtx target)
x = widen_operand (op0, wider_mode, mode, true, true); x = widen_operand (op0, wider_mode, mode, true, true);
x = expand_unop (wider_mode, bswap_optab, x, NULL_RTX, true); x = expand_unop (wider_mode, bswap_optab, x, NULL_RTX, true);
gcc_assert (GET_MODE_PRECISION (wider_mode) == GET_MODE_BITSIZE (wider_mode)
&& GET_MODE_PRECISION (mode) == GET_MODE_BITSIZE (mode));
if (x != 0) if (x != 0)
x = expand_shift (RSHIFT_EXPR, wider_mode, x, x = expand_shift (RSHIFT_EXPR, wider_mode, x,
GET_MODE_BITSIZE (wider_mode) GET_MODE_BITSIZE (wider_mode)

View File

@ -638,6 +638,8 @@ simplify_while_replacing (rtx *loc, rtx to, rtx object,
(GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode) - (GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode) -
offset); offset);
gcc_assert (GET_MODE_PRECISION (wanted_mode)
== GET_MODE_BITSIZE (wanted_mode));
pos %= GET_MODE_BITSIZE (wanted_mode); pos %= GET_MODE_BITSIZE (wanted_mode);
newmem = adjust_address_nv (XEXP (x, 0), wanted_mode, offset); newmem = adjust_address_nv (XEXP (x, 0), wanted_mode, offset);

View File

@ -2389,7 +2389,8 @@ get_best_mode (int bitsize, int bitpos, unsigned int align,
mode = GET_MODE_WIDER_MODE (mode)) mode = GET_MODE_WIDER_MODE (mode))
{ {
unit = GET_MODE_BITSIZE (mode); unit = GET_MODE_BITSIZE (mode);
if ((bitpos % unit) + bitsize <= unit) if (unit == GET_MODE_PRECISION (mode)
&& (bitpos % unit) + bitsize <= unit)
break; break;
} }
@ -2414,7 +2415,8 @@ get_best_mode (int bitsize, int bitpos, unsigned int align,
tmode = GET_MODE_WIDER_MODE (tmode)) tmode = GET_MODE_WIDER_MODE (tmode))
{ {
unit = GET_MODE_BITSIZE (tmode); unit = GET_MODE_BITSIZE (tmode);
if (bitpos / unit == (bitpos + bitsize - 1) / unit if (unit == GET_MODE_PRECISION (tmode)
&& bitpos / unit == (bitpos + bitsize - 1) / unit
&& unit <= BITS_PER_WORD && unit <= BITS_PER_WORD
&& unit <= MIN (align, BIGGEST_ALIGNMENT) && unit <= MIN (align, BIGGEST_ALIGNMENT)
&& (largest_mode == VOIDmode && (largest_mode == VOIDmode