Commit cdd4b0d4 by Arend Bayer Committed by Richard Henderson

fold-const.c (extract_muldiv_1): Rename from extract_muldiv; rearrange mult…

fold-const.c (extract_muldiv_1): Rename from extract_muldiv; rearrange mult arguments for less recursion.

        * fold-const.c (extract_muldiv_1): Rename from extract_muldiv;
        rearrange mult arguments for less recursion.
        (extract_muldiv): New.  Prevent runaway recursion.

Co-Authored-By: Richard Henderson <rth@redhat.com>

From-SVN: r62963
parent 616f273a
2003-02-16 Arend Bayer <arend.bayer@web.de>
Richard Henderson <rth@redhat.com>
* fold-const.c (extract_muldiv_1): Rename from extract_muldiv;
rearrange mult arguments for less recursion.
(extract_muldiv): New. Prevent runaway recursion.
2003-02-16 Danny Smith <dannysmith@users.sourceforge.net>
* config/i386/cygwin.h (TARGET_SUBTARGET_DEFAULT): Set
......
......@@ -104,6 +104,7 @@ static tree unextend PARAMS ((tree, int, int, tree));
static tree fold_truthop PARAMS ((enum tree_code, tree, tree, tree));
static tree optimize_minmax_comparison PARAMS ((tree));
static tree extract_muldiv PARAMS ((tree, tree, enum tree_code, tree));
static tree extract_muldiv_1 PARAMS ((tree, tree, enum tree_code, tree));
static tree strip_compound_expr PARAMS ((tree, tree));
static int multiple_of_p PARAMS ((tree, tree, tree));
static tree constant_boolean_node PARAMS ((int, tree));
......@@ -4046,6 +4047,31 @@ extract_muldiv (t, c, code, wide_type)
enum tree_code code;
tree wide_type;
{
/* To avoid exponential search depth, refuse to allow recursion past
three levels. Beyond that (1) it's highly unlikely that we'll find
something interesting and (2) we've probably processed it before
when we built the inner expression. */
static int depth;
tree ret;
if (depth > 3)
return NULL;
depth++;
ret = extract_muldiv_1 (t, c, code, wide_type);
depth--;
return ret;
}
static tree
extract_muldiv_1 (t, c, code, wide_type)
tree t;
tree c;
enum tree_code code;
tree wide_type;
{
tree type = TREE_TYPE (t);
enum tree_code tcode = TREE_CODE (t);
tree ctype = (wide_type != 0 && (GET_MODE_SIZE (TYPE_MODE (wide_type))
......@@ -4254,6 +4280,14 @@ extract_muldiv (t, c, code, wide_type)
&& integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
return omit_one_operand (type, integer_zero_node, op0);
/* Arrange for the code below to simplify two constants first. */
if (TREE_CODE (op1) == INTEGER_CST && TREE_CODE (op0) != INTEGER_CST)
{
tree tmp = op0;
op0 = op1;
op1 = tmp;
}
/* ... fall through ... */
case TRUNC_DIV_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR:
......
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