[PATCH][match-and-simplify] Get rid of static limit on captures
Richard Biener
rguenther@suse.de
Thu Sep 25 11:34:00 GMT 2014
$subject.
Still not the full-blown idea of dynamically assigning the (internal)
IDs from any number or identifier. Somebody said it would be nice
to write (plus @a @b) instead of (plus @1 @2).
Applied.
Richard.
2014-09-25 Richard Biener <rguenther@suse.de>
* genmatch.c: Keep track of the maximum capture index used
and get rid of the static constant dt_simplify::capture_max.
Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c (revision 215594)
+++ gcc/genmatch.c (working copy)
@@ -483,10 +483,12 @@ struct simplify
{
simplify (operand *match_, source_location match_location_,
struct operand *result_, source_location result_location_,
- vec<if_or_with> ifexpr_vec_, vec<vec<user_id *> > for_vec_)
+ vec<if_or_with> ifexpr_vec_, vec<vec<user_id *> > for_vec_,
+ unsigned capture_max_)
: match (match_), match_location (match_location_),
result (result_), result_location (result_location_),
- ifexpr_vec (ifexpr_vec_), for_vec (for_vec_) {}
+ ifexpr_vec (ifexpr_vec_), for_vec (for_vec_),
+ capture_max (capture_max_) {}
/* The expression that is matched against the GENERIC or GIMPLE IL. */
operand *match;
@@ -502,6 +504,8 @@ struct simplify
/* Collected 'for' expression operators that have to be replaced
in the lowering phase. */
vec<vec<user_id *> > for_vec;
+ /* The maximum capture index seen. */
+ unsigned capture_max;
};
/* Debugging routines for dumping the AST. */
@@ -650,7 +654,7 @@ lower_commutative (simplify *s, vec<simp
{
simplify *ns = new simplify (matchers[i], s->match_location,
s->result, s->result_location, s->ifexpr_vec,
- s->for_vec);
+ s->for_vec, s->capture_max);
simplifiers.safe_push (ns);
}
}
@@ -780,7 +784,7 @@ lower_opt_convert (simplify *s, vec<simp
{
simplify *ns = new simplify (matchers[i], s->match_location,
s->result, s->result_location, s->ifexpr_vec,
- s->for_vec);
+ s->for_vec, s->capture_max);
simplifiers.safe_push (ns);
}
}
@@ -865,7 +869,7 @@ lower_for (simplify *sin, vec<simplify *
}
simplify *ns = new simplify (match_op, s->match_location,
result_op, s->result_location,
- ifexpr_vec, vNULL);
+ ifexpr_vec, vNULL, s->capture_max);
worklist.safe_push (ns);
}
}
@@ -951,17 +955,13 @@ struct dt_operand : public dt_node
struct dt_simplify : public dt_node
{
- static const unsigned capture_max = 6;
simplify *s;
unsigned pattern_no;
- dt_operand *indexes[capture_max];
+ dt_operand **indexes;
dt_simplify (simplify *s_, unsigned pattern_no_, dt_operand **indexes_)
- : dt_node (DT_SIMPLIFY), s (s_), pattern_no (pattern_no_)
- {
- for (unsigned i = 0; i < capture_max; ++i)
- indexes[i] = indexes_[i];
- }
+ : dt_node (DT_SIMPLIFY), s (s_), pattern_no (pattern_no_),
+ indexes (indexes_) {}
void gen (FILE *f, bool);
virtual void gen_gimple (FILE *f) { gen (f, true); }
@@ -1190,14 +1190,10 @@ at_assert_elm:
void
decision_tree::insert (struct simplify *s, unsigned pattern_no)
{
- dt_operand *indexes[dt_simplify::capture_max];
-
if (s->match->type != operand::OP_EXPR)
return;
- for (unsigned j = 0; j < dt_simplify::capture_max; ++j)
- indexes[j] = 0;
-
+ dt_operand **indexes = XCNEWVEC (dt_operand *, s->capture_max + 1);
dt_node *p = decision_tree::insert_operand (root, s->match, indexes);
p->append_simplify (s, pattern_no, indexes);
}
@@ -1228,7 +1224,7 @@ decision_tree::print_node (dt_node *p, F
{
dt_simplify *s = static_cast<dt_simplify *> (p);
fprintf (f, "simplify_%u { ", s->pattern_no);
- for (unsigned i = 0; i < dt_simplify::capture_max; ++i)
+ for (unsigned i = 0; i <= s->s->capture_max; ++i)
fprintf (f, "%p, ", (void *) s->indexes[i]);
fprintf (f, " } ");
}
@@ -1945,9 +1941,9 @@ dt_simplify::gen (FILE *f, bool gimple)
fprintf (f, "{\n");
output_line_directive (f, s->result_location);
fprintf (f, "tree captures[%u] ATTRIBUTE_UNUSED = {};\n",
- dt_simplify::capture_max);
+ s->capture_max + 1);
- for (unsigned i = 0; i < dt_simplify::capture_max; ++i)
+ for (unsigned i = 0; i <= s->capture_max; ++i)
if (indexes[i])
{
char opname[20];
@@ -2284,6 +2280,7 @@ private:
cpp_reader *r;
vec<if_or_with> active_ifs;
vec<vec<user_id *> > active_fors;
+ unsigned capture_max;
public:
vec<simplify *> simplifiers;
@@ -2451,7 +2448,12 @@ struct operand *
parser::parse_capture (operand *op)
{
eat_token (CPP_ATSIGN);
- return new capture (get_number (), op);
+ /* ??? Ideally we'd accept any identifier or number here
+ and dynamically assign an index to them. */
+ const char *id = get_number ();
+ if ((unsigned) atoi (id) > capture_max)
+ capture_max = atoi (id);
+ return new capture (id, op);
}
/* Parse an expression
@@ -2630,6 +2632,9 @@ void
parser::parse_simplify (source_location match_location,
vec<simplify *>& simplifiers, predicate_id *matcher)
{
+ /* Reset the maximum capture number seen. */
+ capture_max = 0;
+
const cpp_token *loc = peek ();
struct operand *match = parse_op ();
if (match->type == operand::OP_CAPTURE && !matcher)
@@ -2652,7 +2657,8 @@ parser::parse_simplify (source_location
matcher->nargs = 0;
simplifiers.safe_push
(new simplify (match, match_location, NULL, token->src_loc,
- active_ifs.copy (), active_fors.copy ()));
+ active_ifs.copy (), active_fors.copy (),
+ capture_max));
return;
}
@@ -2682,7 +2688,7 @@ parser::parse_simplify (source_location
simplifiers.safe_push
(new simplify (match, match_location, NULL,
paren_loc, active_ifs.copy (),
- active_fors.copy ()));
+ active_fors.copy (), capture_max));
}
}
else if (peek_ident ("with"))
@@ -2711,7 +2717,7 @@ parser::parse_simplify (source_location
simplifiers.safe_push
(new simplify (match, match_location, op,
token->src_loc, active_ifs.copy (),
- active_fors.copy ()));
+ active_fors.copy (), capture_max));
eat_token (CPP_CLOSE_PAREN);
/* A "default" result closes the enclosing scope. */
if (active_ifs.length () > active_ifs_len)
@@ -2742,7 +2748,7 @@ parser::parse_simplify (source_location
simplifiers.safe_push
(new simplify (match, match_location, parse_op (),
token->src_loc, active_ifs.copy (),
- active_fors.copy ()));
+ active_fors.copy (), capture_max));
/* A "default" result closes the enclosing scope. */
if (active_ifs.length () > active_ifs_len)
{
More information about the Gcc-patches
mailing list