2015-11-26 Paolo Bonzini <bonzini@gnu.org>
[official-gcc.git] / gcc / genmatch.c
blob76c8f1fa1e260e1f550d3d541e959d51947aa013
1 /* Generate pattern matching and transform code shared between
2 GENERIC and GIMPLE folding code from match-and-simplify description.
4 Copyright (C) 2014-2015 Free Software Foundation, Inc.
5 Contributed by Richard Biener <rguenther@suse.de>
6 and Prathamesh Kulkarni <bilbotheelffriend@gmail.com>
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 3, or (at your option) any later
13 version.
15 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
24 #include "bconfig.h"
25 #include <new>
26 #include "system.h"
27 #include "coretypes.h"
28 #include <cpplib.h>
29 #include "errors.h"
30 #include "hash-table.h"
31 #include "hash-set.h"
32 #include "is-a.h"
35 /* Stubs for GGC referenced through instantiations triggered by hash-map. */
36 void *ggc_internal_cleared_alloc (size_t, void (*)(void *),
37 size_t, size_t MEM_STAT_DECL)
39 return NULL;
41 void ggc_free (void *)
46 /* Global state. */
48 /* Verboseness. 0 is quiet, 1 adds some warnings, 2 is for debugging. */
49 unsigned verbose;
52 /* libccp helpers. */
54 static struct line_maps *line_table;
56 /* The rich_location class within libcpp requires a way to expand
57 source_location instances, and relies on the client code
58 providing a symbol named
59 linemap_client_expand_location_to_spelling_point
60 to do this.
62 This is the implementation for genmatch. */
64 expanded_location
65 linemap_client_expand_location_to_spelling_point (source_location loc)
67 const struct line_map_ordinary *map;
68 loc = linemap_resolve_location (line_table, loc, LRK_SPELLING_LOCATION, &map);
69 return linemap_expand_location (line_table, map, loc);
72 static bool
73 #if GCC_VERSION >= 4001
74 __attribute__((format (printf, 5, 0)))
75 #endif
76 error_cb (cpp_reader *, int errtype, int, rich_location *richloc,
77 const char *msg, va_list *ap)
79 const line_map_ordinary *map;
80 source_location location = richloc->get_loc ();
81 linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
82 expanded_location loc = linemap_expand_location (line_table, map, location);
83 fprintf (stderr, "%s:%d:%d %s: ", loc.file, loc.line, loc.column,
84 (errtype == CPP_DL_WARNING) ? "warning" : "error");
85 vfprintf (stderr, msg, *ap);
86 fprintf (stderr, "\n");
87 FILE *f = fopen (loc.file, "r");
88 if (f)
90 char buf[128];
91 while (loc.line > 0)
93 if (!fgets (buf, 128, f))
94 goto notfound;
95 if (buf[strlen (buf) - 1] != '\n')
97 if (loc.line > 1)
98 loc.line++;
100 loc.line--;
102 fprintf (stderr, "%s", buf);
103 for (int i = 0; i < loc.column - 1; ++i)
104 fputc (' ', stderr);
105 fputc ('^', stderr);
106 fputc ('\n', stderr);
107 notfound:
108 fclose (f);
111 if (errtype == CPP_DL_FATAL)
112 exit (1);
113 return false;
116 static void
117 #if GCC_VERSION >= 4001
118 __attribute__((format (printf, 2, 3)))
119 #endif
120 fatal_at (const cpp_token *tk, const char *msg, ...)
122 rich_location richloc (line_table, tk->src_loc);
123 va_list ap;
124 va_start (ap, msg);
125 error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap);
126 va_end (ap);
129 static void
130 #if GCC_VERSION >= 4001
131 __attribute__((format (printf, 2, 3)))
132 #endif
133 fatal_at (source_location loc, const char *msg, ...)
135 rich_location richloc (line_table, loc);
136 va_list ap;
137 va_start (ap, msg);
138 error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap);
139 va_end (ap);
142 static void
143 #if GCC_VERSION >= 4001
144 __attribute__((format (printf, 2, 3)))
145 #endif
146 warning_at (const cpp_token *tk, const char *msg, ...)
148 rich_location richloc (line_table, tk->src_loc);
149 va_list ap;
150 va_start (ap, msg);
151 error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap);
152 va_end (ap);
155 static void
156 #if GCC_VERSION >= 4001
157 __attribute__((format (printf, 2, 3)))
158 #endif
159 warning_at (source_location loc, const char *msg, ...)
161 rich_location richloc (line_table, loc);
162 va_list ap;
163 va_start (ap, msg);
164 error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap);
165 va_end (ap);
168 /* Like fprintf, but print INDENT spaces at the beginning. */
170 static void
171 #if GCC_VERSION >= 4001
172 __attribute__((format (printf, 3, 4)))
173 #endif
174 fprintf_indent (FILE *f, unsigned int indent, const char *format, ...)
176 va_list ap;
177 for (; indent >= 8; indent -= 8)
178 fputc ('\t', f);
179 fprintf (f, "%*s", indent, "");
180 va_start (ap, format);
181 vfprintf (f, format, ap);
182 va_end (ap);
185 static void
186 output_line_directive (FILE *f, source_location location,
187 bool dumpfile = false)
189 const line_map_ordinary *map;
190 linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
191 expanded_location loc = linemap_expand_location (line_table, map, location);
192 if (dumpfile)
194 /* When writing to a dumpfile only dump the filename. */
195 const char *file = strrchr (loc.file, DIR_SEPARATOR);
196 if (!file)
197 file = loc.file;
198 else
199 ++file;
200 fprintf (f, "%s:%d", file, loc.line);
202 else
203 /* Other gen programs really output line directives here, at least for
204 development it's right now more convenient to have line information
205 from the generated file. Still keep the directives as comment for now
206 to easily back-point to the meta-description. */
207 fprintf (f, "/* #line %d \"%s\" */\n", loc.line, loc.file);
211 /* Pull in tree codes and builtin function codes from their
212 definition files. */
214 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM,
215 enum tree_code {
216 #include "tree.def"
217 CONVERT0,
218 CONVERT1,
219 CONVERT2,
220 VIEW_CONVERT0,
221 VIEW_CONVERT1,
222 VIEW_CONVERT2,
223 MAX_TREE_CODES
225 #undef DEFTREECODE
227 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
228 enum built_in_function {
229 #include "builtins.def"
230 END_BUILTINS
233 #define DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) IFN_##CODE,
234 enum internal_fn {
235 #include "internal-fn.def"
236 IFN_LAST
239 /* Return true if CODE represents a commutative tree code. Otherwise
240 return false. */
241 bool
242 commutative_tree_code (enum tree_code code)
244 switch (code)
246 case PLUS_EXPR:
247 case MULT_EXPR:
248 case MULT_HIGHPART_EXPR:
249 case MIN_EXPR:
250 case MAX_EXPR:
251 case BIT_IOR_EXPR:
252 case BIT_XOR_EXPR:
253 case BIT_AND_EXPR:
254 case NE_EXPR:
255 case EQ_EXPR:
256 case UNORDERED_EXPR:
257 case ORDERED_EXPR:
258 case UNEQ_EXPR:
259 case LTGT_EXPR:
260 case TRUTH_AND_EXPR:
261 case TRUTH_XOR_EXPR:
262 case TRUTH_OR_EXPR:
263 case WIDEN_MULT_EXPR:
264 case VEC_WIDEN_MULT_HI_EXPR:
265 case VEC_WIDEN_MULT_LO_EXPR:
266 case VEC_WIDEN_MULT_EVEN_EXPR:
267 case VEC_WIDEN_MULT_ODD_EXPR:
268 return true;
270 default:
271 break;
273 return false;
276 /* Return true if CODE represents a ternary tree code for which the
277 first two operands are commutative. Otherwise return false. */
278 bool
279 commutative_ternary_tree_code (enum tree_code code)
281 switch (code)
283 case WIDEN_MULT_PLUS_EXPR:
284 case WIDEN_MULT_MINUS_EXPR:
285 case DOT_PROD_EXPR:
286 case FMA_EXPR:
287 return true;
289 default:
290 break;
292 return false;
296 /* Base class for all identifiers the parser knows. */
298 struct id_base : nofree_ptr_hash<id_base>
300 enum id_kind { CODE, FN, PREDICATE, USER, NULL_ID } kind;
302 id_base (id_kind, const char *, int = -1);
304 hashval_t hashval;
305 int nargs;
306 const char *id;
308 /* hash_table support. */
309 static inline hashval_t hash (const id_base *);
310 static inline int equal (const id_base *, const id_base *);
313 inline hashval_t
314 id_base::hash (const id_base *op)
316 return op->hashval;
319 inline int
320 id_base::equal (const id_base *op1,
321 const id_base *op2)
323 return (op1->hashval == op2->hashval
324 && strcmp (op1->id, op2->id) == 0);
327 /* The special id "null", which matches nothing. */
328 static id_base *null_id;
330 /* Hashtable of known pattern operators. This is pre-seeded from
331 all known tree codes and all known builtin function ids. */
332 static hash_table<id_base> *operators;
334 id_base::id_base (id_kind kind_, const char *id_, int nargs_)
336 kind = kind_;
337 id = id_;
338 nargs = nargs_;
339 hashval = htab_hash_string (id);
342 /* Identifier that maps to a tree code. */
344 struct operator_id : public id_base
346 operator_id (enum tree_code code_, const char *id_, unsigned nargs_,
347 const char *tcc_)
348 : id_base (id_base::CODE, id_, nargs_), code (code_), tcc (tcc_) {}
349 enum tree_code code;
350 const char *tcc;
353 /* Identifier that maps to a builtin or internal function code. */
355 struct fn_id : public id_base
357 fn_id (enum built_in_function fn_, const char *id_)
358 : id_base (id_base::FN, id_), fn (fn_) {}
359 fn_id (enum internal_fn fn_, const char *id_)
360 : id_base (id_base::FN, id_), fn (int (END_BUILTINS) + int (fn_)) {}
361 unsigned int fn;
364 struct simplify;
366 /* Identifier that maps to a user-defined predicate. */
368 struct predicate_id : public id_base
370 predicate_id (const char *id_)
371 : id_base (id_base::PREDICATE, id_), matchers (vNULL) {}
372 vec<simplify *> matchers;
375 /* Identifier that maps to a operator defined by a 'for' directive. */
377 struct user_id : public id_base
379 user_id (const char *id_, bool is_oper_list_ = false)
380 : id_base (id_base::USER, id_), substitutes (vNULL),
381 used (false), is_oper_list (is_oper_list_) {}
382 vec<id_base *> substitutes;
383 bool used;
384 bool is_oper_list;
387 template<>
388 template<>
389 inline bool
390 is_a_helper <fn_id *>::test (id_base *id)
392 return id->kind == id_base::FN;
395 template<>
396 template<>
397 inline bool
398 is_a_helper <operator_id *>::test (id_base *id)
400 return id->kind == id_base::CODE;
403 template<>
404 template<>
405 inline bool
406 is_a_helper <predicate_id *>::test (id_base *id)
408 return id->kind == id_base::PREDICATE;
411 template<>
412 template<>
413 inline bool
414 is_a_helper <user_id *>::test (id_base *id)
416 return id->kind == id_base::USER;
419 /* Add a predicate identifier to the hash. */
421 static predicate_id *
422 add_predicate (const char *id)
424 predicate_id *p = new predicate_id (id);
425 id_base **slot = operators->find_slot_with_hash (p, p->hashval, INSERT);
426 if (*slot)
427 fatal ("duplicate id definition");
428 *slot = p;
429 return p;
432 /* Add a tree code identifier to the hash. */
434 static void
435 add_operator (enum tree_code code, const char *id,
436 const char *tcc, unsigned nargs)
438 if (strcmp (tcc, "tcc_unary") != 0
439 && strcmp (tcc, "tcc_binary") != 0
440 && strcmp (tcc, "tcc_comparison") != 0
441 && strcmp (tcc, "tcc_expression") != 0
442 /* For {REAL,IMAG}PART_EXPR and VIEW_CONVERT_EXPR. */
443 && strcmp (tcc, "tcc_reference") != 0
444 /* To have INTEGER_CST and friends as "predicate operators". */
445 && strcmp (tcc, "tcc_constant") != 0
446 /* And allow CONSTRUCTOR for vector initializers. */
447 && !(code == CONSTRUCTOR)
448 /* Allow SSA_NAME as predicate operator. */
449 && !(code == SSA_NAME))
450 return;
451 /* Treat ADDR_EXPR as atom, thus don't allow matching its operand. */
452 if (code == ADDR_EXPR)
453 nargs = 0;
454 operator_id *op = new operator_id (code, id, nargs, tcc);
455 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
456 if (*slot)
457 fatal ("duplicate id definition");
458 *slot = op;
461 /* Add a built-in or internal function identifier to the hash. ID is
462 the name of its CFN_* enumeration value. */
464 template <typename T>
465 static void
466 add_function (T code, const char *id)
468 fn_id *fn = new fn_id (code, id);
469 id_base **slot = operators->find_slot_with_hash (fn, fn->hashval, INSERT);
470 if (*slot)
471 fatal ("duplicate id definition");
472 *slot = fn;
475 /* Helper for easy comparing ID with tree code CODE. */
477 static bool
478 operator==(id_base &id, enum tree_code code)
480 if (operator_id *oid = dyn_cast <operator_id *> (&id))
481 return oid->code == code;
482 return false;
485 /* Lookup the identifier ID. Allow "null" if ALLOW_NULL. */
487 id_base *
488 get_operator (const char *id, bool allow_null = false)
490 if (allow_null && strcmp (id, "null") == 0)
491 return null_id;
493 id_base tem (id_base::CODE, id);
495 id_base *op = operators->find_with_hash (&tem, tem.hashval);
496 if (op)
498 /* If this is a user-defined identifier track whether it was used. */
499 if (user_id *uid = dyn_cast<user_id *> (op))
500 uid->used = true;
501 return op;
504 char *id2;
505 bool all_upper = true;
506 bool all_lower = true;
507 for (unsigned int i = 0; id[i]; ++i)
508 if (ISUPPER (id[i]))
509 all_lower = false;
510 else if (ISLOWER (id[i]))
511 all_upper = false;
512 if (all_lower)
514 /* Try in caps with _EXPR appended. */
515 id2 = ACONCAT ((id, "_EXPR", NULL));
516 for (unsigned int i = 0; id2[i]; ++i)
517 id2[i] = TOUPPER (id2[i]);
519 else if (all_upper && strncmp (id, "IFN_", 4) == 0)
520 /* Try CFN_ instead of IFN_. */
521 id2 = ACONCAT (("CFN_", id + 4, NULL));
522 else if (all_upper && strncmp (id, "BUILT_IN_", 9) == 0)
523 /* Try prepending CFN_. */
524 id2 = ACONCAT (("CFN_", id, NULL));
525 else
526 return NULL;
528 new (&tem) id_base (id_base::CODE, id2);
529 return operators->find_with_hash (&tem, tem.hashval);
532 typedef hash_map<nofree_string_hash, unsigned> cid_map_t;
535 /* The AST produced by parsing of the pattern definitions. */
537 struct dt_operand;
538 struct capture_info;
540 /* The base class for operands. */
542 struct operand {
543 enum op_type { OP_PREDICATE, OP_EXPR, OP_CAPTURE, OP_C_EXPR, OP_IF, OP_WITH };
544 operand (enum op_type type_, source_location loc_)
545 : type (type_), location (loc_) {}
546 enum op_type type;
547 source_location location;
548 virtual void gen_transform (FILE *, int, const char *, bool, int,
549 const char *, capture_info *,
550 dt_operand ** = 0,
551 bool = true)
552 { gcc_unreachable (); }
555 /* A predicate operand. Predicates are leafs in the AST. */
557 struct predicate : public operand
559 predicate (predicate_id *p_, source_location loc)
560 : operand (OP_PREDICATE, loc), p (p_) {}
561 predicate_id *p;
564 /* An operand that constitutes an expression. Expressions include
565 function calls and user-defined predicate invocations. */
567 struct expr : public operand
569 expr (id_base *operation_, source_location loc, bool is_commutative_ = false)
570 : operand (OP_EXPR, loc), operation (operation_),
571 ops (vNULL), expr_type (NULL), is_commutative (is_commutative_),
572 is_generic (false), force_single_use (false) {}
573 expr (expr *e)
574 : operand (OP_EXPR, e->location), operation (e->operation),
575 ops (vNULL), expr_type (e->expr_type), is_commutative (e->is_commutative),
576 is_generic (e->is_generic), force_single_use (e->force_single_use) {}
577 void append_op (operand *op) { ops.safe_push (op); }
578 /* The operator and its operands. */
579 id_base *operation;
580 vec<operand *> ops;
581 /* An explicitely specified type - used exclusively for conversions. */
582 const char *expr_type;
583 /* Whether the operation is to be applied commutatively. This is
584 later lowered to two separate patterns. */
585 bool is_commutative;
586 /* Whether the expression is expected to be in GENERIC form. */
587 bool is_generic;
588 /* Whether pushing any stmt to the sequence should be conditional
589 on this expression having a single-use. */
590 bool force_single_use;
591 virtual void gen_transform (FILE *f, int, const char *, bool, int,
592 const char *, capture_info *,
593 dt_operand ** = 0, bool = true);
596 /* An operator that is represented by native C code. This is always
597 a leaf operand in the AST. This class is also used to represent
598 the code to be generated for 'if' and 'with' expressions. */
600 struct c_expr : public operand
602 /* A mapping of an identifier and its replacement. Used to apply
603 'for' lowering. */
604 struct id_tab {
605 const char *id;
606 const char *oper;
607 id_tab (const char *id_, const char *oper_): id (id_), oper (oper_) {}
610 c_expr (cpp_reader *r_, source_location loc,
611 vec<cpp_token> code_, unsigned nr_stmts_,
612 vec<id_tab> ids_, cid_map_t *capture_ids_)
613 : operand (OP_C_EXPR, loc), r (r_), code (code_),
614 capture_ids (capture_ids_), nr_stmts (nr_stmts_), ids (ids_) {}
615 /* cpplib tokens and state to transform this back to source. */
616 cpp_reader *r;
617 vec<cpp_token> code;
618 cid_map_t *capture_ids;
619 /* The number of statements parsed (well, the number of ';'s). */
620 unsigned nr_stmts;
621 /* The identifier replacement vector. */
622 vec<id_tab> ids;
623 virtual void gen_transform (FILE *f, int, const char *, bool, int,
624 const char *, capture_info *,
625 dt_operand ** = 0, bool = true);
628 /* A wrapper around another operand that captures its value. */
630 struct capture : public operand
632 capture (source_location loc, unsigned where_, operand *what_)
633 : operand (OP_CAPTURE, loc), where (where_), what (what_) {}
634 /* Identifier index for the value. */
635 unsigned where;
636 /* The captured value. */
637 operand *what;
638 virtual void gen_transform (FILE *f, int, const char *, bool, int,
639 const char *, capture_info *,
640 dt_operand ** = 0, bool = true);
643 /* if expression. */
645 struct if_expr : public operand
647 if_expr (source_location loc)
648 : operand (OP_IF, loc), cond (NULL), trueexpr (NULL), falseexpr (NULL) {}
649 c_expr *cond;
650 operand *trueexpr;
651 operand *falseexpr;
654 /* with expression. */
656 struct with_expr : public operand
658 with_expr (source_location loc)
659 : operand (OP_WITH, loc), with (NULL), subexpr (NULL) {}
660 c_expr *with;
661 operand *subexpr;
664 template<>
665 template<>
666 inline bool
667 is_a_helper <capture *>::test (operand *op)
669 return op->type == operand::OP_CAPTURE;
672 template<>
673 template<>
674 inline bool
675 is_a_helper <predicate *>::test (operand *op)
677 return op->type == operand::OP_PREDICATE;
680 template<>
681 template<>
682 inline bool
683 is_a_helper <c_expr *>::test (operand *op)
685 return op->type == operand::OP_C_EXPR;
688 template<>
689 template<>
690 inline bool
691 is_a_helper <expr *>::test (operand *op)
693 return op->type == operand::OP_EXPR;
696 template<>
697 template<>
698 inline bool
699 is_a_helper <if_expr *>::test (operand *op)
701 return op->type == operand::OP_IF;
704 template<>
705 template<>
706 inline bool
707 is_a_helper <with_expr *>::test (operand *op)
709 return op->type == operand::OP_WITH;
712 /* The main class of a pattern and its transform. This is used to
713 represent both (simplify ...) and (match ...) kinds. The AST
714 duplicates all outer 'if' and 'for' expressions here so each
715 simplify can exist in isolation. */
717 struct simplify
719 enum simplify_kind { SIMPLIFY, MATCH };
721 simplify (simplify_kind kind_, operand *match_, operand *result_,
722 vec<vec<user_id *> > for_vec_, cid_map_t *capture_ids_)
723 : kind (kind_), match (match_), result (result_),
724 for_vec (for_vec_), for_subst_vec (vNULL),
725 capture_ids (capture_ids_), capture_max (capture_ids_->elements () - 1) {}
727 simplify_kind kind;
728 /* The expression that is matched against the GENERIC or GIMPLE IL. */
729 operand *match;
730 /* For a (simplify ...) an expression with ifs and withs with the expression
731 produced when the pattern applies in the leafs.
732 For a (match ...) the leafs are either empty if it is a simple predicate
733 or the single expression specifying the matched operands. */
734 struct operand *result;
735 /* Collected 'for' expression operators that have to be replaced
736 in the lowering phase. */
737 vec<vec<user_id *> > for_vec;
738 vec<std::pair<user_id *, id_base *> > for_subst_vec;
739 /* A map of capture identifiers to indexes. */
740 cid_map_t *capture_ids;
741 int capture_max;
744 /* Debugging routines for dumping the AST. */
746 DEBUG_FUNCTION void
747 print_operand (operand *o, FILE *f = stderr, bool flattened = false)
749 if (capture *c = dyn_cast<capture *> (o))
751 if (c->what && flattened == false)
752 print_operand (c->what, f, flattened);
753 fprintf (f, "@%u", c->where);
756 else if (predicate *p = dyn_cast<predicate *> (o))
757 fprintf (f, "%s", p->p->id);
759 else if (is_a<c_expr *> (o))
760 fprintf (f, "c_expr");
762 else if (expr *e = dyn_cast<expr *> (o))
764 if (e->ops.length () == 0)
765 fprintf (f, "%s", e->operation->id);
766 else
768 fprintf (f, "(%s", e->operation->id);
770 if (flattened == false)
772 for (unsigned i = 0; i < e->ops.length (); ++i)
774 putc (' ', f);
775 print_operand (e->ops[i], f, flattened);
778 putc (')', f);
782 else
783 gcc_unreachable ();
786 DEBUG_FUNCTION void
787 print_matches (struct simplify *s, FILE *f = stderr)
789 fprintf (f, "for expression: ");
790 print_operand (s->match, f);
791 putc ('\n', f);
795 /* AST lowering. */
797 /* Lowering of commutative operators. */
799 static void
800 cartesian_product (const vec< vec<operand *> >& ops_vector,
801 vec< vec<operand *> >& result, vec<operand *>& v, unsigned n)
803 if (n == ops_vector.length ())
805 vec<operand *> xv = v.copy ();
806 result.safe_push (xv);
807 return;
810 for (unsigned i = 0; i < ops_vector[n].length (); ++i)
812 v[n] = ops_vector[n][i];
813 cartesian_product (ops_vector, result, v, n + 1);
817 /* Lower OP to two operands in case it is marked as commutative. */
819 static vec<operand *>
820 commutate (operand *op)
822 vec<operand *> ret = vNULL;
824 if (capture *c = dyn_cast <capture *> (op))
826 if (!c->what)
828 ret.safe_push (op);
829 return ret;
831 vec<operand *> v = commutate (c->what);
832 for (unsigned i = 0; i < v.length (); ++i)
834 capture *nc = new capture (c->location, c->where, v[i]);
835 ret.safe_push (nc);
837 return ret;
840 expr *e = dyn_cast <expr *> (op);
841 if (!e || e->ops.length () == 0)
843 ret.safe_push (op);
844 return ret;
847 vec< vec<operand *> > ops_vector = vNULL;
848 for (unsigned i = 0; i < e->ops.length (); ++i)
849 ops_vector.safe_push (commutate (e->ops[i]));
851 auto_vec< vec<operand *> > result;
852 auto_vec<operand *> v (e->ops.length ());
853 v.quick_grow_cleared (e->ops.length ());
854 cartesian_product (ops_vector, result, v, 0);
857 for (unsigned i = 0; i < result.length (); ++i)
859 expr *ne = new expr (e);
860 ne->is_commutative = false;
861 for (unsigned j = 0; j < result[i].length (); ++j)
862 ne->append_op (result[i][j]);
863 ret.safe_push (ne);
866 if (!e->is_commutative)
867 return ret;
869 for (unsigned i = 0; i < result.length (); ++i)
871 expr *ne = new expr (e);
872 ne->is_commutative = false;
873 // result[i].length () is 2 since e->operation is binary
874 for (unsigned j = result[i].length (); j; --j)
875 ne->append_op (result[i][j-1]);
876 ret.safe_push (ne);
879 return ret;
882 /* Lower operations marked as commutative in the AST of S and push
883 the resulting patterns to SIMPLIFIERS. */
885 static void
886 lower_commutative (simplify *s, vec<simplify *>& simplifiers)
888 vec<operand *> matchers = commutate (s->match);
889 for (unsigned i = 0; i < matchers.length (); ++i)
891 simplify *ns = new simplify (s->kind, matchers[i], s->result,
892 s->for_vec, s->capture_ids);
893 simplifiers.safe_push (ns);
897 /* Strip conditional conversios using operator OPER from O and its
898 children if STRIP, else replace them with an unconditional convert. */
900 operand *
901 lower_opt_convert (operand *o, enum tree_code oper,
902 enum tree_code to_oper, bool strip)
904 if (capture *c = dyn_cast<capture *> (o))
906 if (c->what)
907 return new capture (c->location, c->where,
908 lower_opt_convert (c->what, oper, to_oper, strip));
909 else
910 return c;
913 expr *e = dyn_cast<expr *> (o);
914 if (!e)
915 return o;
917 if (*e->operation == oper)
919 if (strip)
920 return lower_opt_convert (e->ops[0], oper, to_oper, strip);
922 expr *ne = new expr (e);
923 ne->operation = (to_oper == CONVERT_EXPR
924 ? get_operator ("CONVERT_EXPR")
925 : get_operator ("VIEW_CONVERT_EXPR"));
926 ne->append_op (lower_opt_convert (e->ops[0], oper, to_oper, strip));
927 return ne;
930 expr *ne = new expr (e);
931 for (unsigned i = 0; i < e->ops.length (); ++i)
932 ne->append_op (lower_opt_convert (e->ops[i], oper, to_oper, strip));
934 return ne;
937 /* Determine whether O or its children uses the conditional conversion
938 operator OPER. */
940 static bool
941 has_opt_convert (operand *o, enum tree_code oper)
943 if (capture *c = dyn_cast<capture *> (o))
945 if (c->what)
946 return has_opt_convert (c->what, oper);
947 else
948 return false;
951 expr *e = dyn_cast<expr *> (o);
952 if (!e)
953 return false;
955 if (*e->operation == oper)
956 return true;
958 for (unsigned i = 0; i < e->ops.length (); ++i)
959 if (has_opt_convert (e->ops[i], oper))
960 return true;
962 return false;
965 /* Lower conditional convert operators in O, expanding it to a vector
966 if required. */
968 static vec<operand *>
969 lower_opt_convert (operand *o)
971 vec<operand *> v1 = vNULL, v2;
973 v1.safe_push (o);
975 enum tree_code opers[]
976 = { CONVERT0, CONVERT_EXPR,
977 CONVERT1, CONVERT_EXPR,
978 CONVERT2, CONVERT_EXPR,
979 VIEW_CONVERT0, VIEW_CONVERT_EXPR,
980 VIEW_CONVERT1, VIEW_CONVERT_EXPR,
981 VIEW_CONVERT2, VIEW_CONVERT_EXPR };
983 /* Conditional converts are lowered to a pattern with the
984 conversion and one without. The three different conditional
985 convert codes are lowered separately. */
987 for (unsigned i = 0; i < sizeof (opers) / sizeof (enum tree_code); i += 2)
989 v2 = vNULL;
990 for (unsigned j = 0; j < v1.length (); ++j)
991 if (has_opt_convert (v1[j], opers[i]))
993 v2.safe_push (lower_opt_convert (v1[j],
994 opers[i], opers[i+1], false));
995 v2.safe_push (lower_opt_convert (v1[j],
996 opers[i], opers[i+1], true));
999 if (v2 != vNULL)
1001 v1 = vNULL;
1002 for (unsigned j = 0; j < v2.length (); ++j)
1003 v1.safe_push (v2[j]);
1007 return v1;
1010 /* Lower conditional convert operators in the AST of S and push
1011 the resulting multiple patterns to SIMPLIFIERS. */
1013 static void
1014 lower_opt_convert (simplify *s, vec<simplify *>& simplifiers)
1016 vec<operand *> matchers = lower_opt_convert (s->match);
1017 for (unsigned i = 0; i < matchers.length (); ++i)
1019 simplify *ns = new simplify (s->kind, matchers[i], s->result,
1020 s->for_vec, s->capture_ids);
1021 simplifiers.safe_push (ns);
1025 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
1026 GENERIC and a GIMPLE variant. */
1028 static vec<operand *>
1029 lower_cond (operand *o)
1031 vec<operand *> ro = vNULL;
1033 if (capture *c = dyn_cast<capture *> (o))
1035 if (c->what)
1037 vec<operand *> lop = vNULL;
1038 lop = lower_cond (c->what);
1040 for (unsigned i = 0; i < lop.length (); ++i)
1041 ro.safe_push (new capture (c->location, c->where, lop[i]));
1042 return ro;
1046 expr *e = dyn_cast<expr *> (o);
1047 if (!e || e->ops.length () == 0)
1049 ro.safe_push (o);
1050 return ro;
1053 vec< vec<operand *> > ops_vector = vNULL;
1054 for (unsigned i = 0; i < e->ops.length (); ++i)
1055 ops_vector.safe_push (lower_cond (e->ops[i]));
1057 auto_vec< vec<operand *> > result;
1058 auto_vec<operand *> v (e->ops.length ());
1059 v.quick_grow_cleared (e->ops.length ());
1060 cartesian_product (ops_vector, result, v, 0);
1062 for (unsigned i = 0; i < result.length (); ++i)
1064 expr *ne = new expr (e);
1065 for (unsigned j = 0; j < result[i].length (); ++j)
1066 ne->append_op (result[i][j]);
1067 ro.safe_push (ne);
1068 /* If this is a COND with a captured expression or an
1069 expression with two operands then also match a GENERIC
1070 form on the compare. */
1071 if ((*e->operation == COND_EXPR
1072 || *e->operation == VEC_COND_EXPR)
1073 && ((is_a <capture *> (e->ops[0])
1074 && as_a <capture *> (e->ops[0])->what
1075 && is_a <expr *> (as_a <capture *> (e->ops[0])->what)
1076 && as_a <expr *>
1077 (as_a <capture *> (e->ops[0])->what)->ops.length () == 2)
1078 || (is_a <expr *> (e->ops[0])
1079 && as_a <expr *> (e->ops[0])->ops.length () == 2)))
1081 expr *ne = new expr (e);
1082 for (unsigned j = 0; j < result[i].length (); ++j)
1083 ne->append_op (result[i][j]);
1084 if (capture *c = dyn_cast <capture *> (ne->ops[0]))
1086 expr *ocmp = as_a <expr *> (c->what);
1087 expr *cmp = new expr (ocmp);
1088 for (unsigned j = 0; j < ocmp->ops.length (); ++j)
1089 cmp->append_op (ocmp->ops[j]);
1090 cmp->is_generic = true;
1091 ne->ops[0] = new capture (c->location, c->where, cmp);
1093 else
1095 expr *ocmp = as_a <expr *> (ne->ops[0]);
1096 expr *cmp = new expr (ocmp);
1097 for (unsigned j = 0; j < ocmp->ops.length (); ++j)
1098 cmp->append_op (ocmp->ops[j]);
1099 cmp->is_generic = true;
1100 ne->ops[0] = cmp;
1102 ro.safe_push (ne);
1106 return ro;
1109 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
1110 GENERIC and a GIMPLE variant. */
1112 static void
1113 lower_cond (simplify *s, vec<simplify *>& simplifiers)
1115 vec<operand *> matchers = lower_cond (s->match);
1116 for (unsigned i = 0; i < matchers.length (); ++i)
1118 simplify *ns = new simplify (s->kind, matchers[i], s->result,
1119 s->for_vec, s->capture_ids);
1120 simplifiers.safe_push (ns);
1124 /* Return true if O refers to ID. */
1126 bool
1127 contains_id (operand *o, user_id *id)
1129 if (capture *c = dyn_cast<capture *> (o))
1130 return c->what && contains_id (c->what, id);
1132 if (expr *e = dyn_cast<expr *> (o))
1134 if (e->operation == id)
1135 return true;
1136 for (unsigned i = 0; i < e->ops.length (); ++i)
1137 if (contains_id (e->ops[i], id))
1138 return true;
1139 return false;
1142 if (with_expr *w = dyn_cast <with_expr *> (o))
1143 return (contains_id (w->with, id)
1144 || contains_id (w->subexpr, id));
1146 if (if_expr *ife = dyn_cast <if_expr *> (o))
1147 return (contains_id (ife->cond, id)
1148 || contains_id (ife->trueexpr, id)
1149 || (ife->falseexpr && contains_id (ife->falseexpr, id)));
1151 if (c_expr *ce = dyn_cast<c_expr *> (o))
1152 return ce->capture_ids && ce->capture_ids->get (id->id);
1154 return false;
1158 /* In AST operand O replace operator ID with operator WITH. */
1160 operand *
1161 replace_id (operand *o, user_id *id, id_base *with)
1163 /* Deep-copy captures and expressions, replacing operations as
1164 needed. */
1165 if (capture *c = dyn_cast<capture *> (o))
1167 if (!c->what)
1168 return c;
1169 return new capture (c->location, c->where,
1170 replace_id (c->what, id, with));
1172 else if (expr *e = dyn_cast<expr *> (o))
1174 expr *ne = new expr (e);
1175 if (e->operation == id)
1176 ne->operation = with;
1177 for (unsigned i = 0; i < e->ops.length (); ++i)
1178 ne->append_op (replace_id (e->ops[i], id, with));
1179 return ne;
1181 else if (with_expr *w = dyn_cast <with_expr *> (o))
1183 with_expr *nw = new with_expr (w->location);
1184 nw->with = as_a <c_expr *> (replace_id (w->with, id, with));
1185 nw->subexpr = replace_id (w->subexpr, id, with);
1186 return nw;
1188 else if (if_expr *ife = dyn_cast <if_expr *> (o))
1190 if_expr *nife = new if_expr (ife->location);
1191 nife->cond = as_a <c_expr *> (replace_id (ife->cond, id, with));
1192 nife->trueexpr = replace_id (ife->trueexpr, id, with);
1193 if (ife->falseexpr)
1194 nife->falseexpr = replace_id (ife->falseexpr, id, with);
1195 return nife;
1198 /* For c_expr we simply record a string replacement table which is
1199 applied at code-generation time. */
1200 if (c_expr *ce = dyn_cast<c_expr *> (o))
1202 vec<c_expr::id_tab> ids = ce->ids.copy ();
1203 ids.safe_push (c_expr::id_tab (id->id, with->id));
1204 return new c_expr (ce->r, ce->location,
1205 ce->code, ce->nr_stmts, ids, ce->capture_ids);
1208 return o;
1211 /* Return true if the binary operator OP is ok for delayed substitution
1212 during for lowering. */
1214 static bool
1215 binary_ok (operator_id *op)
1217 switch (op->code)
1219 case PLUS_EXPR:
1220 case MINUS_EXPR:
1221 case MULT_EXPR:
1222 case TRUNC_DIV_EXPR:
1223 case CEIL_DIV_EXPR:
1224 case FLOOR_DIV_EXPR:
1225 case ROUND_DIV_EXPR:
1226 case TRUNC_MOD_EXPR:
1227 case CEIL_MOD_EXPR:
1228 case FLOOR_MOD_EXPR:
1229 case ROUND_MOD_EXPR:
1230 case RDIV_EXPR:
1231 case EXACT_DIV_EXPR:
1232 case MIN_EXPR:
1233 case MAX_EXPR:
1234 case BIT_IOR_EXPR:
1235 case BIT_XOR_EXPR:
1236 case BIT_AND_EXPR:
1237 return true;
1238 default:
1239 return false;
1243 /* Lower recorded fors for SIN and output to SIMPLIFIERS. */
1245 static void
1246 lower_for (simplify *sin, vec<simplify *>& simplifiers)
1248 vec<vec<user_id *> >& for_vec = sin->for_vec;
1249 unsigned worklist_start = 0;
1250 auto_vec<simplify *> worklist;
1251 worklist.safe_push (sin);
1253 /* Lower each recorded for separately, operating on the
1254 set of simplifiers created by the previous one.
1255 Lower inner-to-outer so inner for substitutes can refer
1256 to operators replaced by outer fors. */
1257 for (int fi = for_vec.length () - 1; fi >= 0; --fi)
1259 vec<user_id *>& ids = for_vec[fi];
1260 unsigned n_ids = ids.length ();
1261 unsigned max_n_opers = 0;
1262 bool can_delay_subst = (sin->kind == simplify::SIMPLIFY);
1263 for (unsigned i = 0; i < n_ids; ++i)
1265 if (ids[i]->substitutes.length () > max_n_opers)
1266 max_n_opers = ids[i]->substitutes.length ();
1267 /* Require that all substitutes are of the same kind so that
1268 if we delay substitution to the result op code generation
1269 can look at the first substitute for deciding things like
1270 types of operands. */
1271 enum id_base::id_kind kind = ids[i]->substitutes[0]->kind;
1272 for (unsigned j = 0; j < ids[i]->substitutes.length (); ++j)
1273 if (ids[i]->substitutes[j]->kind != kind)
1274 can_delay_subst = false;
1275 else if (operator_id *op
1276 = dyn_cast <operator_id *> (ids[i]->substitutes[j]))
1278 operator_id *op0
1279 = as_a <operator_id *> (ids[i]->substitutes[0]);
1280 if (strcmp (op->tcc, "tcc_comparison") == 0
1281 && strcmp (op0->tcc, "tcc_comparison") == 0)
1283 /* Unfortunately we can't just allow all tcc_binary. */
1284 else if (strcmp (op->tcc, "tcc_binary") == 0
1285 && strcmp (op0->tcc, "tcc_binary") == 0
1286 && binary_ok (op)
1287 && binary_ok (op0))
1289 else if ((strcmp (op->id + 1, "SHIFT_EXPR") == 0
1290 || strcmp (op->id + 1, "ROTATE_EXPR") == 0)
1291 && (strcmp (op0->id + 1, "SHIFT_EXPR") == 0
1292 || strcmp (op0->id + 1, "ROTATE_EXPR") == 0))
1294 else
1295 can_delay_subst = false;
1297 else if (is_a <fn_id *> (ids[i]->substitutes[j]))
1299 else
1300 can_delay_subst = false;
1303 unsigned worklist_end = worklist.length ();
1304 for (unsigned si = worklist_start; si < worklist_end; ++si)
1306 simplify *s = worklist[si];
1307 for (unsigned j = 0; j < max_n_opers; ++j)
1309 operand *match_op = s->match;
1310 operand *result_op = s->result;
1311 vec<std::pair<user_id *, id_base *> > subst;
1312 subst.create (n_ids);
1313 bool skip = false;
1314 for (unsigned i = 0; i < n_ids; ++i)
1316 user_id *id = ids[i];
1317 id_base *oper = id->substitutes[j % id->substitutes.length ()];
1318 if (oper == null_id
1319 && (contains_id (match_op, id)
1320 || contains_id (result_op, id)))
1322 skip = true;
1323 break;
1325 subst.quick_push (std::make_pair (id, oper));
1326 match_op = replace_id (match_op, id, oper);
1327 if (result_op
1328 && !can_delay_subst)
1329 result_op = replace_id (result_op, id, oper);
1331 if (skip)
1333 subst.release ();
1334 continue;
1336 simplify *ns = new simplify (s->kind, match_op, result_op,
1337 vNULL, s->capture_ids);
1338 ns->for_subst_vec.safe_splice (s->for_subst_vec);
1339 if (result_op
1340 && can_delay_subst)
1341 ns->for_subst_vec.safe_splice (subst);
1342 else
1343 subst.release ();
1344 worklist.safe_push (ns);
1347 worklist_start = worklist_end;
1350 /* Copy out the result from the last for lowering. */
1351 for (unsigned i = worklist_start; i < worklist.length (); ++i)
1352 simplifiers.safe_push (worklist[i]);
1355 /* Lower the AST for everything in SIMPLIFIERS. */
1357 static void
1358 lower (vec<simplify *>& simplifiers, bool gimple)
1360 auto_vec<simplify *> out_simplifiers;
1361 for (unsigned i = 0; i < simplifiers.length (); ++i)
1362 lower_opt_convert (simplifiers[i], out_simplifiers);
1364 simplifiers.truncate (0);
1365 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1366 lower_commutative (out_simplifiers[i], simplifiers);
1368 out_simplifiers.truncate (0);
1369 if (gimple)
1370 for (unsigned i = 0; i < simplifiers.length (); ++i)
1371 lower_cond (simplifiers[i], out_simplifiers);
1372 else
1373 out_simplifiers.safe_splice (simplifiers);
1376 simplifiers.truncate (0);
1377 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1378 lower_for (out_simplifiers[i], simplifiers);
1384 /* The decision tree built for generating GIMPLE and GENERIC pattern
1385 matching code. It represents the 'match' expression of all
1386 simplifies and has those as its leafs. */
1388 struct dt_simplify;
1390 /* A hash-map collecting semantically equivalent leafs in the decision
1391 tree for splitting out to separate functions. */
1392 struct sinfo
1394 dt_simplify *s;
1396 const char *fname;
1397 unsigned cnt;
1400 struct sinfo_hashmap_traits : simple_hashmap_traits<pointer_hash<dt_simplify>,
1401 sinfo *>
1403 static inline hashval_t hash (const key_type &);
1404 static inline bool equal_keys (const key_type &, const key_type &);
1405 template <typename T> static inline void remove (T &) {}
1408 typedef hash_map<void * /* unused */, sinfo *, sinfo_hashmap_traits>
1409 sinfo_map_t;
1412 /* Decision tree base class, used for DT_TRUE and DT_NODE. */
1414 struct dt_node
1416 enum dt_type { DT_NODE, DT_OPERAND, DT_TRUE, DT_MATCH, DT_SIMPLIFY };
1418 enum dt_type type;
1419 unsigned level;
1420 vec<dt_node *> kids;
1422 /* Statistics. */
1423 unsigned num_leafs;
1424 unsigned total_size;
1425 unsigned max_level;
1427 dt_node (enum dt_type type_): type (type_), level (0), kids (vNULL) {}
1429 dt_node *append_node (dt_node *);
1430 dt_node *append_op (operand *, dt_node *parent = 0, unsigned pos = 0);
1431 dt_node *append_true_op (dt_node *parent = 0, unsigned pos = 0);
1432 dt_node *append_match_op (dt_operand *, dt_node *parent = 0, unsigned pos = 0);
1433 dt_node *append_simplify (simplify *, unsigned, dt_operand **);
1435 virtual void gen (FILE *, int, bool) {}
1437 void gen_kids (FILE *, int, bool);
1438 void gen_kids_1 (FILE *, int, bool,
1439 vec<dt_operand *>, vec<dt_operand *>, vec<dt_operand *>,
1440 vec<dt_operand *>, vec<dt_operand *>, vec<dt_node *>);
1442 void analyze (sinfo_map_t &);
1445 /* Generic decision tree node used for DT_OPERAND and DT_MATCH. */
1447 struct dt_operand : public dt_node
1449 operand *op;
1450 dt_operand *match_dop;
1451 dt_operand *parent;
1452 unsigned pos;
1454 dt_operand (enum dt_type type, operand *op_, dt_operand *match_dop_,
1455 dt_operand *parent_ = 0, unsigned pos_ = 0)
1456 : dt_node (type), op (op_), match_dop (match_dop_),
1457 parent (parent_), pos (pos_) {}
1459 void gen (FILE *, int, bool);
1460 unsigned gen_predicate (FILE *, int, const char *, bool);
1461 unsigned gen_match_op (FILE *, int, const char *);
1463 unsigned gen_gimple_expr (FILE *, int);
1464 unsigned gen_generic_expr (FILE *, int, const char *);
1466 char *get_name (char *);
1467 void gen_opname (char *, unsigned);
1470 /* Leaf node of the decision tree, used for DT_SIMPLIFY. */
1472 struct dt_simplify : public dt_node
1474 simplify *s;
1475 unsigned pattern_no;
1476 dt_operand **indexes;
1477 sinfo *info;
1479 dt_simplify (simplify *s_, unsigned pattern_no_, dt_operand **indexes_)
1480 : dt_node (DT_SIMPLIFY), s (s_), pattern_no (pattern_no_),
1481 indexes (indexes_), info (NULL) {}
1483 void gen_1 (FILE *, int, bool, operand *);
1484 void gen (FILE *f, int, bool);
1487 template<>
1488 template<>
1489 inline bool
1490 is_a_helper <dt_operand *>::test (dt_node *n)
1492 return (n->type == dt_node::DT_OPERAND
1493 || n->type == dt_node::DT_MATCH);
1496 template<>
1497 template<>
1498 inline bool
1499 is_a_helper <dt_simplify *>::test (dt_node *n)
1501 return n->type == dt_node::DT_SIMPLIFY;
1506 /* A container for the actual decision tree. */
1508 struct decision_tree
1510 dt_node *root;
1512 void insert (struct simplify *, unsigned);
1513 void gen (FILE *f, bool gimple);
1514 void print (FILE *f = stderr);
1516 decision_tree () { root = new dt_node (dt_node::DT_NODE); }
1518 static dt_node *insert_operand (dt_node *, operand *, dt_operand **indexes,
1519 unsigned pos = 0, dt_node *parent = 0);
1520 static dt_node *find_node (vec<dt_node *>&, dt_node *);
1521 static bool cmp_node (dt_node *, dt_node *);
1522 static void print_node (dt_node *, FILE *f = stderr, unsigned = 0);
1525 /* Compare two AST operands O1 and O2 and return true if they are equal. */
1527 bool
1528 cmp_operand (operand *o1, operand *o2)
1530 if (!o1 || !o2 || o1->type != o2->type)
1531 return false;
1533 if (o1->type == operand::OP_PREDICATE)
1535 predicate *p1 = as_a<predicate *>(o1);
1536 predicate *p2 = as_a<predicate *>(o2);
1537 return p1->p == p2->p;
1539 else if (o1->type == operand::OP_EXPR)
1541 expr *e1 = static_cast<expr *>(o1);
1542 expr *e2 = static_cast<expr *>(o2);
1543 return (e1->operation == e2->operation
1544 && e1->is_generic == e2->is_generic);
1546 else
1547 return false;
1550 /* Compare two decision tree nodes N1 and N2 and return true if they
1551 are equal. */
1553 bool
1554 decision_tree::cmp_node (dt_node *n1, dt_node *n2)
1556 if (!n1 || !n2 || n1->type != n2->type)
1557 return false;
1559 if (n1 == n2)
1560 return true;
1562 if (n1->type == dt_node::DT_TRUE)
1563 return false;
1565 if (n1->type == dt_node::DT_OPERAND)
1566 return cmp_operand ((as_a<dt_operand *> (n1))->op,
1567 (as_a<dt_operand *> (n2))->op);
1568 else if (n1->type == dt_node::DT_MATCH)
1569 return ((as_a<dt_operand *> (n1))->match_dop
1570 == (as_a<dt_operand *> (n2))->match_dop);
1571 return false;
1574 /* Search OPS for a decision tree node like P and return it if found. */
1576 dt_node *
1577 decision_tree::find_node (vec<dt_node *>& ops, dt_node *p)
1579 /* We can merge adjacent DT_TRUE. */
1580 if (p->type == dt_node::DT_TRUE
1581 && !ops.is_empty ()
1582 && ops.last ()->type == dt_node::DT_TRUE)
1583 return ops.last ();
1584 for (int i = ops.length () - 1; i >= 0; --i)
1586 /* But we can't merge across DT_TRUE nodes as they serve as
1587 pattern order barriers to make sure that patterns apply
1588 in order of appearance in case multiple matches are possible. */
1589 if (ops[i]->type == dt_node::DT_TRUE)
1590 return NULL;
1591 if (decision_tree::cmp_node (ops[i], p))
1592 return ops[i];
1594 return NULL;
1597 /* Append N to the decision tree if it there is not already an existing
1598 identical child. */
1600 dt_node *
1601 dt_node::append_node (dt_node *n)
1603 dt_node *kid;
1605 kid = decision_tree::find_node (kids, n);
1606 if (kid)
1607 return kid;
1609 kids.safe_push (n);
1610 n->level = this->level + 1;
1612 return n;
1615 /* Append OP to the decision tree. */
1617 dt_node *
1618 dt_node::append_op (operand *op, dt_node *parent, unsigned pos)
1620 dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1621 dt_operand *n = new dt_operand (DT_OPERAND, op, 0, parent_, pos);
1622 return append_node (n);
1625 /* Append a DT_TRUE decision tree node. */
1627 dt_node *
1628 dt_node::append_true_op (dt_node *parent, unsigned pos)
1630 dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1631 dt_operand *n = new dt_operand (DT_TRUE, 0, 0, parent_, pos);
1632 return append_node (n);
1635 /* Append a DT_MATCH decision tree node. */
1637 dt_node *
1638 dt_node::append_match_op (dt_operand *match_dop, dt_node *parent, unsigned pos)
1640 dt_operand *parent_ = as_a<dt_operand *> (parent);
1641 dt_operand *n = new dt_operand (DT_MATCH, 0, match_dop, parent_, pos);
1642 return append_node (n);
1645 /* Append S to the decision tree. */
1647 dt_node *
1648 dt_node::append_simplify (simplify *s, unsigned pattern_no,
1649 dt_operand **indexes)
1651 dt_simplify *n = new dt_simplify (s, pattern_no, indexes);
1652 for (unsigned i = 0; i < kids.length (); ++i)
1653 if (dt_simplify *s2 = dyn_cast <dt_simplify *> (kids[i]))
1655 warning_at (s->match->location, "duplicate pattern");
1656 warning_at (s2->s->match->location, "previous pattern defined here");
1657 print_operand (s->match, stderr);
1658 fprintf (stderr, "\n");
1660 return append_node (n);
1663 /* Analyze the node and its children. */
1665 void
1666 dt_node::analyze (sinfo_map_t &map)
1668 num_leafs = 0;
1669 total_size = 1;
1670 max_level = level;
1672 if (type == DT_SIMPLIFY)
1674 /* Populate the map of equivalent simplifies. */
1675 dt_simplify *s = as_a <dt_simplify *> (this);
1676 bool existed;
1677 sinfo *&si = map.get_or_insert (s, &existed);
1678 if (!existed)
1680 si = new sinfo;
1681 si->s = s;
1682 si->cnt = 1;
1683 si->fname = NULL;
1685 else
1686 si->cnt++;
1687 s->info = si;
1688 num_leafs = 1;
1689 return;
1692 for (unsigned i = 0; i < kids.length (); ++i)
1694 kids[i]->analyze (map);
1695 num_leafs += kids[i]->num_leafs;
1696 total_size += kids[i]->total_size;
1697 max_level = MAX (max_level, kids[i]->max_level);
1701 /* Insert O into the decision tree and return the decision tree node found
1702 or created. */
1704 dt_node *
1705 decision_tree::insert_operand (dt_node *p, operand *o, dt_operand **indexes,
1706 unsigned pos, dt_node *parent)
1708 dt_node *q, *elm = 0;
1710 if (capture *c = dyn_cast<capture *> (o))
1712 unsigned capt_index = c->where;
1714 if (indexes[capt_index] == 0)
1716 if (c->what)
1717 q = insert_operand (p, c->what, indexes, pos, parent);
1718 else
1720 q = elm = p->append_true_op (parent, pos);
1721 goto at_assert_elm;
1723 // get to the last capture
1724 for (operand *what = c->what;
1725 what && is_a<capture *> (what);
1726 c = as_a<capture *> (what), what = c->what)
1729 if (!c->what)
1731 unsigned cc_index = c->where;
1732 dt_operand *match_op = indexes[cc_index];
1734 dt_operand temp (dt_node::DT_TRUE, 0, 0);
1735 elm = decision_tree::find_node (p->kids, &temp);
1737 if (elm == 0)
1739 dt_operand temp (dt_node::DT_MATCH, 0, match_op);
1740 elm = decision_tree::find_node (p->kids, &temp);
1743 else
1745 dt_operand temp (dt_node::DT_OPERAND, c->what, 0);
1746 elm = decision_tree::find_node (p->kids, &temp);
1749 at_assert_elm:
1750 gcc_assert (elm->type == dt_node::DT_TRUE
1751 || elm->type == dt_node::DT_OPERAND
1752 || elm->type == dt_node::DT_MATCH);
1753 indexes[capt_index] = static_cast<dt_operand *> (elm);
1754 return q;
1756 else
1758 p = p->append_match_op (indexes[capt_index], parent, pos);
1759 if (c->what)
1760 return insert_operand (p, c->what, indexes, 0, p);
1761 else
1762 return p;
1765 p = p->append_op (o, parent, pos);
1766 q = p;
1768 if (expr *e = dyn_cast <expr *>(o))
1770 for (unsigned i = 0; i < e->ops.length (); ++i)
1771 q = decision_tree::insert_operand (q, e->ops[i], indexes, i, p);
1774 return q;
1777 /* Insert S into the decision tree. */
1779 void
1780 decision_tree::insert (struct simplify *s, unsigned pattern_no)
1782 dt_operand **indexes = XCNEWVEC (dt_operand *, s->capture_max + 1);
1783 dt_node *p = decision_tree::insert_operand (root, s->match, indexes);
1784 p->append_simplify (s, pattern_no, indexes);
1787 /* Debug functions to dump the decision tree. */
1789 DEBUG_FUNCTION void
1790 decision_tree::print_node (dt_node *p, FILE *f, unsigned indent)
1792 if (p->type == dt_node::DT_NODE)
1793 fprintf (f, "root");
1794 else
1796 fprintf (f, "|");
1797 for (unsigned i = 0; i < indent; i++)
1798 fprintf (f, "-");
1800 if (p->type == dt_node::DT_OPERAND)
1802 dt_operand *dop = static_cast<dt_operand *>(p);
1803 print_operand (dop->op, f, true);
1805 else if (p->type == dt_node::DT_TRUE)
1806 fprintf (f, "true");
1807 else if (p->type == dt_node::DT_MATCH)
1808 fprintf (f, "match (%p)", (void *)((as_a<dt_operand *>(p))->match_dop));
1809 else if (p->type == dt_node::DT_SIMPLIFY)
1811 dt_simplify *s = static_cast<dt_simplify *> (p);
1812 fprintf (f, "simplify_%u { ", s->pattern_no);
1813 for (int i = 0; i <= s->s->capture_max; ++i)
1814 fprintf (f, "%p, ", (void *) s->indexes[i]);
1815 fprintf (f, " } ");
1819 fprintf (stderr, " (%p), %u, %u\n", (void *) p, p->level, p->kids.length ());
1821 for (unsigned i = 0; i < p->kids.length (); ++i)
1822 decision_tree::print_node (p->kids[i], f, indent + 2);
1825 DEBUG_FUNCTION void
1826 decision_tree::print (FILE *f)
1828 return decision_tree::print_node (root, f);
1832 /* For GENERIC we have to take care of wrapping multiple-used
1833 expressions with side-effects in save_expr and preserve side-effects
1834 of expressions with omit_one_operand. Analyze captures in
1835 match, result and with expressions and perform early-outs
1836 on the outermost match expression operands for cases we cannot
1837 handle. */
1839 struct capture_info
1841 capture_info (simplify *s, operand *, bool);
1842 void walk_match (operand *o, unsigned toplevel_arg, bool, bool);
1843 bool walk_result (operand *o, bool, operand *);
1844 void walk_c_expr (c_expr *);
1846 struct cinfo
1848 bool expr_p;
1849 bool cse_p;
1850 bool force_no_side_effects_p;
1851 bool force_single_use;
1852 bool cond_expr_cond_p;
1853 unsigned long toplevel_msk;
1854 int result_use_count;
1855 unsigned same_as;
1856 capture *c;
1859 auto_vec<cinfo> info;
1860 unsigned long force_no_side_effects;
1861 bool gimple;
1864 /* Analyze captures in S. */
1866 capture_info::capture_info (simplify *s, operand *result, bool gimple_)
1868 gimple = gimple_;
1870 expr *e;
1871 if (s->kind == simplify::MATCH)
1873 force_no_side_effects = -1;
1874 return;
1877 force_no_side_effects = 0;
1878 info.safe_grow_cleared (s->capture_max + 1);
1879 for (int i = 0; i <= s->capture_max; ++i)
1880 info[i].same_as = i;
1882 e = as_a <expr *> (s->match);
1883 for (unsigned i = 0; i < e->ops.length (); ++i)
1884 walk_match (e->ops[i], i,
1885 (i != 0 && *e->operation == COND_EXPR)
1886 || *e->operation == TRUTH_ANDIF_EXPR
1887 || *e->operation == TRUTH_ORIF_EXPR,
1888 i == 0
1889 && (*e->operation == COND_EXPR
1890 || *e->operation == VEC_COND_EXPR));
1892 walk_result (s->result, false, result);
1895 /* Analyze captures in the match expression piece O. */
1897 void
1898 capture_info::walk_match (operand *o, unsigned toplevel_arg,
1899 bool conditional_p, bool cond_expr_cond_p)
1901 if (capture *c = dyn_cast <capture *> (o))
1903 unsigned where = c->where;
1904 info[where].toplevel_msk |= 1 << toplevel_arg;
1905 info[where].force_no_side_effects_p |= conditional_p;
1906 info[where].cond_expr_cond_p |= cond_expr_cond_p;
1907 if (!info[where].c)
1908 info[where].c = c;
1909 if (!c->what)
1910 return;
1911 /* Recurse to exprs and captures. */
1912 if (is_a <capture *> (c->what)
1913 || is_a <expr *> (c->what))
1914 walk_match (c->what, toplevel_arg, conditional_p, false);
1915 /* We need to look past multiple captures to find a captured
1916 expression as with conditional converts two captures
1917 can be collapsed onto the same expression. Also collect
1918 what captures capture the same thing. */
1919 while (c->what && is_a <capture *> (c->what))
1921 c = as_a <capture *> (c->what);
1922 if (info[c->where].same_as != c->where
1923 && info[c->where].same_as != info[where].same_as)
1924 fatal_at (c->location, "cannot handle this collapsed capture");
1925 info[c->where].same_as = info[where].same_as;
1927 /* Mark expr (non-leaf) captures and forced single-use exprs. */
1928 expr *e;
1929 if (c->what
1930 && (e = dyn_cast <expr *> (c->what)))
1932 info[where].expr_p = true;
1933 info[where].force_single_use |= e->force_single_use;
1936 else if (expr *e = dyn_cast <expr *> (o))
1938 for (unsigned i = 0; i < e->ops.length (); ++i)
1940 bool cond_p = conditional_p;
1941 bool cond_expr_cond_p = false;
1942 if (i != 0 && *e->operation == COND_EXPR)
1943 cond_p = true;
1944 else if (*e->operation == TRUTH_ANDIF_EXPR
1945 || *e->operation == TRUTH_ORIF_EXPR)
1946 cond_p = true;
1947 if (i == 0
1948 && (*e->operation == COND_EXPR
1949 || *e->operation == VEC_COND_EXPR))
1950 cond_expr_cond_p = true;
1951 walk_match (e->ops[i], toplevel_arg, cond_p, cond_expr_cond_p);
1954 else if (is_a <predicate *> (o))
1956 /* Mark non-captured leafs toplevel arg for checking. */
1957 force_no_side_effects |= 1 << toplevel_arg;
1958 if (verbose >= 1
1959 && !gimple)
1960 warning_at (o->location,
1961 "forcing no side-effects on possibly lost leaf");
1963 else
1964 gcc_unreachable ();
1967 /* Analyze captures in the result expression piece O. Return true
1968 if RESULT was visited in one of the children. Only visit
1969 non-if/with children if they are rooted on RESULT. */
1971 bool
1972 capture_info::walk_result (operand *o, bool conditional_p, operand *result)
1974 if (capture *c = dyn_cast <capture *> (o))
1976 unsigned where = info[c->where].same_as;
1977 info[where].result_use_count++;
1978 /* If we substitute an expression capture we don't know
1979 which captures this will end up using (well, we don't
1980 compute that). Force the uses to be side-effect free
1981 which means forcing the toplevels that reach the
1982 expression side-effect free. */
1983 if (info[where].expr_p)
1984 force_no_side_effects |= info[where].toplevel_msk;
1985 /* Mark CSE capture uses as forced to have no side-effects. */
1986 if (c->what
1987 && is_a <expr *> (c->what))
1989 info[where].cse_p = true;
1990 walk_result (c->what, true, result);
1993 else if (expr *e = dyn_cast <expr *> (o))
1995 id_base *opr = e->operation;
1996 if (user_id *uid = dyn_cast <user_id *> (opr))
1997 opr = uid->substitutes[0];
1998 for (unsigned i = 0; i < e->ops.length (); ++i)
2000 bool cond_p = conditional_p;
2001 if (i != 0 && *e->operation == COND_EXPR)
2002 cond_p = true;
2003 else if (*e->operation == TRUTH_ANDIF_EXPR
2004 || *e->operation == TRUTH_ORIF_EXPR)
2005 cond_p = true;
2006 walk_result (e->ops[i], cond_p, result);
2009 else if (if_expr *e = dyn_cast <if_expr *> (o))
2011 /* 'if' conditions should be all fine. */
2012 if (e->trueexpr == result)
2014 walk_result (e->trueexpr, false, result);
2015 return true;
2017 if (e->falseexpr == result)
2019 walk_result (e->falseexpr, false, result);
2020 return true;
2022 bool res = false;
2023 if (is_a <if_expr *> (e->trueexpr)
2024 || is_a <with_expr *> (e->trueexpr))
2025 res |= walk_result (e->trueexpr, false, result);
2026 if (e->falseexpr
2027 && (is_a <if_expr *> (e->falseexpr)
2028 || is_a <with_expr *> (e->falseexpr)))
2029 res |= walk_result (e->falseexpr, false, result);
2030 return res;
2032 else if (with_expr *e = dyn_cast <with_expr *> (o))
2034 bool res = (e->subexpr == result);
2035 if (res
2036 || is_a <if_expr *> (e->subexpr)
2037 || is_a <with_expr *> (e->subexpr))
2038 res |= walk_result (e->subexpr, false, result);
2039 if (res)
2040 walk_c_expr (e->with);
2041 return res;
2043 else if (c_expr *e = dyn_cast <c_expr *> (o))
2044 walk_c_expr (e);
2045 else
2046 gcc_unreachable ();
2048 return false;
2051 /* Look for captures in the C expr E. */
2053 void
2054 capture_info::walk_c_expr (c_expr *e)
2056 /* Give up for C exprs mentioning captures not inside TREE_TYPE,
2057 TREE_REAL_CST, TREE_CODE or a predicate where they cannot
2058 really escape through. */
2059 unsigned p_depth = 0;
2060 for (unsigned i = 0; i < e->code.length (); ++i)
2062 const cpp_token *t = &e->code[i];
2063 const cpp_token *n = i < e->code.length () - 1 ? &e->code[i+1] : NULL;
2064 id_base *id;
2065 if (t->type == CPP_NAME
2066 && (strcmp ((const char *)CPP_HASHNODE
2067 (t->val.node.node)->ident.str, "TREE_TYPE") == 0
2068 || strcmp ((const char *)CPP_HASHNODE
2069 (t->val.node.node)->ident.str, "TREE_CODE") == 0
2070 || strcmp ((const char *)CPP_HASHNODE
2071 (t->val.node.node)->ident.str, "TREE_REAL_CST") == 0
2072 || ((id = get_operator ((const char *)CPP_HASHNODE
2073 (t->val.node.node)->ident.str))
2074 && is_a <predicate_id *> (id)))
2075 && n->type == CPP_OPEN_PAREN)
2076 p_depth++;
2077 else if (t->type == CPP_CLOSE_PAREN
2078 && p_depth > 0)
2079 p_depth--;
2080 else if (p_depth == 0
2081 && t->type == CPP_ATSIGN
2082 && (n->type == CPP_NUMBER
2083 || n->type == CPP_NAME)
2084 && !(n->flags & PREV_WHITE))
2086 const char *id;
2087 if (n->type == CPP_NUMBER)
2088 id = (const char *)n->val.str.text;
2089 else
2090 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
2091 unsigned where = *e->capture_ids->get(id);
2092 info[info[where].same_as].force_no_side_effects_p = true;
2093 if (verbose >= 1
2094 && !gimple)
2095 warning_at (t, "capture escapes");
2101 /* Code generation off the decision tree and the refered AST nodes. */
2103 bool
2104 is_conversion (id_base *op)
2106 return (*op == CONVERT_EXPR
2107 || *op == NOP_EXPR
2108 || *op == FLOAT_EXPR
2109 || *op == FIX_TRUNC_EXPR
2110 || *op == VIEW_CONVERT_EXPR);
2113 /* Get the type to be used for generating operands of OP from the
2114 various sources. */
2116 static const char *
2117 get_operand_type (id_base *op, const char *in_type,
2118 const char *expr_type,
2119 const char *other_oprnd_type)
2121 /* Generally operands whose type does not match the type of the
2122 expression generated need to know their types but match and
2123 thus can fall back to 'other_oprnd_type'. */
2124 if (is_conversion (op))
2125 return other_oprnd_type;
2126 else if (*op == REALPART_EXPR
2127 || *op == IMAGPART_EXPR)
2128 return other_oprnd_type;
2129 else if (is_a <operator_id *> (op)
2130 && strcmp (as_a <operator_id *> (op)->tcc, "tcc_comparison") == 0)
2131 return other_oprnd_type;
2132 else
2134 /* Otherwise all types should match - choose one in order of
2135 preference. */
2136 if (expr_type)
2137 return expr_type;
2138 else if (in_type)
2139 return in_type;
2140 else
2141 return other_oprnd_type;
2145 /* Generate transform code for an expression. */
2147 void
2148 expr::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
2149 int depth, const char *in_type, capture_info *cinfo,
2150 dt_operand **indexes, bool)
2152 id_base *opr = operation;
2153 /* When we delay operator substituting during lowering of fors we
2154 make sure that for code-gen purposes the effects of each substitute
2155 are the same. Thus just look at that. */
2156 if (user_id *uid = dyn_cast <user_id *> (opr))
2157 opr = uid->substitutes[0];
2159 bool conversion_p = is_conversion (opr);
2160 const char *type = expr_type;
2161 char optype[64];
2162 if (type)
2163 /* If there was a type specification in the pattern use it. */
2165 else if (conversion_p)
2166 /* For conversions we need to build the expression using the
2167 outer type passed in. */
2168 type = in_type;
2169 else if (*opr == REALPART_EXPR
2170 || *opr == IMAGPART_EXPR)
2172 /* __real and __imag use the component type of its operand. */
2173 sprintf (optype, "TREE_TYPE (TREE_TYPE (ops%d[0]))", depth);
2174 type = optype;
2176 else if (is_a <operator_id *> (opr)
2177 && !strcmp (as_a <operator_id *> (opr)->tcc, "tcc_comparison"))
2179 /* comparisons use boolean_type_node (or what gets in), but
2180 their operands need to figure out the types themselves. */
2181 sprintf (optype, "boolean_type_node");
2182 type = optype;
2184 else if (*opr == COND_EXPR
2185 || *opr == VEC_COND_EXPR)
2187 /* Conditions are of the same type as their first alternative. */
2188 sprintf (optype, "TREE_TYPE (ops%d[1])", depth);
2189 type = optype;
2191 else
2193 /* Other operations are of the same type as their first operand. */
2194 sprintf (optype, "TREE_TYPE (ops%d[0])", depth);
2195 type = optype;
2197 if (!type)
2198 fatal_at (location, "cannot determine type of operand");
2200 fprintf_indent (f, indent, "{\n");
2201 indent += 2;
2202 fprintf_indent (f, indent, "tree ops%d[%u], res;\n", depth, ops.length ());
2203 char op0type[64];
2204 snprintf (op0type, 64, "TREE_TYPE (ops%d[0])", depth);
2205 for (unsigned i = 0; i < ops.length (); ++i)
2207 char dest[32];
2208 snprintf (dest, 32, "ops%d[%u]", depth, i);
2209 const char *optype
2210 = get_operand_type (opr, in_type, expr_type,
2211 i == 0 ? NULL : op0type);
2212 ops[i]->gen_transform (f, indent, dest, gimple, depth + 1, optype,
2213 cinfo, indexes,
2214 ((!(*opr == COND_EXPR)
2215 && !(*opr == VEC_COND_EXPR))
2216 || i != 0));
2219 const char *opr_name;
2220 if (*operation == CONVERT_EXPR)
2221 opr_name = "NOP_EXPR";
2222 else
2223 opr_name = operation->id;
2225 if (gimple)
2227 if (*opr == CONVERT_EXPR)
2229 fprintf_indent (f, indent,
2230 "if (%s != TREE_TYPE (ops%d[0])\n",
2231 type, depth);
2232 fprintf_indent (f, indent,
2233 " && !useless_type_conversion_p (%s, TREE_TYPE (ops%d[0])))\n",
2234 type, depth);
2235 fprintf_indent (f, indent + 2, "{\n");
2236 indent += 4;
2238 /* ??? Building a stmt can fail for various reasons here, seq being
2239 NULL or the stmt referencing SSA names occuring in abnormal PHIs.
2240 So if we fail here we should continue matching other patterns. */
2241 fprintf_indent (f, indent, "code_helper tem_code = %s;\n", opr_name);
2242 fprintf_indent (f, indent, "tree tem_ops[3] = { ");
2243 for (unsigned i = 0; i < ops.length (); ++i)
2244 fprintf (f, "ops%d[%u]%s", depth, i,
2245 i == ops.length () - 1 ? " };\n" : ", ");
2246 fprintf_indent (f, indent,
2247 "gimple_resimplify%d (lseq, &tem_code, %s, tem_ops, valueize);\n",
2248 ops.length (), type);
2249 fprintf_indent (f, indent,
2250 "res = maybe_push_res_to_seq (tem_code, %s, tem_ops, lseq);\n",
2251 type);
2252 fprintf_indent (f, indent,
2253 "if (!res) return false;\n");
2254 if (*opr == CONVERT_EXPR)
2256 indent -= 4;
2257 fprintf_indent (f, indent, " }\n");
2258 fprintf_indent (f, indent, "else\n");
2259 fprintf_indent (f, indent, " res = ops%d[0];\n", depth);
2262 else
2264 if (*opr == CONVERT_EXPR)
2266 fprintf_indent (f, indent, "if (TREE_TYPE (ops%d[0]) != %s)\n",
2267 depth, type);
2268 indent += 2;
2270 if (opr->kind == id_base::CODE)
2271 fprintf_indent (f, indent, "res = fold_build%d_loc (loc, %s, %s",
2272 ops.length(), opr_name, type);
2273 else
2275 fprintf_indent (f, indent, "{\n");
2276 fprintf_indent (f, indent, " res = maybe_build_call_expr_loc (loc, "
2277 "%s, %s, %d", opr_name, type, ops.length());
2279 for (unsigned i = 0; i < ops.length (); ++i)
2280 fprintf (f, ", ops%d[%u]", depth, i);
2281 fprintf (f, ");\n");
2282 if (opr->kind != id_base::CODE)
2284 fprintf_indent (f, indent, " if (!res)\n");
2285 fprintf_indent (f, indent, " return NULL_TREE;\n");
2286 fprintf_indent (f, indent, "}\n");
2288 if (*opr == CONVERT_EXPR)
2290 indent -= 2;
2291 fprintf_indent (f, indent, "else\n");
2292 fprintf_indent (f, indent, " res = ops%d[0];\n", depth);
2295 fprintf_indent (f, indent, "%s = res;\n", dest);
2296 indent -= 2;
2297 fprintf_indent (f, indent, "}\n");
2300 /* Generate code for a c_expr which is either the expression inside
2301 an if statement or a sequence of statements which computes a
2302 result to be stored to DEST. */
2304 void
2305 c_expr::gen_transform (FILE *f, int indent, const char *dest,
2306 bool, int, const char *, capture_info *,
2307 dt_operand **, bool)
2309 if (dest && nr_stmts == 1)
2310 fprintf_indent (f, indent, "%s = ", dest);
2312 unsigned stmt_nr = 1;
2313 for (unsigned i = 0; i < code.length (); ++i)
2315 const cpp_token *token = &code[i];
2317 /* Replace captures for code-gen. */
2318 if (token->type == CPP_ATSIGN)
2320 const cpp_token *n = &code[i+1];
2321 if ((n->type == CPP_NUMBER
2322 || n->type == CPP_NAME)
2323 && !(n->flags & PREV_WHITE))
2325 if (token->flags & PREV_WHITE)
2326 fputc (' ', f);
2327 const char *id;
2328 if (n->type == CPP_NUMBER)
2329 id = (const char *)n->val.str.text;
2330 else
2331 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
2332 unsigned *cid = capture_ids->get (id);
2333 if (!cid)
2334 fatal_at (token, "unknown capture id");
2335 fprintf (f, "captures[%u]", *cid);
2336 ++i;
2337 continue;
2341 if (token->flags & PREV_WHITE)
2342 fputc (' ', f);
2344 if (token->type == CPP_NAME)
2346 const char *id = (const char *) NODE_NAME (token->val.node.node);
2347 unsigned j;
2348 for (j = 0; j < ids.length (); ++j)
2350 if (strcmp (id, ids[j].id) == 0)
2352 fprintf (f, "%s", ids[j].oper);
2353 break;
2356 if (j < ids.length ())
2357 continue;
2360 /* Output the token as string. */
2361 char *tk = (char *)cpp_token_as_text (r, token);
2362 fputs (tk, f);
2364 if (token->type == CPP_SEMICOLON)
2366 stmt_nr++;
2367 fputc ('\n', f);
2368 if (dest && stmt_nr == nr_stmts)
2369 fprintf_indent (f, indent, "%s = ", dest);
2374 /* Generate transform code for a capture. */
2376 void
2377 capture::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
2378 int depth, const char *in_type, capture_info *cinfo,
2379 dt_operand **indexes, bool expand_compares)
2381 if (what && is_a<expr *> (what))
2383 if (indexes[where] == 0)
2385 char buf[20];
2386 sprintf (buf, "captures[%u]", where);
2387 what->gen_transform (f, indent, buf, gimple, depth, in_type,
2388 cinfo, NULL);
2392 fprintf_indent (f, indent, "%s = captures[%u];\n", dest, where);
2394 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
2395 with substituting a capture of that.
2396 ??? Returning false here will also not allow any other patterns
2397 to match. */
2398 if (gimple && expand_compares
2399 && cinfo->info[where].cond_expr_cond_p)
2401 fprintf_indent (f, indent, "if (COMPARISON_CLASS_P (%s))\n", dest);
2402 fprintf_indent (f, indent, " {\n");
2403 fprintf_indent (f, indent, " if (!seq) return false;\n");
2404 fprintf_indent (f, indent, " %s = gimple_build (seq, TREE_CODE (%s),"
2405 " TREE_TYPE (%s), TREE_OPERAND (%s, 0),"
2406 " TREE_OPERAND (%s, 1));\n",
2407 dest, dest, dest, dest, dest);
2408 fprintf_indent (f, indent, " }\n");
2412 /* Return the name of the operand representing the decision tree node.
2413 Use NAME as space to generate it. */
2415 char *
2416 dt_operand::get_name (char *name)
2418 if (!parent)
2419 sprintf (name, "t");
2420 else if (parent->level == 1)
2421 sprintf (name, "op%u", pos);
2422 else if (parent->type == dt_node::DT_MATCH)
2423 return parent->get_name (name);
2424 else
2425 sprintf (name, "o%u%u", parent->level, pos);
2426 return name;
2429 /* Fill NAME with the operand name at position POS. */
2431 void
2432 dt_operand::gen_opname (char *name, unsigned pos)
2434 if (!parent)
2435 sprintf (name, "op%u", pos);
2436 else
2437 sprintf (name, "o%u%u", level, pos);
2440 /* Generate matching code for the decision tree operand which is
2441 a predicate. */
2443 unsigned
2444 dt_operand::gen_predicate (FILE *f, int indent, const char *opname, bool gimple)
2446 predicate *p = as_a <predicate *> (op);
2448 if (p->p->matchers.exists ())
2450 /* If this is a predicate generated from a pattern mangle its
2451 name and pass on the valueize hook. */
2452 if (gimple)
2453 fprintf_indent (f, indent, "if (gimple_%s (%s, valueize))\n",
2454 p->p->id, opname);
2455 else
2456 fprintf_indent (f, indent, "if (tree_%s (%s))\n", p->p->id, opname);
2458 else
2459 fprintf_indent (f, indent, "if (%s (%s))\n", p->p->id, opname);
2460 fprintf_indent (f, indent + 2, "{\n");
2461 return 1;
2464 /* Generate matching code for the decision tree operand which is
2465 a capture-match. */
2467 unsigned
2468 dt_operand::gen_match_op (FILE *f, int indent, const char *opname)
2470 char match_opname[20];
2471 match_dop->get_name (match_opname);
2472 fprintf_indent (f, indent, "if (%s == %s || operand_equal_p (%s, %s, 0))\n",
2473 opname, match_opname, opname, match_opname);
2474 fprintf_indent (f, indent + 2, "{\n");
2475 return 1;
2478 /* Generate GIMPLE matching code for the decision tree operand. */
2480 unsigned
2481 dt_operand::gen_gimple_expr (FILE *f, int indent)
2483 expr *e = static_cast<expr *> (op);
2484 id_base *id = e->operation;
2485 unsigned n_ops = e->ops.length ();
2487 for (unsigned i = 0; i < n_ops; ++i)
2489 char child_opname[20];
2490 gen_opname (child_opname, i);
2492 if (id->kind == id_base::CODE)
2494 if (e->is_generic
2495 || *id == REALPART_EXPR || *id == IMAGPART_EXPR
2496 || *id == BIT_FIELD_REF || *id == VIEW_CONVERT_EXPR)
2498 /* ??? If this is a memory operation we can't (and should not)
2499 match this. The only sensible operand types are
2500 SSA names and invariants. */
2501 fprintf_indent (f, indent,
2502 "tree %s = TREE_OPERAND (gimple_assign_rhs1 (def), %i);\n",
2503 child_opname, i);
2504 fprintf_indent (f, indent,
2505 "if ((TREE_CODE (%s) == SSA_NAME\n",
2506 child_opname);
2507 fprintf_indent (f, indent,
2508 " || is_gimple_min_invariant (%s))\n",
2509 child_opname);
2510 fprintf_indent (f, indent,
2511 " && (%s = do_valueize (valueize, %s)))\n",
2512 child_opname, child_opname);
2513 fprintf_indent (f, indent,
2514 " {\n");
2515 indent += 4;
2516 continue;
2518 else
2519 fprintf_indent (f, indent,
2520 "tree %s = gimple_assign_rhs%u (def);\n",
2521 child_opname, i + 1);
2523 else
2524 fprintf_indent (f, indent,
2525 "tree %s = gimple_call_arg (def, %u);\n",
2526 child_opname, i);
2527 fprintf_indent (f, indent,
2528 "if ((%s = do_valueize (valueize, %s)))\n",
2529 child_opname, child_opname);
2530 fprintf_indent (f, indent, " {\n");
2531 indent += 4;
2533 /* While the toplevel operands are canonicalized by the caller
2534 after valueizing operands of sub-expressions we have to
2535 re-canonicalize operand order. */
2536 if (operator_id *code = dyn_cast <operator_id *> (id))
2538 /* ??? We can't canonicalize tcc_comparison operands here
2539 because that requires changing the comparison code which
2540 we already matched... */
2541 if (commutative_tree_code (code->code)
2542 || commutative_ternary_tree_code (code->code))
2544 char child_opname0[20], child_opname1[20];
2545 gen_opname (child_opname0, 0);
2546 gen_opname (child_opname1, 1);
2547 fprintf_indent (f, indent,
2548 "if (tree_swap_operands_p (%s, %s, false))\n",
2549 child_opname0, child_opname1);
2550 fprintf_indent (f, indent,
2551 " std::swap (%s, %s);\n",
2552 child_opname0, child_opname1);
2556 return n_ops;
2559 /* Generate GENERIC matching code for the decision tree operand. */
2561 unsigned
2562 dt_operand::gen_generic_expr (FILE *f, int indent, const char *opname)
2564 expr *e = static_cast<expr *> (op);
2565 unsigned n_ops = e->ops.length ();
2567 for (unsigned i = 0; i < n_ops; ++i)
2569 char child_opname[20];
2570 gen_opname (child_opname, i);
2572 if (e->operation->kind == id_base::CODE)
2573 fprintf_indent (f, indent, "tree %s = TREE_OPERAND (%s, %u);\n",
2574 child_opname, opname, i);
2575 else
2576 fprintf_indent (f, indent, "tree %s = CALL_EXPR_ARG (%s, %u);\n",
2577 child_opname, opname, i);
2580 return 0;
2583 /* Generate matching code for the children of the decision tree node. */
2585 void
2586 dt_node::gen_kids (FILE *f, int indent, bool gimple)
2588 auto_vec<dt_operand *> gimple_exprs;
2589 auto_vec<dt_operand *> generic_exprs;
2590 auto_vec<dt_operand *> fns;
2591 auto_vec<dt_operand *> generic_fns;
2592 auto_vec<dt_operand *> preds;
2593 auto_vec<dt_node *> others;
2595 for (unsigned i = 0; i < kids.length (); ++i)
2597 if (kids[i]->type == dt_node::DT_OPERAND)
2599 dt_operand *op = as_a<dt_operand *> (kids[i]);
2600 if (expr *e = dyn_cast <expr *> (op->op))
2602 if (e->ops.length () == 0
2603 && (!gimple || !(*e->operation == CONSTRUCTOR)))
2604 generic_exprs.safe_push (op);
2605 else if (e->operation->kind == id_base::FN)
2607 if (gimple)
2608 fns.safe_push (op);
2609 else
2610 generic_fns.safe_push (op);
2612 else if (e->operation->kind == id_base::PREDICATE)
2613 preds.safe_push (op);
2614 else
2616 if (gimple)
2617 gimple_exprs.safe_push (op);
2618 else
2619 generic_exprs.safe_push (op);
2622 else if (op->op->type == operand::OP_PREDICATE)
2623 others.safe_push (kids[i]);
2624 else
2625 gcc_unreachable ();
2627 else if (kids[i]->type == dt_node::DT_SIMPLIFY)
2628 others.safe_push (kids[i]);
2629 else if (kids[i]->type == dt_node::DT_MATCH
2630 || kids[i]->type == dt_node::DT_TRUE)
2632 /* A DT_TRUE operand serves as a barrier - generate code now
2633 for what we have collected sofar.
2634 Like DT_TRUE, DT_MATCH serves as a barrier as it can cause
2635 dependent matches to get out-of-order. Generate code now
2636 for what we have collected sofar. */
2637 gen_kids_1 (f, indent, gimple, gimple_exprs, generic_exprs,
2638 fns, generic_fns, preds, others);
2639 /* And output the true operand itself. */
2640 kids[i]->gen (f, indent, gimple);
2641 gimple_exprs.truncate (0);
2642 generic_exprs.truncate (0);
2643 fns.truncate (0);
2644 generic_fns.truncate (0);
2645 preds.truncate (0);
2646 others.truncate (0);
2648 else
2649 gcc_unreachable ();
2652 /* Generate code for the remains. */
2653 gen_kids_1 (f, indent, gimple, gimple_exprs, generic_exprs,
2654 fns, generic_fns, preds, others);
2657 /* Generate matching code for the children of the decision tree node. */
2659 void
2660 dt_node::gen_kids_1 (FILE *f, int indent, bool gimple,
2661 vec<dt_operand *> gimple_exprs,
2662 vec<dt_operand *> generic_exprs,
2663 vec<dt_operand *> fns,
2664 vec<dt_operand *> generic_fns,
2665 vec<dt_operand *> preds,
2666 vec<dt_node *> others)
2668 char buf[128];
2669 char *kid_opname = buf;
2671 unsigned exprs_len = gimple_exprs.length ();
2672 unsigned gexprs_len = generic_exprs.length ();
2673 unsigned fns_len = fns.length ();
2674 unsigned gfns_len = generic_fns.length ();
2676 if (exprs_len || fns_len || gexprs_len || gfns_len)
2678 if (exprs_len)
2679 gimple_exprs[0]->get_name (kid_opname);
2680 else if (fns_len)
2681 fns[0]->get_name (kid_opname);
2682 else if (gfns_len)
2683 generic_fns[0]->get_name (kid_opname);
2684 else
2685 generic_exprs[0]->get_name (kid_opname);
2687 fprintf_indent (f, indent, "switch (TREE_CODE (%s))\n", kid_opname);
2688 fprintf_indent (f, indent, " {\n");
2689 indent += 2;
2692 if (exprs_len || fns_len)
2694 fprintf_indent (f, indent,
2695 "case SSA_NAME:\n");
2696 fprintf_indent (f, indent,
2697 " if (do_valueize (valueize, %s) != NULL_TREE)\n",
2698 kid_opname);
2699 fprintf_indent (f, indent,
2700 " {\n");
2701 fprintf_indent (f, indent,
2702 " gimple *def_stmt = SSA_NAME_DEF_STMT (%s);\n",
2703 kid_opname);
2705 indent += 6;
2706 if (exprs_len)
2708 fprintf_indent (f, indent,
2709 "if (gassign *def = dyn_cast <gassign *> (def_stmt))\n");
2710 fprintf_indent (f, indent,
2711 " switch (gimple_assign_rhs_code (def))\n");
2712 indent += 4;
2713 fprintf_indent (f, indent, "{\n");
2714 for (unsigned i = 0; i < exprs_len; ++i)
2716 expr *e = as_a <expr *> (gimple_exprs[i]->op);
2717 id_base *op = e->operation;
2718 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2719 fprintf_indent (f, indent, "CASE_CONVERT:\n");
2720 else
2721 fprintf_indent (f, indent, "case %s:\n", op->id);
2722 fprintf_indent (f, indent, " {\n");
2723 gimple_exprs[i]->gen (f, indent + 4, true);
2724 fprintf_indent (f, indent, " break;\n");
2725 fprintf_indent (f, indent, " }\n");
2727 fprintf_indent (f, indent, "default:;\n");
2728 fprintf_indent (f, indent, "}\n");
2729 indent -= 4;
2732 if (fns_len)
2734 fprintf_indent (f, indent,
2735 "%sif (gcall *def = dyn_cast <gcall *>"
2736 " (def_stmt))\n",
2737 exprs_len ? "else " : "");
2738 fprintf_indent (f, indent,
2739 " switch (gimple_call_combined_fn (def))\n");
2741 indent += 4;
2742 fprintf_indent (f, indent, "{\n");
2743 for (unsigned i = 0; i < fns_len; ++i)
2745 expr *e = as_a <expr *>(fns[i]->op);
2746 fprintf_indent (f, indent, "case %s:\n", e->operation->id);
2747 fprintf_indent (f, indent, " {\n");
2748 fns[i]->gen (f, indent + 4, true);
2749 fprintf_indent (f, indent, " break;\n");
2750 fprintf_indent (f, indent, " }\n");
2753 fprintf_indent (f, indent, "default:;\n");
2754 fprintf_indent (f, indent, "}\n");
2755 indent -= 4;
2758 indent -= 6;
2759 fprintf_indent (f, indent, " }\n");
2760 fprintf_indent (f, indent, " break;\n");
2763 for (unsigned i = 0; i < generic_exprs.length (); ++i)
2765 expr *e = as_a <expr *>(generic_exprs[i]->op);
2766 id_base *op = e->operation;
2767 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2768 fprintf_indent (f, indent, "CASE_CONVERT:\n");
2769 else
2770 fprintf_indent (f, indent, "case %s:\n", op->id);
2771 fprintf_indent (f, indent, " {\n");
2772 generic_exprs[i]->gen (f, indent + 4, gimple);
2773 fprintf_indent (f, indent, " break;\n");
2774 fprintf_indent (f, indent, " }\n");
2777 if (gfns_len)
2779 fprintf_indent (f, indent,
2780 "case CALL_EXPR:\n");
2781 fprintf_indent (f, indent,
2782 " switch (get_call_combined_fn (%s))\n",
2783 kid_opname);
2784 fprintf_indent (f, indent,
2785 " {\n");
2786 indent += 4;
2788 for (unsigned j = 0; j < generic_fns.length (); ++j)
2790 expr *e = as_a <expr *>(generic_fns[j]->op);
2791 gcc_assert (e->operation->kind == id_base::FN);
2793 fprintf_indent (f, indent, "case %s:\n", e->operation->id);
2794 fprintf_indent (f, indent, " {\n");
2795 generic_fns[j]->gen (f, indent + 4, false);
2796 fprintf_indent (f, indent, " break;\n");
2797 fprintf_indent (f, indent, " }\n");
2799 fprintf_indent (f, indent, "default:;\n");
2801 indent -= 4;
2802 fprintf_indent (f, indent, " }\n");
2803 fprintf_indent (f, indent, " break;\n");
2806 /* Close switch (TREE_CODE ()). */
2807 if (exprs_len || fns_len || gexprs_len || gfns_len)
2809 indent -= 4;
2810 fprintf_indent (f, indent, " default:;\n");
2811 fprintf_indent (f, indent, " }\n");
2814 for (unsigned i = 0; i < preds.length (); ++i)
2816 expr *e = as_a <expr *> (preds[i]->op);
2817 predicate_id *p = as_a <predicate_id *> (e->operation);
2818 preds[i]->get_name (kid_opname);
2819 fprintf_indent (f, indent, "tree %s_pops[%d];\n", kid_opname, p->nargs);
2820 fprintf_indent (f, indent, "if (%s_%s (%s, %s_pops%s))\n",
2821 gimple ? "gimple" : "tree",
2822 p->id, kid_opname, kid_opname,
2823 gimple ? ", valueize" : "");
2824 fprintf_indent (f, indent, " {\n");
2825 for (int j = 0; j < p->nargs; ++j)
2827 char child_opname[20];
2828 preds[i]->gen_opname (child_opname, j);
2829 fprintf_indent (f, indent + 4, "tree %s = %s_pops[%d];\n",
2830 child_opname, kid_opname, j);
2832 preds[i]->gen_kids (f, indent + 4, gimple);
2833 fprintf (f, "}\n");
2836 for (unsigned i = 0; i < others.length (); ++i)
2837 others[i]->gen (f, indent, gimple);
2840 /* Generate matching code for the decision tree operand. */
2842 void
2843 dt_operand::gen (FILE *f, int indent, bool gimple)
2845 char opname[20];
2846 get_name (opname);
2848 unsigned n_braces = 0;
2850 if (type == DT_OPERAND)
2851 switch (op->type)
2853 case operand::OP_PREDICATE:
2854 n_braces = gen_predicate (f, indent, opname, gimple);
2855 break;
2857 case operand::OP_EXPR:
2858 if (gimple)
2859 n_braces = gen_gimple_expr (f, indent);
2860 else
2861 n_braces = gen_generic_expr (f, indent, opname);
2862 break;
2864 default:
2865 gcc_unreachable ();
2867 else if (type == DT_TRUE)
2869 else if (type == DT_MATCH)
2870 n_braces = gen_match_op (f, indent, opname);
2871 else
2872 gcc_unreachable ();
2874 indent += 4 * n_braces;
2875 gen_kids (f, indent, gimple);
2877 for (unsigned i = 0; i < n_braces; ++i)
2879 indent -= 4;
2880 if (indent < 0)
2881 indent = 0;
2882 fprintf_indent (f, indent, " }\n");
2887 /* Generate code for the '(if ...)', '(with ..)' and actual transform
2888 step of a '(simplify ...)' or '(match ...)'. This handles everything
2889 that is not part of the decision tree (simplify->match).
2890 Main recursive worker. */
2892 void
2893 dt_simplify::gen_1 (FILE *f, int indent, bool gimple, operand *result)
2895 if (result)
2897 if (with_expr *w = dyn_cast <with_expr *> (result))
2899 fprintf_indent (f, indent, "{\n");
2900 indent += 4;
2901 output_line_directive (f, w->location);
2902 w->with->gen_transform (f, indent, NULL, true, 1, "type", NULL);
2903 gen_1 (f, indent, gimple, w->subexpr);
2904 indent -= 4;
2905 fprintf_indent (f, indent, "}\n");
2906 return;
2908 else if (if_expr *ife = dyn_cast <if_expr *> (result))
2910 output_line_directive (f, ife->location);
2911 fprintf_indent (f, indent, "if (");
2912 ife->cond->gen_transform (f, indent, NULL, true, 1, "type", NULL);
2913 fprintf (f, ")\n");
2914 fprintf_indent (f, indent + 2, "{\n");
2915 indent += 4;
2916 gen_1 (f, indent, gimple, ife->trueexpr);
2917 indent -= 4;
2918 fprintf_indent (f, indent + 2, "}\n");
2919 if (ife->falseexpr)
2921 fprintf_indent (f, indent, "else\n");
2922 fprintf_indent (f, indent + 2, "{\n");
2923 indent += 4;
2924 gen_1 (f, indent, gimple, ife->falseexpr);
2925 indent -= 4;
2926 fprintf_indent (f, indent + 2, "}\n");
2928 return;
2932 /* Analyze captures and perform early-outs on the incoming arguments
2933 that cover cases we cannot handle. */
2934 capture_info cinfo (s, result, gimple);
2935 if (s->kind == simplify::SIMPLIFY)
2937 if (!gimple)
2939 for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
2940 if (cinfo.force_no_side_effects & (1 << i))
2942 fprintf_indent (f, indent,
2943 "if (TREE_SIDE_EFFECTS (op%d)) return NULL_TREE;\n",
2945 if (verbose >= 1)
2946 warning_at (as_a <expr *> (s->match)->ops[i]->location,
2947 "forcing toplevel operand to have no "
2948 "side-effects");
2950 for (int i = 0; i <= s->capture_max; ++i)
2951 if (cinfo.info[i].cse_p)
2953 else if (cinfo.info[i].force_no_side_effects_p
2954 && (cinfo.info[i].toplevel_msk
2955 & cinfo.force_no_side_effects) == 0)
2957 fprintf_indent (f, indent,
2958 "if (TREE_SIDE_EFFECTS (captures[%d])) "
2959 "return NULL_TREE;\n", i);
2960 if (verbose >= 1)
2961 warning_at (cinfo.info[i].c->location,
2962 "forcing captured operand to have no "
2963 "side-effects");
2965 else if ((cinfo.info[i].toplevel_msk
2966 & cinfo.force_no_side_effects) != 0)
2967 /* Mark capture as having no side-effects if we had to verify
2968 that via forced toplevel operand checks. */
2969 cinfo.info[i].force_no_side_effects_p = true;
2971 if (gimple)
2973 /* Force single-use restriction by only allowing simple
2974 results via setting seq to NULL. */
2975 fprintf_indent (f, indent, "gimple_seq *lseq = seq;\n");
2976 bool first_p = true;
2977 for (int i = 0; i <= s->capture_max; ++i)
2978 if (cinfo.info[i].force_single_use)
2980 if (first_p)
2982 fprintf_indent (f, indent, "if (lseq\n");
2983 fprintf_indent (f, indent, " && (");
2984 first_p = false;
2986 else
2988 fprintf (f, "\n");
2989 fprintf_indent (f, indent, " || ");
2991 fprintf (f, "!single_use (captures[%d])", i);
2993 if (!first_p)
2995 fprintf (f, "))\n");
2996 fprintf_indent (f, indent, " lseq = NULL;\n");
3001 fprintf_indent (f, indent, "if (dump_file && (dump_flags & TDF_DETAILS)) "
3002 "fprintf (dump_file, \"Applying pattern ");
3003 output_line_directive (f,
3004 result ? result->location : s->match->location, true);
3005 fprintf (f, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
3007 if (!result)
3009 /* If there is no result then this is a predicate implementation. */
3010 fprintf_indent (f, indent, "return true;\n");
3012 else if (gimple)
3014 /* For GIMPLE simply drop NON_LVALUE_EXPR (which only appears
3015 in outermost position). */
3016 if (result->type == operand::OP_EXPR
3017 && *as_a <expr *> (result)->operation == NON_LVALUE_EXPR)
3018 result = as_a <expr *> (result)->ops[0];
3019 if (result->type == operand::OP_EXPR)
3021 expr *e = as_a <expr *> (result);
3022 id_base *opr = e->operation;
3023 bool is_predicate = false;
3024 /* When we delay operator substituting during lowering of fors we
3025 make sure that for code-gen purposes the effects of each substitute
3026 are the same. Thus just look at that. */
3027 if (user_id *uid = dyn_cast <user_id *> (opr))
3028 opr = uid->substitutes[0];
3029 else if (is_a <predicate_id *> (opr))
3030 is_predicate = true;
3031 if (!is_predicate)
3032 fprintf_indent (f, indent, "*res_code = %s;\n",
3033 *e->operation == CONVERT_EXPR
3034 ? "NOP_EXPR" : e->operation->id);
3035 for (unsigned j = 0; j < e->ops.length (); ++j)
3037 char dest[32];
3038 snprintf (dest, 32, "res_ops[%d]", j);
3039 const char *optype
3040 = get_operand_type (opr,
3041 "type", e->expr_type,
3042 j == 0 ? NULL : "TREE_TYPE (res_ops[0])");
3043 /* We need to expand GENERIC conditions we captured from
3044 COND_EXPRs. */
3045 bool expand_generic_cond_exprs_p
3046 = (!is_predicate
3047 /* But avoid doing that if the GENERIC condition is
3048 valid - which it is in the first operand of COND_EXPRs
3049 and VEC_COND_EXRPs. */
3050 && ((!(*opr == COND_EXPR)
3051 && !(*opr == VEC_COND_EXPR))
3052 || j != 0));
3053 e->ops[j]->gen_transform (f, indent, dest, true, 1, optype,
3054 &cinfo,
3055 indexes, expand_generic_cond_exprs_p);
3058 /* Re-fold the toplevel result. It's basically an embedded
3059 gimple_build w/o actually building the stmt. */
3060 if (!is_predicate)
3061 fprintf_indent (f, indent,
3062 "gimple_resimplify%d (lseq, res_code, type, "
3063 "res_ops, valueize);\n", e->ops.length ());
3065 else if (result->type == operand::OP_CAPTURE
3066 || result->type == operand::OP_C_EXPR)
3068 result->gen_transform (f, indent, "res_ops[0]", true, 1, "type",
3069 &cinfo, indexes, false);
3070 fprintf_indent (f, indent, "*res_code = TREE_CODE (res_ops[0]);\n");
3071 if (is_a <capture *> (result)
3072 && cinfo.info[as_a <capture *> (result)->where].cond_expr_cond_p)
3074 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
3075 with substituting a capture of that. */
3076 fprintf_indent (f, indent,
3077 "if (COMPARISON_CLASS_P (res_ops[0]))\n");
3078 fprintf_indent (f, indent,
3079 " {\n");
3080 fprintf_indent (f, indent,
3081 " tree tem = res_ops[0];\n");
3082 fprintf_indent (f, indent,
3083 " res_ops[0] = TREE_OPERAND (tem, 0);\n");
3084 fprintf_indent (f, indent,
3085 " res_ops[1] = TREE_OPERAND (tem, 1);\n");
3086 fprintf_indent (f, indent,
3087 " }\n");
3090 else
3091 gcc_unreachable ();
3092 fprintf_indent (f, indent, "return true;\n");
3094 else /* GENERIC */
3096 bool is_predicate = false;
3097 if (result->type == operand::OP_EXPR)
3099 expr *e = as_a <expr *> (result);
3100 id_base *opr = e->operation;
3101 /* When we delay operator substituting during lowering of fors we
3102 make sure that for code-gen purposes the effects of each substitute
3103 are the same. Thus just look at that. */
3104 if (user_id *uid = dyn_cast <user_id *> (opr))
3105 opr = uid->substitutes[0];
3106 else if (is_a <predicate_id *> (opr))
3107 is_predicate = true;
3108 /* Search for captures used multiple times in the result expression
3109 and dependent on TREE_SIDE_EFFECTS emit a SAVE_EXPR. */
3110 if (!is_predicate)
3111 for (int i = 0; i < s->capture_max + 1; ++i)
3113 if (cinfo.info[i].same_as != (unsigned)i)
3114 continue;
3115 if (!cinfo.info[i].force_no_side_effects_p
3116 && cinfo.info[i].result_use_count > 1)
3118 fprintf_indent (f, indent,
3119 "if (TREE_SIDE_EFFECTS (captures[%d]))\n",
3121 fprintf_indent (f, indent,
3122 " captures[%d] = save_expr (captures[%d]);\n",
3123 i, i);
3126 for (unsigned j = 0; j < e->ops.length (); ++j)
3128 char dest[32];
3129 if (is_predicate)
3130 snprintf (dest, 32, "res_ops[%d]", j);
3131 else
3133 fprintf_indent (f, indent, "tree res_op%d;\n", j);
3134 snprintf (dest, 32, "res_op%d", j);
3136 const char *optype
3137 = get_operand_type (opr,
3138 "type", e->expr_type,
3139 j == 0
3140 ? NULL : "TREE_TYPE (res_op0)");
3141 e->ops[j]->gen_transform (f, indent, dest, false, 1, optype,
3142 &cinfo, indexes);
3144 if (is_predicate)
3145 fprintf_indent (f, indent, "return true;\n");
3146 else
3148 fprintf_indent (f, indent, "tree res;\n");
3149 /* Re-fold the toplevel result. Use non_lvalue to
3150 build NON_LVALUE_EXPRs so they get properly
3151 ignored when in GIMPLE form. */
3152 if (*opr == NON_LVALUE_EXPR)
3153 fprintf_indent (f, indent,
3154 "res = non_lvalue_loc (loc, res_op0);\n");
3155 else
3157 if (is_a <operator_id *> (opr))
3158 fprintf_indent (f, indent,
3159 "res = fold_build%d_loc (loc, %s, type",
3160 e->ops.length (),
3161 *e->operation == CONVERT_EXPR
3162 ? "NOP_EXPR" : e->operation->id);
3163 else
3164 fprintf_indent (f, indent,
3165 "res = maybe_build_call_expr_loc (loc, "
3166 "%s, type, %d", e->operation->id,
3167 e->ops.length());
3168 for (unsigned j = 0; j < e->ops.length (); ++j)
3169 fprintf (f, ", res_op%d", j);
3170 fprintf (f, ");\n");
3171 if (!is_a <operator_id *> (opr))
3173 fprintf_indent (f, indent, "if (!res)\n");
3174 fprintf_indent (f, indent, " return NULL_TREE;\n");
3179 else if (result->type == operand::OP_CAPTURE
3180 || result->type == operand::OP_C_EXPR)
3183 fprintf_indent (f, indent, "tree res;\n");
3184 result->gen_transform (f, indent, "res", false, 1, "type",
3185 &cinfo, indexes);
3187 else
3188 gcc_unreachable ();
3189 if (!is_predicate)
3191 /* Search for captures not used in the result expression and dependent
3192 on TREE_SIDE_EFFECTS emit omit_one_operand. */
3193 for (int i = 0; i < s->capture_max + 1; ++i)
3195 if (cinfo.info[i].same_as != (unsigned)i)
3196 continue;
3197 if (!cinfo.info[i].force_no_side_effects_p
3198 && !cinfo.info[i].expr_p
3199 && cinfo.info[i].result_use_count == 0)
3201 fprintf_indent (f, indent,
3202 "if (TREE_SIDE_EFFECTS (captures[%d]))\n",
3204 fprintf_indent (f, indent + 2,
3205 "res = build2_loc (loc, COMPOUND_EXPR, type, "
3206 "fold_ignored_result (captures[%d]), res);\n",
3210 fprintf_indent (f, indent, "return res;\n");
3215 /* Generate code for the '(if ...)', '(with ..)' and actual transform
3216 step of a '(simplify ...)' or '(match ...)'. This handles everything
3217 that is not part of the decision tree (simplify->match). */
3219 void
3220 dt_simplify::gen (FILE *f, int indent, bool gimple)
3222 fprintf_indent (f, indent, "{\n");
3223 indent += 2;
3224 output_line_directive (f,
3225 s->result ? s->result->location : s->match->location);
3226 if (s->capture_max >= 0)
3228 char opname[20];
3229 fprintf_indent (f, indent, "tree captures[%u] ATTRIBUTE_UNUSED = { %s",
3230 s->capture_max + 1, indexes[0]->get_name (opname));
3232 for (int i = 1; i <= s->capture_max; ++i)
3234 if (!indexes[i])
3235 break;
3236 fprintf (f, ", %s", indexes[i]->get_name (opname));
3238 fprintf (f, " };\n");
3241 /* If we have a split-out function for the actual transform, call it. */
3242 if (info && info->fname)
3244 if (gimple)
3246 fprintf_indent (f, indent, "if (%s (res_code, res_ops, seq, "
3247 "valueize, type, captures", info->fname);
3248 for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3249 fprintf (f, ", %s", s->for_subst_vec[i].second->id);
3250 fprintf (f, "))\n");
3251 fprintf_indent (f, indent, " return true;\n");
3253 else
3255 fprintf_indent (f, indent, "tree res = %s (loc, type",
3256 info->fname);
3257 for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
3258 fprintf (f, ", op%d", i);
3259 fprintf (f, ", captures");
3260 for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3261 fprintf (f, ", %s", s->for_subst_vec[i].second->id);
3262 fprintf (f, ");\n");
3263 fprintf_indent (f, indent, "if (res) return res;\n");
3266 else
3268 for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3270 if (is_a <operator_id *> (s->for_subst_vec[i].second))
3271 fprintf_indent (f, indent, "enum tree_code %s = %s;\n",
3272 s->for_subst_vec[i].first->id,
3273 s->for_subst_vec[i].second->id);
3274 else if (is_a <fn_id *> (s->for_subst_vec[i].second))
3275 fprintf_indent (f, indent, "combined_fn %s = %s;\n",
3276 s->for_subst_vec[i].first->id,
3277 s->for_subst_vec[i].second->id);
3278 else
3279 gcc_unreachable ();
3281 gen_1 (f, indent, gimple, s->result);
3284 indent -= 2;
3285 fprintf_indent (f, indent, "}\n");
3289 /* Hash function for finding equivalent transforms. */
3291 hashval_t
3292 sinfo_hashmap_traits::hash (const key_type &v)
3294 /* Only bother to compare those originating from the same source pattern. */
3295 return v->s->result->location;
3298 /* Compare function for finding equivalent transforms. */
3300 static bool
3301 compare_op (operand *o1, simplify *s1, operand *o2, simplify *s2)
3303 if (o1->type != o2->type)
3304 return false;
3306 switch (o1->type)
3308 case operand::OP_IF:
3310 if_expr *if1 = as_a <if_expr *> (o1);
3311 if_expr *if2 = as_a <if_expr *> (o2);
3312 /* ??? Properly compare c-exprs. */
3313 if (if1->cond != if2->cond)
3314 return false;
3315 if (!compare_op (if1->trueexpr, s1, if2->trueexpr, s2))
3316 return false;
3317 if (if1->falseexpr != if2->falseexpr
3318 || (if1->falseexpr
3319 && !compare_op (if1->falseexpr, s1, if2->falseexpr, s2)))
3320 return false;
3321 return true;
3323 case operand::OP_WITH:
3325 with_expr *with1 = as_a <with_expr *> (o1);
3326 with_expr *with2 = as_a <with_expr *> (o2);
3327 if (with1->with != with2->with)
3328 return false;
3329 return compare_op (with1->subexpr, s1, with2->subexpr, s2);
3331 default:;
3334 /* We've hit a result. Time to compare capture-infos - this is required
3335 in addition to the conservative pointer-equivalency of the result IL. */
3336 capture_info cinfo1 (s1, o1, true);
3337 capture_info cinfo2 (s2, o2, true);
3339 if (cinfo1.force_no_side_effects != cinfo2.force_no_side_effects
3340 || cinfo1.info.length () != cinfo2.info.length ())
3341 return false;
3343 for (unsigned i = 0; i < cinfo1.info.length (); ++i)
3345 if (cinfo1.info[i].expr_p != cinfo2.info[i].expr_p
3346 || cinfo1.info[i].cse_p != cinfo2.info[i].cse_p
3347 || (cinfo1.info[i].force_no_side_effects_p
3348 != cinfo2.info[i].force_no_side_effects_p)
3349 || cinfo1.info[i].force_single_use != cinfo2.info[i].force_single_use
3350 || cinfo1.info[i].cond_expr_cond_p != cinfo2.info[i].cond_expr_cond_p
3351 /* toplevel_msk is an optimization */
3352 || cinfo1.info[i].result_use_count != cinfo2.info[i].result_use_count
3353 || cinfo1.info[i].same_as != cinfo2.info[i].same_as
3354 /* the pointer back to the capture is for diagnostics only */)
3355 return false;
3358 /* ??? Deep-compare the actual result. */
3359 return o1 == o2;
3362 bool
3363 sinfo_hashmap_traits::equal_keys (const key_type &v,
3364 const key_type &candidate)
3366 return compare_op (v->s->result, v->s, candidate->s->result, candidate->s);
3370 /* Main entry to generate code for matching GIMPLE IL off the decision
3371 tree. */
3373 void
3374 decision_tree::gen (FILE *f, bool gimple)
3376 sinfo_map_t si;
3378 root->analyze (si);
3380 fprintf (stderr, "%s decision tree has %u leafs, maximum depth %u and "
3381 "a total number of %u nodes\n",
3382 gimple ? "GIMPLE" : "GENERIC",
3383 root->num_leafs, root->max_level, root->total_size);
3385 /* First split out the transform part of equal leafs. */
3386 unsigned rcnt = 0;
3387 unsigned fcnt = 1;
3388 for (sinfo_map_t::iterator iter = si.begin ();
3389 iter != si.end (); ++iter)
3391 sinfo *s = (*iter).second;
3392 /* Do not split out single uses. */
3393 if (s->cnt <= 1)
3394 continue;
3396 rcnt += s->cnt - 1;
3397 if (verbose >= 1)
3399 fprintf (stderr, "found %u uses of", s->cnt);
3400 output_line_directive (stderr, s->s->s->result->location);
3403 /* Generate a split out function with the leaf transform code. */
3404 s->fname = xasprintf ("%s_simplify_%u", gimple ? "gimple" : "generic",
3405 fcnt++);
3406 if (gimple)
3407 fprintf (f, "\nstatic bool\n"
3408 "%s (code_helper *res_code, tree *res_ops,\n"
3409 " gimple_seq *seq, tree (*valueize)(tree) "
3410 "ATTRIBUTE_UNUSED,\n"
3411 " tree ARG_UNUSED (type), tree *ARG_UNUSED "
3412 "(captures)\n",
3413 s->fname);
3414 else
3416 fprintf (f, "\nstatic tree\n"
3417 "%s (location_t ARG_UNUSED (loc), tree ARG_UNUSED (type),\n",
3418 (*iter).second->fname);
3419 for (unsigned i = 0;
3420 i < as_a <expr *>(s->s->s->match)->ops.length (); ++i)
3421 fprintf (f, " tree ARG_UNUSED (op%d),", i);
3422 fprintf (f, " tree *captures\n");
3424 for (unsigned i = 0; i < s->s->s->for_subst_vec.length (); ++i)
3426 if (is_a <operator_id *> (s->s->s->for_subst_vec[i].second))
3427 fprintf (f, ", enum tree_code ARG_UNUSED (%s)",
3428 s->s->s->for_subst_vec[i].first->id);
3429 else if (is_a <fn_id *> (s->s->s->for_subst_vec[i].second))
3430 fprintf (f, ", combined_fn ARG_UNUSED (%s)",
3431 s->s->s->for_subst_vec[i].first->id);
3434 fprintf (f, ")\n{\n");
3435 s->s->gen_1 (f, 2, gimple, s->s->s->result);
3436 if (gimple)
3437 fprintf (f, " return false;\n");
3438 else
3439 fprintf (f, " return NULL_TREE;\n");
3440 fprintf (f, "}\n");
3442 fprintf (stderr, "removed %u duplicate tails\n", rcnt);
3444 for (unsigned n = 1; n <= 3; ++n)
3446 /* First generate split-out functions. */
3447 for (unsigned i = 0; i < root->kids.length (); i++)
3449 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
3450 expr *e = static_cast<expr *>(dop->op);
3451 if (e->ops.length () != n
3452 /* Builtin simplifications are somewhat premature on
3453 GENERIC. The following drops patterns with outermost
3454 calls. It's easy to emit overloads for function code
3455 though if necessary. */
3456 || (!gimple
3457 && e->operation->kind != id_base::CODE))
3458 continue;
3460 if (gimple)
3461 fprintf (f, "\nstatic bool\n"
3462 "gimple_simplify_%s (code_helper *res_code, tree *res_ops,\n"
3463 " gimple_seq *seq, tree (*valueize)(tree) "
3464 "ATTRIBUTE_UNUSED,\n"
3465 " code_helper ARG_UNUSED (code), tree "
3466 "ARG_UNUSED (type)\n",
3467 e->operation->id);
3468 else
3469 fprintf (f, "\nstatic tree\n"
3470 "generic_simplify_%s (location_t ARG_UNUSED (loc), enum "
3471 "tree_code ARG_UNUSED (code), tree ARG_UNUSED (type)",
3472 e->operation->id);
3473 for (unsigned i = 0; i < n; ++i)
3474 fprintf (f, ", tree op%d", i);
3475 fprintf (f, ")\n");
3476 fprintf (f, "{\n");
3477 dop->gen_kids (f, 2, gimple);
3478 if (gimple)
3479 fprintf (f, " return false;\n");
3480 else
3481 fprintf (f, " return NULL_TREE;\n");
3482 fprintf (f, "}\n");
3485 /* Then generate the main entry with the outermost switch and
3486 tail-calls to the split-out functions. */
3487 if (gimple)
3488 fprintf (f, "\nstatic bool\n"
3489 "gimple_simplify (code_helper *res_code, tree *res_ops,\n"
3490 " gimple_seq *seq, tree (*valueize)(tree),\n"
3491 " code_helper code, tree type");
3492 else
3493 fprintf (f, "\ntree\n"
3494 "generic_simplify (location_t loc, enum tree_code code, "
3495 "tree type ATTRIBUTE_UNUSED");
3496 for (unsigned i = 0; i < n; ++i)
3497 fprintf (f, ", tree op%d", i);
3498 fprintf (f, ")\n");
3499 fprintf (f, "{\n");
3501 if (gimple)
3502 fprintf (f, " switch (code.get_rep())\n"
3503 " {\n");
3504 else
3505 fprintf (f, " switch (code)\n"
3506 " {\n");
3507 for (unsigned i = 0; i < root->kids.length (); i++)
3509 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
3510 expr *e = static_cast<expr *>(dop->op);
3511 if (e->ops.length () != n
3512 /* Builtin simplifications are somewhat premature on
3513 GENERIC. The following drops patterns with outermost
3514 calls. It's easy to emit overloads for function code
3515 though if necessary. */
3516 || (!gimple
3517 && e->operation->kind != id_base::CODE))
3518 continue;
3520 if (*e->operation == CONVERT_EXPR
3521 || *e->operation == NOP_EXPR)
3522 fprintf (f, " CASE_CONVERT:\n");
3523 else
3524 fprintf (f, " case %s%s:\n",
3525 is_a <fn_id *> (e->operation) ? "-" : "",
3526 e->operation->id);
3527 if (gimple)
3528 fprintf (f, " return gimple_simplify_%s (res_code, res_ops, "
3529 "seq, valueize, code, type", e->operation->id);
3530 else
3531 fprintf (f, " return generic_simplify_%s (loc, code, type",
3532 e->operation->id);
3533 for (unsigned i = 0; i < n; ++i)
3534 fprintf (f, ", op%d", i);
3535 fprintf (f, ");\n");
3537 fprintf (f, " default:;\n"
3538 " }\n");
3540 if (gimple)
3541 fprintf (f, " return false;\n");
3542 else
3543 fprintf (f, " return NULL_TREE;\n");
3544 fprintf (f, "}\n");
3548 /* Output code to implement the predicate P from the decision tree DT. */
3550 void
3551 write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple)
3553 fprintf (f, "\nbool\n"
3554 "%s%s (tree t%s%s)\n"
3555 "{\n", gimple ? "gimple_" : "tree_", p->id,
3556 p->nargs > 0 ? ", tree *res_ops" : "",
3557 gimple ? ", tree (*valueize)(tree)" : "");
3558 /* Conveniently make 'type' available. */
3559 fprintf_indent (f, 2, "tree type = TREE_TYPE (t);\n");
3561 if (!gimple)
3562 fprintf_indent (f, 2, "if (TREE_SIDE_EFFECTS (t)) return false;\n");
3563 dt.root->gen_kids (f, 2, gimple);
3565 fprintf_indent (f, 2, "return false;\n"
3566 "}\n");
3569 /* Write the common header for the GIMPLE/GENERIC IL matching routines. */
3571 static void
3572 write_header (FILE *f, const char *head)
3574 fprintf (f, "/* Generated automatically by the program `genmatch' from\n");
3575 fprintf (f, " a IL pattern matching and simplification description. */\n");
3577 /* Include the header instead of writing it awkwardly quoted here. */
3578 fprintf (f, "\n#include \"%s\"\n", head);
3583 /* AST parsing. */
3585 class parser
3587 public:
3588 parser (cpp_reader *);
3590 private:
3591 const cpp_token *next ();
3592 const cpp_token *peek (unsigned = 1);
3593 const cpp_token *peek_ident (const char * = NULL, unsigned = 1);
3594 const cpp_token *expect (enum cpp_ttype);
3595 const cpp_token *eat_token (enum cpp_ttype);
3596 const char *get_string ();
3597 const char *get_ident ();
3598 const cpp_token *eat_ident (const char *);
3599 const char *get_number ();
3601 id_base *parse_operation ();
3602 operand *parse_capture (operand *, bool);
3603 operand *parse_expr ();
3604 c_expr *parse_c_expr (cpp_ttype);
3605 operand *parse_op ();
3607 void record_operlist (source_location, user_id *);
3609 void parse_pattern ();
3610 operand *parse_result (operand *, predicate_id *);
3611 void push_simplify (simplify::simplify_kind,
3612 vec<simplify *>&, operand *, operand *);
3613 void parse_simplify (simplify::simplify_kind,
3614 vec<simplify *>&, predicate_id *, operand *);
3615 void parse_for (source_location);
3616 void parse_if (source_location);
3617 void parse_predicates (source_location);
3618 void parse_operator_list (source_location);
3620 cpp_reader *r;
3621 vec<c_expr *> active_ifs;
3622 vec<vec<user_id *> > active_fors;
3623 hash_set<user_id *> *oper_lists_set;
3624 vec<user_id *> oper_lists;
3626 cid_map_t *capture_ids;
3628 public:
3629 vec<simplify *> simplifiers;
3630 vec<predicate_id *> user_predicates;
3631 bool parsing_match_operand;
3634 /* Lexing helpers. */
3636 /* Read the next non-whitespace token from R. */
3638 const cpp_token *
3639 parser::next ()
3641 const cpp_token *token;
3644 token = cpp_get_token (r);
3646 while (token->type == CPP_PADDING
3647 && token->type != CPP_EOF);
3648 return token;
3651 /* Peek at the next non-whitespace token from R. */
3653 const cpp_token *
3654 parser::peek (unsigned num)
3656 const cpp_token *token;
3657 unsigned i = 0;
3660 token = cpp_peek_token (r, i++);
3662 while ((token->type == CPP_PADDING
3663 && token->type != CPP_EOF)
3664 || (--num > 0));
3665 /* If we peek at EOF this is a fatal error as it leaves the
3666 cpp_reader in unusable state. Assume we really wanted a
3667 token and thus this EOF is unexpected. */
3668 if (token->type == CPP_EOF)
3669 fatal_at (token, "unexpected end of file");
3670 return token;
3673 /* Peek at the next identifier token (or return NULL if the next
3674 token is not an identifier or equal to ID if supplied). */
3676 const cpp_token *
3677 parser::peek_ident (const char *id, unsigned num)
3679 const cpp_token *token = peek (num);
3680 if (token->type != CPP_NAME)
3681 return 0;
3683 if (id == 0)
3684 return token;
3686 const char *t = (const char *) CPP_HASHNODE (token->val.node.node)->ident.str;
3687 if (strcmp (id, t) == 0)
3688 return token;
3690 return 0;
3693 /* Read the next token from R and assert it is of type TK. */
3695 const cpp_token *
3696 parser::expect (enum cpp_ttype tk)
3698 const cpp_token *token = next ();
3699 if (token->type != tk)
3700 fatal_at (token, "expected %s, got %s",
3701 cpp_type2name (tk, 0), cpp_type2name (token->type, 0));
3703 return token;
3706 /* Consume the next token from R and assert it is of type TK. */
3708 const cpp_token *
3709 parser::eat_token (enum cpp_ttype tk)
3711 return expect (tk);
3714 /* Read the next token from R and assert it is of type CPP_STRING and
3715 return its value. */
3717 const char *
3718 parser::get_string ()
3720 const cpp_token *token = expect (CPP_STRING);
3721 return (const char *)token->val.str.text;
3724 /* Read the next token from R and assert it is of type CPP_NAME and
3725 return its value. */
3727 const char *
3728 parser::get_ident ()
3730 const cpp_token *token = expect (CPP_NAME);
3731 return (const char *)CPP_HASHNODE (token->val.node.node)->ident.str;
3734 /* Eat an identifier token with value S from R. */
3736 const cpp_token *
3737 parser::eat_ident (const char *s)
3739 const cpp_token *token = peek ();
3740 const char *t = get_ident ();
3741 if (strcmp (s, t) != 0)
3742 fatal_at (token, "expected '%s' got '%s'\n", s, t);
3743 return token;
3746 /* Read the next token from R and assert it is of type CPP_NUMBER and
3747 return its value. */
3749 const char *
3750 parser::get_number ()
3752 const cpp_token *token = expect (CPP_NUMBER);
3753 return (const char *)token->val.str.text;
3757 /* Record an operator-list use for transparent for handling. */
3759 void
3760 parser::record_operlist (source_location loc, user_id *p)
3762 if (!oper_lists_set->add (p))
3764 if (!oper_lists.is_empty ()
3765 && oper_lists[0]->substitutes.length () != p->substitutes.length ())
3766 fatal_at (loc, "User-defined operator list does not have the "
3767 "same number of entries as others used in the pattern");
3768 oper_lists.safe_push (p);
3772 /* Parse the operator ID, special-casing convert?, convert1? and
3773 convert2? */
3775 id_base *
3776 parser::parse_operation ()
3778 const cpp_token *id_tok = peek ();
3779 const char *id = get_ident ();
3780 const cpp_token *token = peek ();
3781 if (strcmp (id, "convert0") == 0)
3782 fatal_at (id_tok, "use 'convert?' here");
3783 else if (strcmp (id, "view_convert0") == 0)
3784 fatal_at (id_tok, "use 'view_convert?' here");
3785 if (token->type == CPP_QUERY
3786 && !(token->flags & PREV_WHITE))
3788 if (strcmp (id, "convert") == 0)
3789 id = "convert0";
3790 else if (strcmp (id, "convert1") == 0)
3792 else if (strcmp (id, "convert2") == 0)
3794 else if (strcmp (id, "view_convert") == 0)
3795 id = "view_convert0";
3796 else if (strcmp (id, "view_convert1") == 0)
3798 else if (strcmp (id, "view_convert2") == 0)
3800 else
3801 fatal_at (id_tok, "non-convert operator conditionalized");
3803 if (!parsing_match_operand)
3804 fatal_at (id_tok, "conditional convert can only be used in "
3805 "match expression");
3806 eat_token (CPP_QUERY);
3808 else if (strcmp (id, "convert1") == 0
3809 || strcmp (id, "convert2") == 0
3810 || strcmp (id, "view_convert1") == 0
3811 || strcmp (id, "view_convert2") == 0)
3812 fatal_at (id_tok, "expected '?' after conditional operator");
3813 id_base *op = get_operator (id);
3814 if (!op)
3815 fatal_at (id_tok, "unknown operator %s", id);
3817 user_id *p = dyn_cast<user_id *> (op);
3818 if (p && p->is_oper_list)
3820 if (active_fors.length() == 0)
3821 record_operlist (id_tok->src_loc, p);
3822 else
3823 fatal_at (id_tok, "operator-list %s cannot be exapnded inside 'for'", id);
3825 return op;
3828 /* Parse a capture.
3829 capture = '@'<number> */
3831 struct operand *
3832 parser::parse_capture (operand *op, bool require_existing)
3834 source_location src_loc = eat_token (CPP_ATSIGN)->src_loc;
3835 const cpp_token *token = peek ();
3836 const char *id = NULL;
3837 if (token->type == CPP_NUMBER)
3838 id = get_number ();
3839 else if (token->type == CPP_NAME)
3840 id = get_ident ();
3841 else
3842 fatal_at (token, "expected number or identifier");
3843 unsigned next_id = capture_ids->elements ();
3844 bool existed;
3845 unsigned &num = capture_ids->get_or_insert (id, &existed);
3846 if (!existed)
3848 if (require_existing)
3849 fatal_at (src_loc, "unknown capture id");
3850 num = next_id;
3852 return new capture (src_loc, num, op);
3855 /* Parse an expression
3856 expr = '(' <operation>[capture][flag][type] <operand>... ')' */
3858 struct operand *
3859 parser::parse_expr ()
3861 const cpp_token *token = peek ();
3862 expr *e = new expr (parse_operation (), token->src_loc);
3863 token = peek ();
3864 operand *op;
3865 bool is_commutative = false;
3866 bool force_capture = false;
3867 const char *expr_type = NULL;
3869 if (token->type == CPP_COLON
3870 && !(token->flags & PREV_WHITE))
3872 eat_token (CPP_COLON);
3873 token = peek ();
3874 if (token->type == CPP_NAME
3875 && !(token->flags & PREV_WHITE))
3877 const char *s = get_ident ();
3878 if (!parsing_match_operand)
3879 expr_type = s;
3880 else
3882 const char *sp = s;
3883 while (*sp)
3885 if (*sp == 'c')
3886 is_commutative = true;
3887 else if (*sp == 's')
3889 e->force_single_use = true;
3890 force_capture = true;
3892 else
3893 fatal_at (token, "flag %c not recognized", *sp);
3894 sp++;
3897 token = peek ();
3899 else
3900 fatal_at (token, "expected flag or type specifying identifier");
3903 if (token->type == CPP_ATSIGN
3904 && !(token->flags & PREV_WHITE))
3905 op = parse_capture (e, false);
3906 else if (force_capture)
3908 unsigned num = capture_ids->elements ();
3909 char id[8];
3910 bool existed;
3911 sprintf (id, "__%u", num);
3912 capture_ids->get_or_insert (xstrdup (id), &existed);
3913 if (existed)
3914 fatal_at (token, "reserved capture id '%s' already used", id);
3915 op = new capture (token->src_loc, num, e);
3917 else
3918 op = e;
3921 const cpp_token *token = peek ();
3922 if (token->type == CPP_CLOSE_PAREN)
3924 if (e->operation->nargs != -1
3925 && e->operation->nargs != (int) e->ops.length ())
3926 fatal_at (token, "'%s' expects %u operands, not %u",
3927 e->operation->id, e->operation->nargs, e->ops.length ());
3928 if (is_commutative)
3930 if (e->ops.length () == 2)
3931 e->is_commutative = true;
3932 else
3933 fatal_at (token, "only binary operators or function with "
3934 "two arguments can be marked commutative");
3936 e->expr_type = expr_type;
3937 return op;
3939 else if (!(token->flags & PREV_WHITE))
3940 fatal_at (token, "expected expression operand");
3942 e->append_op (parse_op ());
3944 while (1);
3947 /* Lex native C code delimited by START recording the preprocessing tokens
3948 for later processing.
3949 c_expr = ('{'|'(') <pp token>... ('}'|')') */
3951 c_expr *
3952 parser::parse_c_expr (cpp_ttype start)
3954 const cpp_token *token;
3955 cpp_ttype end;
3956 unsigned opencnt;
3957 vec<cpp_token> code = vNULL;
3958 unsigned nr_stmts = 0;
3959 source_location loc = eat_token (start)->src_loc;
3960 if (start == CPP_OPEN_PAREN)
3961 end = CPP_CLOSE_PAREN;
3962 else if (start == CPP_OPEN_BRACE)
3963 end = CPP_CLOSE_BRACE;
3964 else
3965 gcc_unreachable ();
3966 opencnt = 1;
3969 token = next ();
3971 /* Count brace pairs to find the end of the expr to match. */
3972 if (token->type == start)
3973 opencnt++;
3974 else if (token->type == end
3975 && --opencnt == 0)
3976 break;
3978 /* This is a lame way of counting the number of statements. */
3979 if (token->type == CPP_SEMICOLON)
3980 nr_stmts++;
3982 /* If this is possibly a user-defined identifier mark it used. */
3983 if (token->type == CPP_NAME)
3985 id_base *idb = get_operator ((const char *)CPP_HASHNODE
3986 (token->val.node.node)->ident.str);
3987 user_id *p;
3988 if (idb && (p = dyn_cast<user_id *> (idb)) && p->is_oper_list)
3989 record_operlist (token->src_loc, p);
3992 /* Record the token. */
3993 code.safe_push (*token);
3995 while (1);
3996 return new c_expr (r, loc, code, nr_stmts, vNULL, capture_ids);
3999 /* Parse an operand which is either an expression, a predicate or
4000 a standalone capture.
4001 op = predicate | expr | c_expr | capture */
4003 struct operand *
4004 parser::parse_op ()
4006 const cpp_token *token = peek ();
4007 struct operand *op = NULL;
4008 if (token->type == CPP_OPEN_PAREN)
4010 eat_token (CPP_OPEN_PAREN);
4011 op = parse_expr ();
4012 eat_token (CPP_CLOSE_PAREN);
4014 else if (token->type == CPP_OPEN_BRACE)
4016 op = parse_c_expr (CPP_OPEN_BRACE);
4018 else
4020 /* Remaining ops are either empty or predicates */
4021 if (token->type == CPP_NAME)
4023 const char *id = get_ident ();
4024 id_base *opr = get_operator (id);
4025 if (!opr)
4026 fatal_at (token, "expected predicate name");
4027 if (operator_id *code = dyn_cast <operator_id *> (opr))
4029 if (code->nargs != 0)
4030 fatal_at (token, "using an operator with operands as predicate");
4031 /* Parse the zero-operand operator "predicates" as
4032 expression. */
4033 op = new expr (opr, token->src_loc);
4035 else if (user_id *code = dyn_cast <user_id *> (opr))
4037 if (code->nargs != 0)
4038 fatal_at (token, "using an operator with operands as predicate");
4039 /* Parse the zero-operand operator "predicates" as
4040 expression. */
4041 op = new expr (opr, token->src_loc);
4043 else if (predicate_id *p = dyn_cast <predicate_id *> (opr))
4044 op = new predicate (p, token->src_loc);
4045 else
4046 fatal_at (token, "using an unsupported operator as predicate");
4047 if (!parsing_match_operand)
4048 fatal_at (token, "predicates are only allowed in match expression");
4049 token = peek ();
4050 if (token->flags & PREV_WHITE)
4051 return op;
4053 else if (token->type != CPP_COLON
4054 && token->type != CPP_ATSIGN)
4055 fatal_at (token, "expected expression or predicate");
4056 /* optionally followed by a capture and a predicate. */
4057 if (token->type == CPP_COLON)
4058 fatal_at (token, "not implemented: predicate on leaf operand");
4059 if (token->type == CPP_ATSIGN)
4060 op = parse_capture (op, !parsing_match_operand);
4063 return op;
4066 /* Create a new simplify from the current parsing state and MATCH,
4067 MATCH_LOC, RESULT and RESULT_LOC and push it to SIMPLIFIERS. */
4069 void
4070 parser::push_simplify (simplify::simplify_kind kind,
4071 vec<simplify *>& simplifiers,
4072 operand *match, operand *result)
4074 /* Build and push a temporary for operator list uses in expressions. */
4075 if (!oper_lists.is_empty ())
4076 active_fors.safe_push (oper_lists);
4078 simplifiers.safe_push
4079 (new simplify (kind, match, result,
4080 active_fors.copy (), capture_ids));
4082 if (!oper_lists.is_empty ())
4083 active_fors.pop ();
4086 /* Parse
4087 <result-op> = <op> | <if> | <with>
4088 <if> = '(' 'if' '(' <c-expr> ')' <result-op> ')'
4089 <with> = '(' 'with' '{' <c-expr> '}' <result-op> ')'
4090 and return it. */
4092 operand *
4093 parser::parse_result (operand *result, predicate_id *matcher)
4095 const cpp_token *token = peek ();
4096 if (token->type != CPP_OPEN_PAREN)
4097 return parse_op ();
4099 eat_token (CPP_OPEN_PAREN);
4100 if (peek_ident ("if"))
4102 eat_ident ("if");
4103 if_expr *ife = new if_expr (token->src_loc);
4104 ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4105 if (peek ()->type == CPP_OPEN_PAREN)
4107 ife->trueexpr = parse_result (result, matcher);
4108 if (peek ()->type == CPP_OPEN_PAREN)
4109 ife->falseexpr = parse_result (result, matcher);
4110 else if (peek ()->type != CPP_CLOSE_PAREN)
4111 ife->falseexpr = parse_op ();
4113 else if (peek ()->type != CPP_CLOSE_PAREN)
4115 ife->trueexpr = parse_op ();
4116 if (peek ()->type == CPP_OPEN_PAREN)
4117 ife->falseexpr = parse_result (result, matcher);
4118 else if (peek ()->type != CPP_CLOSE_PAREN)
4119 ife->falseexpr = parse_op ();
4121 /* If this if is immediately closed then it contains a
4122 manual matcher or is part of a predicate definition. */
4123 else /* if (peek ()->type == CPP_CLOSE_PAREN) */
4125 if (!matcher)
4126 fatal_at (peek (), "manual transform not implemented");
4127 ife->trueexpr = result;
4129 eat_token (CPP_CLOSE_PAREN);
4130 return ife;
4132 else if (peek_ident ("with"))
4134 eat_ident ("with");
4135 with_expr *withe = new with_expr (token->src_loc);
4136 /* Parse (with c-expr expr) as (if-with (true) expr). */
4137 withe->with = parse_c_expr (CPP_OPEN_BRACE);
4138 withe->with->nr_stmts = 0;
4139 withe->subexpr = parse_result (result, matcher);
4140 eat_token (CPP_CLOSE_PAREN);
4141 return withe;
4143 else if (peek_ident ("switch"))
4145 token = eat_ident ("switch");
4146 source_location ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
4147 eat_ident ("if");
4148 if_expr *ife = new if_expr (ifloc);
4149 operand *res = ife;
4150 ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4151 if (peek ()->type == CPP_OPEN_PAREN)
4152 ife->trueexpr = parse_result (result, matcher);
4153 else
4154 ife->trueexpr = parse_op ();
4155 eat_token (CPP_CLOSE_PAREN);
4156 if (peek ()->type != CPP_OPEN_PAREN
4157 || !peek_ident ("if", 2))
4158 fatal_at (token, "switch can be implemented with a single if");
4159 while (peek ()->type != CPP_CLOSE_PAREN)
4161 if (peek ()->type == CPP_OPEN_PAREN)
4163 if (peek_ident ("if", 2))
4165 ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
4166 eat_ident ("if");
4167 ife->falseexpr = new if_expr (ifloc);
4168 ife = as_a <if_expr *> (ife->falseexpr);
4169 ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4170 if (peek ()->type == CPP_OPEN_PAREN)
4171 ife->trueexpr = parse_result (result, matcher);
4172 else
4173 ife->trueexpr = parse_op ();
4174 eat_token (CPP_CLOSE_PAREN);
4176 else
4178 /* switch default clause */
4179 ife->falseexpr = parse_result (result, matcher);
4180 eat_token (CPP_CLOSE_PAREN);
4181 return res;
4184 else
4186 /* switch default clause */
4187 ife->falseexpr = parse_op ();
4188 eat_token (CPP_CLOSE_PAREN);
4189 return res;
4192 eat_token (CPP_CLOSE_PAREN);
4193 return res;
4195 else
4197 operand *op = result;
4198 if (!matcher)
4199 op = parse_expr ();
4200 eat_token (CPP_CLOSE_PAREN);
4201 return op;
4205 /* Parse
4206 simplify = 'simplify' <expr> <result-op>
4208 match = 'match' <ident> <expr> [<result-op>]
4209 and fill SIMPLIFIERS with the results. */
4211 void
4212 parser::parse_simplify (simplify::simplify_kind kind,
4213 vec<simplify *>& simplifiers, predicate_id *matcher,
4214 operand *result)
4216 /* Reset the capture map. */
4217 if (!capture_ids)
4218 capture_ids = new cid_map_t;
4219 /* Reset oper_lists and set. */
4220 hash_set <user_id *> olist;
4221 oper_lists_set = &olist;
4222 oper_lists = vNULL;
4224 const cpp_token *loc = peek ();
4225 parsing_match_operand = true;
4226 struct operand *match = parse_op ();
4227 parsing_match_operand = false;
4228 if (match->type == operand::OP_CAPTURE && !matcher)
4229 fatal_at (loc, "outermost expression cannot be captured");
4230 if (match->type == operand::OP_EXPR
4231 && is_a <predicate_id *> (as_a <expr *> (match)->operation))
4232 fatal_at (loc, "outermost expression cannot be a predicate");
4234 /* Splice active_ifs onto result and continue parsing the
4235 "then" expr. */
4236 if_expr *active_if = NULL;
4237 for (int i = active_ifs.length (); i > 0; --i)
4239 if_expr *ifc = new if_expr (active_ifs[i-1]->location);
4240 ifc->cond = active_ifs[i-1];
4241 ifc->trueexpr = active_if;
4242 active_if = ifc;
4244 if_expr *outermost_if = active_if;
4245 while (active_if && active_if->trueexpr)
4246 active_if = as_a <if_expr *> (active_if->trueexpr);
4248 const cpp_token *token = peek ();
4250 /* If this if is immediately closed then it is part of a predicate
4251 definition. Push it. */
4252 if (token->type == CPP_CLOSE_PAREN)
4254 if (!matcher)
4255 fatal_at (token, "expected transform expression");
4256 if (active_if)
4258 active_if->trueexpr = result;
4259 result = outermost_if;
4261 push_simplify (kind, simplifiers, match, result);
4262 return;
4265 operand *tem = parse_result (result, matcher);
4266 if (active_if)
4268 active_if->trueexpr = tem;
4269 result = outermost_if;
4271 else
4272 result = tem;
4274 push_simplify (kind, simplifiers, match, result);
4277 /* Parsing of the outer control structures. */
4279 /* Parse a for expression
4280 for = '(' 'for' <subst>... <pattern> ')'
4281 subst = <ident> '(' <ident>... ')' */
4283 void
4284 parser::parse_for (source_location)
4286 auto_vec<const cpp_token *> user_id_tokens;
4287 vec<user_id *> user_ids = vNULL;
4288 const cpp_token *token;
4289 unsigned min_n_opers = 0, max_n_opers = 0;
4291 while (1)
4293 token = peek ();
4294 if (token->type != CPP_NAME)
4295 break;
4297 /* Insert the user defined operators into the operator hash. */
4298 const char *id = get_ident ();
4299 if (get_operator (id, true) != NULL)
4300 fatal_at (token, "operator already defined");
4301 user_id *op = new user_id (id);
4302 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
4303 *slot = op;
4304 user_ids.safe_push (op);
4305 user_id_tokens.safe_push (token);
4307 eat_token (CPP_OPEN_PAREN);
4309 int arity = -1;
4310 while ((token = peek_ident ()) != 0)
4312 const char *oper = get_ident ();
4313 id_base *idb = get_operator (oper, true);
4314 if (idb == NULL)
4315 fatal_at (token, "no such operator '%s'", oper);
4316 if (*idb == CONVERT0 || *idb == CONVERT1 || *idb == CONVERT2
4317 || *idb == VIEW_CONVERT0 || *idb == VIEW_CONVERT1
4318 || *idb == VIEW_CONVERT2)
4319 fatal_at (token, "conditional operators cannot be used inside for");
4321 if (arity == -1)
4322 arity = idb->nargs;
4323 else if (idb->nargs == -1)
4325 else if (idb->nargs != arity)
4326 fatal_at (token, "operator '%s' with arity %d does not match "
4327 "others with arity %d", oper, idb->nargs, arity);
4329 user_id *p = dyn_cast<user_id *> (idb);
4330 if (p)
4332 if (p->is_oper_list)
4333 op->substitutes.safe_splice (p->substitutes);
4334 else
4335 fatal_at (token, "iterator cannot be used as operator-list");
4337 else
4338 op->substitutes.safe_push (idb);
4340 op->nargs = arity;
4341 token = expect (CPP_CLOSE_PAREN);
4343 unsigned nsubstitutes = op->substitutes.length ();
4344 if (nsubstitutes == 0)
4345 fatal_at (token, "A user-defined operator must have at least "
4346 "one substitution");
4347 if (max_n_opers == 0)
4349 min_n_opers = nsubstitutes;
4350 max_n_opers = nsubstitutes;
4352 else
4354 if (nsubstitutes % min_n_opers != 0
4355 && min_n_opers % nsubstitutes != 0)
4356 fatal_at (token, "All user-defined identifiers must have a "
4357 "multiple number of operator substitutions of the "
4358 "smallest number of substitutions");
4359 if (nsubstitutes < min_n_opers)
4360 min_n_opers = nsubstitutes;
4361 else if (nsubstitutes > max_n_opers)
4362 max_n_opers = nsubstitutes;
4366 unsigned n_ids = user_ids.length ();
4367 if (n_ids == 0)
4368 fatal_at (token, "for requires at least one user-defined identifier");
4370 token = peek ();
4371 if (token->type == CPP_CLOSE_PAREN)
4372 fatal_at (token, "no pattern defined in for");
4374 active_fors.safe_push (user_ids);
4375 while (1)
4377 token = peek ();
4378 if (token->type == CPP_CLOSE_PAREN)
4379 break;
4380 parse_pattern ();
4382 active_fors.pop ();
4384 /* Remove user-defined operators from the hash again. */
4385 for (unsigned i = 0; i < user_ids.length (); ++i)
4387 if (!user_ids[i]->used)
4388 warning_at (user_id_tokens[i],
4389 "operator %s defined but not used", user_ids[i]->id);
4390 operators->remove_elt (user_ids[i]);
4394 /* Parse an identifier associated with a list of operators.
4395 oprs = '(' 'define_operator_list' <ident> <ident>... ')' */
4397 void
4398 parser::parse_operator_list (source_location)
4400 const cpp_token *token = peek ();
4401 const char *id = get_ident ();
4403 if (get_operator (id, true) != 0)
4404 fatal_at (token, "operator %s already defined", id);
4406 user_id *op = new user_id (id, true);
4407 int arity = -1;
4409 while ((token = peek_ident ()) != 0)
4411 token = peek ();
4412 const char *oper = get_ident ();
4413 id_base *idb = get_operator (oper, true);
4415 if (idb == 0)
4416 fatal_at (token, "no such operator '%s'", oper);
4418 if (arity == -1)
4419 arity = idb->nargs;
4420 else if (idb->nargs == -1)
4422 else if (arity != idb->nargs)
4423 fatal_at (token, "operator '%s' with arity %d does not match "
4424 "others with arity %d", oper, idb->nargs, arity);
4426 /* We allow composition of multiple operator lists. */
4427 if (user_id *p = dyn_cast<user_id *> (idb))
4428 op->substitutes.safe_splice (p->substitutes);
4429 else
4430 op->substitutes.safe_push (idb);
4433 // Check that there is no junk after id-list
4434 token = peek();
4435 if (token->type != CPP_CLOSE_PAREN)
4436 fatal_at (token, "expected identifier got %s", cpp_type2name (token->type, 0));
4438 if (op->substitutes.length () == 0)
4439 fatal_at (token, "operator-list cannot be empty");
4441 op->nargs = arity;
4442 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
4443 *slot = op;
4446 /* Parse an outer if expression.
4447 if = '(' 'if' '(' <c-expr> ')' <pattern> ')' */
4449 void
4450 parser::parse_if (source_location)
4452 c_expr *ifexpr = parse_c_expr (CPP_OPEN_PAREN);
4454 const cpp_token *token = peek ();
4455 if (token->type == CPP_CLOSE_PAREN)
4456 fatal_at (token, "no pattern defined in if");
4458 active_ifs.safe_push (ifexpr);
4459 while (1)
4461 const cpp_token *token = peek ();
4462 if (token->type == CPP_CLOSE_PAREN)
4463 break;
4465 parse_pattern ();
4467 active_ifs.pop ();
4470 /* Parse a list of predefined predicate identifiers.
4471 preds = '(' 'define_predicates' <ident>... ')' */
4473 void
4474 parser::parse_predicates (source_location)
4478 const cpp_token *token = peek ();
4479 if (token->type != CPP_NAME)
4480 break;
4482 add_predicate (get_ident ());
4484 while (1);
4487 /* Parse outer control structures.
4488 pattern = <preds>|<for>|<if>|<simplify>|<match> */
4490 void
4491 parser::parse_pattern ()
4493 /* All clauses start with '('. */
4494 eat_token (CPP_OPEN_PAREN);
4495 const cpp_token *token = peek ();
4496 const char *id = get_ident ();
4497 if (strcmp (id, "simplify") == 0)
4499 parse_simplify (simplify::SIMPLIFY, simplifiers, NULL, NULL);
4500 capture_ids = NULL;
4502 else if (strcmp (id, "match") == 0)
4504 bool with_args = false;
4505 source_location e_loc = peek ()->src_loc;
4506 if (peek ()->type == CPP_OPEN_PAREN)
4508 eat_token (CPP_OPEN_PAREN);
4509 with_args = true;
4511 const char *name = get_ident ();
4512 id_base *id = get_operator (name);
4513 predicate_id *p;
4514 if (!id)
4516 p = add_predicate (name);
4517 user_predicates.safe_push (p);
4519 else if ((p = dyn_cast <predicate_id *> (id)))
4521 else
4522 fatal_at (token, "cannot add a match to a non-predicate ID");
4523 /* Parse (match <id> <arg>... (match-expr)) here. */
4524 expr *e = NULL;
4525 if (with_args)
4527 capture_ids = new cid_map_t;
4528 e = new expr (p, e_loc);
4529 while (peek ()->type == CPP_ATSIGN)
4530 e->append_op (parse_capture (NULL, false));
4531 eat_token (CPP_CLOSE_PAREN);
4533 if (p->nargs != -1
4534 && ((e && e->ops.length () != (unsigned)p->nargs)
4535 || (!e && p->nargs != 0)))
4536 fatal_at (token, "non-matching number of match operands");
4537 p->nargs = e ? e->ops.length () : 0;
4538 parse_simplify (simplify::MATCH, p->matchers, p, e);
4539 capture_ids = NULL;
4541 else if (strcmp (id, "for") == 0)
4542 parse_for (token->src_loc);
4543 else if (strcmp (id, "if") == 0)
4544 parse_if (token->src_loc);
4545 else if (strcmp (id, "define_predicates") == 0)
4547 if (active_ifs.length () > 0
4548 || active_fors.length () > 0)
4549 fatal_at (token, "define_predicates inside if or for is not supported");
4550 parse_predicates (token->src_loc);
4552 else if (strcmp (id, "define_operator_list") == 0)
4554 if (active_ifs.length () > 0
4555 || active_fors.length () > 0)
4556 fatal_at (token, "operator-list inside if or for is not supported");
4557 parse_operator_list (token->src_loc);
4559 else
4560 fatal_at (token, "expected %s'simplify', 'match', 'for' or 'if'",
4561 active_ifs.length () == 0 && active_fors.length () == 0
4562 ? "'define_predicates', " : "");
4564 eat_token (CPP_CLOSE_PAREN);
4567 /* Main entry of the parser. Repeatedly parse outer control structures. */
4569 parser::parser (cpp_reader *r_)
4571 r = r_;
4572 active_ifs = vNULL;
4573 active_fors = vNULL;
4574 simplifiers = vNULL;
4575 oper_lists_set = NULL;
4576 oper_lists = vNULL;
4577 capture_ids = NULL;
4578 user_predicates = vNULL;
4579 parsing_match_operand = false;
4581 const cpp_token *token = next ();
4582 while (token->type != CPP_EOF)
4584 _cpp_backup_tokens (r, 1);
4585 parse_pattern ();
4586 token = next ();
4591 /* Helper for the linemap code. */
4593 static size_t
4594 round_alloc_size (size_t s)
4596 return s;
4600 /* The genmatch generator progam. It reads from a pattern description
4601 and outputs GIMPLE or GENERIC IL matching and simplification routines. */
4604 main (int argc, char **argv)
4606 cpp_reader *r;
4608 progname = "genmatch";
4610 if (argc < 2)
4611 return 1;
4613 bool gimple = true;
4614 char *input = argv[argc-1];
4615 for (int i = 1; i < argc - 1; ++i)
4617 if (strcmp (argv[i], "--gimple") == 0)
4618 gimple = true;
4619 else if (strcmp (argv[i], "--generic") == 0)
4620 gimple = false;
4621 else if (strcmp (argv[i], "-v") == 0)
4622 verbose = 1;
4623 else if (strcmp (argv[i], "-vv") == 0)
4624 verbose = 2;
4625 else
4627 fprintf (stderr, "Usage: genmatch "
4628 "[--gimple] [--generic] [-v[v]] input\n");
4629 return 1;
4633 line_table = XCNEW (struct line_maps);
4634 linemap_init (line_table, 0);
4635 line_table->reallocator = xrealloc;
4636 line_table->round_alloc_size = round_alloc_size;
4638 r = cpp_create_reader (CLK_GNUC99, NULL, line_table);
4639 cpp_callbacks *cb = cpp_get_callbacks (r);
4640 cb->error = error_cb;
4642 /* Add the build directory to the #include "" search path. */
4643 cpp_dir *dir = XCNEW (cpp_dir);
4644 dir->name = getpwd ();
4645 if (!dir->name)
4646 dir->name = ASTRDUP (".");
4647 cpp_set_include_chains (r, dir, NULL, false);
4649 if (!cpp_read_main_file (r, input))
4650 return 1;
4651 cpp_define (r, gimple ? "GIMPLE=1": "GENERIC=1");
4652 cpp_define (r, gimple ? "GENERIC=0": "GIMPLE=0");
4654 null_id = new id_base (id_base::NULL_ID, "null");
4656 /* Pre-seed operators. */
4657 operators = new hash_table<id_base> (1024);
4658 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
4659 add_operator (SYM, # SYM, # TYPE, NARGS);
4660 #define END_OF_BASE_TREE_CODES
4661 #include "tree.def"
4662 add_operator (CONVERT0, "convert0", "tcc_unary", 1);
4663 add_operator (CONVERT1, "convert1", "tcc_unary", 1);
4664 add_operator (CONVERT2, "convert2", "tcc_unary", 1);
4665 add_operator (VIEW_CONVERT0, "view_convert0", "tcc_unary", 1);
4666 add_operator (VIEW_CONVERT1, "view_convert1", "tcc_unary", 1);
4667 add_operator (VIEW_CONVERT2, "view_convert2", "tcc_unary", 1);
4668 #undef END_OF_BASE_TREE_CODES
4669 #undef DEFTREECODE
4671 /* Pre-seed builtin functions.
4672 ??? Cannot use N (name) as that is targetm.emultls.get_address
4673 for BUILT_IN_EMUTLS_GET_ADDRESS ... */
4674 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) \
4675 add_function (ENUM, "CFN_" # ENUM);
4676 #include "builtins.def"
4678 #define DEF_INTERNAL_FN(CODE, NAME, FNSPEC) \
4679 add_function (IFN_##CODE, "CFN_" #CODE);
4680 #include "internal-fn.def"
4682 /* Parse ahead! */
4683 parser p (r);
4685 if (gimple)
4686 write_header (stdout, "gimple-match-head.c");
4687 else
4688 write_header (stdout, "generic-match-head.c");
4690 /* Go over all predicates defined with patterns and perform
4691 lowering and code generation. */
4692 for (unsigned i = 0; i < p.user_predicates.length (); ++i)
4694 predicate_id *pred = p.user_predicates[i];
4695 lower (pred->matchers, gimple);
4697 if (verbose == 2)
4698 for (unsigned i = 0; i < pred->matchers.length (); ++i)
4699 print_matches (pred->matchers[i]);
4701 decision_tree dt;
4702 for (unsigned i = 0; i < pred->matchers.length (); ++i)
4703 dt.insert (pred->matchers[i], i);
4705 if (verbose == 2)
4706 dt.print (stderr);
4708 write_predicate (stdout, pred, dt, gimple);
4711 /* Lower the main simplifiers and generate code for them. */
4712 lower (p.simplifiers, gimple);
4714 if (verbose == 2)
4715 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
4716 print_matches (p.simplifiers[i]);
4718 decision_tree dt;
4719 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
4720 dt.insert (p.simplifiers[i], i);
4722 if (verbose == 2)
4723 dt.print (stderr);
4725 dt.gen (stdout, gimple);
4727 /* Finalize. */
4728 cpp_finish (r, NULL);
4729 cpp_destroy (r);
4731 delete operators;
4733 return 0;