fold-const.c (extract_muldiv): Check whether c divides op1 exactly if operation is not multiplication.

2000-07-08  Toon Moene  <toon@moene.indiv.nluug.nl>

	* fold-const.c (extract_muldiv) case PLUS_EXPR, MINUS_EXPR:
	Check whether c divides op1 exactly if operation is not
	multiplication.

From-SVN: r34928
This commit is contained in:
Toon Moene 2000-07-09 00:29:17 +02:00 committed by Toon Moene
parent 0ac76ad9eb
commit 12644a9a40
2 changed files with 17 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2000-07-08 Toon Moene <toon@moene.indiv.nluug.nl>
* fold-const.c (extract_muldiv) case PLUS_EXPR, MINUS_EXPR:
Check whether c divides op1 exactly if operation is not
multiplication.
2000-07-08 Richard Henderson <rth@cygnus.com>
* final.c (final): Do not abort when reg-stack introduces

View File

@ -4501,10 +4501,17 @@ extract_muldiv (t, c, code, wide_type)
break;
}
/* Now do the operation and verify it doesn't overflow. */
op1 = const_binop (code, convert (ctype, op1), convert (ctype, c), 0);
if (op1 == 0 || TREE_OVERFLOW (op1))
break;
/* If it's a multiply or a division/modulus operation of a multiple
of our constant, do the operation and verify it doesn't overflow. */
if (code == MULT_EXPR
|| integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
{
op1 = const_binop (code, convert (ctype, op1), convert (ctype, c), 0);
if (op1 == 0 || TREE_OVERFLOW (op1))
break;
}
else
break;
/* If we have an unsigned type is not a sizetype, we cannot widen
the operation since it will change the result if the original