* tree-if-conv.c: Fix various typos in comments.
[official-gcc.git] / gcc / genmatch.c
blob15d257b9653ae533c687dee0ca8521fbea360d1c
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 static bool
57 #if GCC_VERSION >= 4001
58 __attribute__((format (printf, 6, 0)))
59 #endif
60 error_cb (cpp_reader *, int errtype, int, source_location location,
61 unsigned int, const char *msg, va_list *ap)
63 const line_map_ordinary *map;
64 linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
65 expanded_location loc = linemap_expand_location (line_table, map, location);
66 fprintf (stderr, "%s:%d:%d %s: ", loc.file, loc.line, loc.column,
67 (errtype == CPP_DL_WARNING) ? "warning" : "error");
68 vfprintf (stderr, msg, *ap);
69 fprintf (stderr, "\n");
70 FILE *f = fopen (loc.file, "r");
71 if (f)
73 char buf[128];
74 while (loc.line > 0)
76 if (!fgets (buf, 128, f))
77 goto notfound;
78 if (buf[strlen (buf) - 1] != '\n')
80 if (loc.line > 1)
81 loc.line++;
83 loc.line--;
85 fprintf (stderr, "%s", buf);
86 for (int i = 0; i < loc.column - 1; ++i)
87 fputc (' ', stderr);
88 fputc ('^', stderr);
89 fputc ('\n', stderr);
90 notfound:
91 fclose (f);
94 if (errtype == CPP_DL_FATAL)
95 exit (1);
96 return false;
99 static void
100 #if GCC_VERSION >= 4001
101 __attribute__((format (printf, 2, 3)))
102 #endif
103 fatal_at (const cpp_token *tk, const char *msg, ...)
105 va_list ap;
106 va_start (ap, msg);
107 error_cb (NULL, CPP_DL_FATAL, 0, tk->src_loc, 0, msg, &ap);
108 va_end (ap);
111 static void
112 #if GCC_VERSION >= 4001
113 __attribute__((format (printf, 2, 3)))
114 #endif
115 fatal_at (source_location loc, const char *msg, ...)
117 va_list ap;
118 va_start (ap, msg);
119 error_cb (NULL, CPP_DL_FATAL, 0, loc, 0, msg, &ap);
120 va_end (ap);
123 static void
124 #if GCC_VERSION >= 4001
125 __attribute__((format (printf, 2, 3)))
126 #endif
127 warning_at (const cpp_token *tk, const char *msg, ...)
129 va_list ap;
130 va_start (ap, msg);
131 error_cb (NULL, CPP_DL_WARNING, 0, tk->src_loc, 0, msg, &ap);
132 va_end (ap);
135 static void
136 #if GCC_VERSION >= 4001
137 __attribute__((format (printf, 2, 3)))
138 #endif
139 warning_at (source_location loc, const char *msg, ...)
141 va_list ap;
142 va_start (ap, msg);
143 error_cb (NULL, CPP_DL_WARNING, 0, loc, 0, msg, &ap);
144 va_end (ap);
147 /* Like fprintf, but print INDENT spaces at the beginning. */
149 static void
150 #if GCC_VERSION >= 4001
151 __attribute__((format (printf, 3, 4)))
152 #endif
153 fprintf_indent (FILE *f, unsigned int indent, const char *format, ...)
155 va_list ap;
156 for (; indent >= 8; indent -= 8)
157 fputc ('\t', f);
158 fprintf (f, "%*s", indent, "");
159 va_start (ap, format);
160 vfprintf (f, format, ap);
161 va_end (ap);
164 static void
165 output_line_directive (FILE *f, source_location location,
166 bool dumpfile = false)
168 const line_map_ordinary *map;
169 linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
170 expanded_location loc = linemap_expand_location (line_table, map, location);
171 if (dumpfile)
173 /* When writing to a dumpfile only dump the filename. */
174 const char *file = strrchr (loc.file, DIR_SEPARATOR);
175 if (!file)
176 file = loc.file;
177 else
178 ++file;
179 fprintf (f, "%s:%d", file, loc.line);
181 else
182 /* Other gen programs really output line directives here, at least for
183 development it's right now more convenient to have line information
184 from the generated file. Still keep the directives as comment for now
185 to easily back-point to the meta-description. */
186 fprintf (f, "/* #line %d \"%s\" */\n", loc.line, loc.file);
190 /* Pull in tree codes and builtin function codes from their
191 definition files. */
193 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM,
194 enum tree_code {
195 #include "tree.def"
196 CONVERT0,
197 CONVERT1,
198 CONVERT2,
199 VIEW_CONVERT0,
200 VIEW_CONVERT1,
201 VIEW_CONVERT2,
202 MAX_TREE_CODES
204 #undef DEFTREECODE
206 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
207 enum built_in_function {
208 #include "builtins.def"
209 END_BUILTINS
211 #undef DEF_BUILTIN
213 /* Return true if CODE represents a commutative tree code. Otherwise
214 return false. */
215 bool
216 commutative_tree_code (enum tree_code code)
218 switch (code)
220 case PLUS_EXPR:
221 case MULT_EXPR:
222 case MULT_HIGHPART_EXPR:
223 case MIN_EXPR:
224 case MAX_EXPR:
225 case BIT_IOR_EXPR:
226 case BIT_XOR_EXPR:
227 case BIT_AND_EXPR:
228 case NE_EXPR:
229 case EQ_EXPR:
230 case UNORDERED_EXPR:
231 case ORDERED_EXPR:
232 case UNEQ_EXPR:
233 case LTGT_EXPR:
234 case TRUTH_AND_EXPR:
235 case TRUTH_XOR_EXPR:
236 case TRUTH_OR_EXPR:
237 case WIDEN_MULT_EXPR:
238 case VEC_WIDEN_MULT_HI_EXPR:
239 case VEC_WIDEN_MULT_LO_EXPR:
240 case VEC_WIDEN_MULT_EVEN_EXPR:
241 case VEC_WIDEN_MULT_ODD_EXPR:
242 return true;
244 default:
245 break;
247 return false;
250 /* Return true if CODE represents a ternary tree code for which the
251 first two operands are commutative. Otherwise return false. */
252 bool
253 commutative_ternary_tree_code (enum tree_code code)
255 switch (code)
257 case WIDEN_MULT_PLUS_EXPR:
258 case WIDEN_MULT_MINUS_EXPR:
259 case DOT_PROD_EXPR:
260 case FMA_EXPR:
261 return true;
263 default:
264 break;
266 return false;
270 /* Base class for all identifiers the parser knows. */
272 struct id_base : nofree_ptr_hash<id_base>
274 enum id_kind { CODE, FN, PREDICATE, USER } kind;
276 id_base (id_kind, const char *, int = -1);
278 hashval_t hashval;
279 int nargs;
280 const char *id;
282 /* hash_table support. */
283 static inline hashval_t hash (const id_base *);
284 static inline int equal (const id_base *, const id_base *);
287 inline hashval_t
288 id_base::hash (const id_base *op)
290 return op->hashval;
293 inline int
294 id_base::equal (const id_base *op1,
295 const id_base *op2)
297 return (op1->hashval == op2->hashval
298 && strcmp (op1->id, op2->id) == 0);
301 /* Hashtable of known pattern operators. This is pre-seeded from
302 all known tree codes and all known builtin function ids. */
303 static hash_table<id_base> *operators;
305 id_base::id_base (id_kind kind_, const char *id_, int nargs_)
307 kind = kind_;
308 id = id_;
309 nargs = nargs_;
310 hashval = htab_hash_string (id);
313 /* Identifier that maps to a tree code. */
315 struct operator_id : public id_base
317 operator_id (enum tree_code code_, const char *id_, unsigned nargs_,
318 const char *tcc_)
319 : id_base (id_base::CODE, id_, nargs_), code (code_), tcc (tcc_) {}
320 enum tree_code code;
321 const char *tcc;
324 /* Identifier that maps to a builtin function code. */
326 struct fn_id : public id_base
328 fn_id (enum built_in_function fn_, const char *id_)
329 : id_base (id_base::FN, id_), fn (fn_) {}
330 enum built_in_function fn;
333 struct simplify;
335 /* Identifier that maps to a user-defined predicate. */
337 struct predicate_id : public id_base
339 predicate_id (const char *id_)
340 : id_base (id_base::PREDICATE, id_), matchers (vNULL) {}
341 vec<simplify *> matchers;
344 /* Identifier that maps to a operator defined by a 'for' directive. */
346 struct user_id : public id_base
348 user_id (const char *id_, bool is_oper_list_ = false)
349 : id_base (id_base::USER, id_), substitutes (vNULL),
350 used (false), is_oper_list (is_oper_list_) {}
351 vec<id_base *> substitutes;
352 bool used;
353 bool is_oper_list;
356 template<>
357 template<>
358 inline bool
359 is_a_helper <fn_id *>::test (id_base *id)
361 return id->kind == id_base::FN;
364 template<>
365 template<>
366 inline bool
367 is_a_helper <operator_id *>::test (id_base *id)
369 return id->kind == id_base::CODE;
372 template<>
373 template<>
374 inline bool
375 is_a_helper <predicate_id *>::test (id_base *id)
377 return id->kind == id_base::PREDICATE;
380 template<>
381 template<>
382 inline bool
383 is_a_helper <user_id *>::test (id_base *id)
385 return id->kind == id_base::USER;
388 /* Add a predicate identifier to the hash. */
390 static predicate_id *
391 add_predicate (const char *id)
393 predicate_id *p = new predicate_id (id);
394 id_base **slot = operators->find_slot_with_hash (p, p->hashval, INSERT);
395 if (*slot)
396 fatal ("duplicate id definition");
397 *slot = p;
398 return p;
401 /* Add a tree code identifier to the hash. */
403 static void
404 add_operator (enum tree_code code, const char *id,
405 const char *tcc, unsigned nargs)
407 if (strcmp (tcc, "tcc_unary") != 0
408 && strcmp (tcc, "tcc_binary") != 0
409 && strcmp (tcc, "tcc_comparison") != 0
410 && strcmp (tcc, "tcc_expression") != 0
411 /* For {REAL,IMAG}PART_EXPR and VIEW_CONVERT_EXPR. */
412 && strcmp (tcc, "tcc_reference") != 0
413 /* To have INTEGER_CST and friends as "predicate operators". */
414 && strcmp (tcc, "tcc_constant") != 0
415 /* And allow CONSTRUCTOR for vector initializers. */
416 && !(code == CONSTRUCTOR)
417 /* Allow SSA_NAME as predicate operator. */
418 && !(code == SSA_NAME))
419 return;
420 /* Treat ADDR_EXPR as atom, thus don't allow matching its operand. */
421 if (code == ADDR_EXPR)
422 nargs = 0;
423 operator_id *op = new operator_id (code, id, nargs, tcc);
424 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
425 if (*slot)
426 fatal ("duplicate id definition");
427 *slot = op;
430 /* Add a builtin identifier to the hash. */
432 static void
433 add_builtin (enum built_in_function code, const char *id)
435 fn_id *fn = new fn_id (code, id);
436 id_base **slot = operators->find_slot_with_hash (fn, fn->hashval, INSERT);
437 if (*slot)
438 fatal ("duplicate id definition");
439 *slot = fn;
442 /* Helper for easy comparing ID with tree code CODE. */
444 static bool
445 operator==(id_base &id, enum tree_code code)
447 if (operator_id *oid = dyn_cast <operator_id *> (&id))
448 return oid->code == code;
449 return false;
452 /* Lookup the identifier ID. */
454 id_base *
455 get_operator (const char *id)
457 id_base tem (id_base::CODE, id);
459 id_base *op = operators->find_with_hash (&tem, tem.hashval);
460 if (op)
462 /* If this is a user-defined identifier track whether it was used. */
463 if (user_id *uid = dyn_cast<user_id *> (op))
464 uid->used = true;
465 return op;
468 /* Try all-uppercase. */
469 char *id2 = xstrdup (id);
470 for (unsigned i = 0; i < strlen (id2); ++i)
471 id2[i] = TOUPPER (id2[i]);
472 new (&tem) id_base (id_base::CODE, id2);
473 op = operators->find_with_hash (&tem, tem.hashval);
474 if (op)
476 free (id2);
477 return op;
480 /* Try _EXPR appended. */
481 id2 = (char *)xrealloc (id2, strlen (id2) + sizeof ("_EXPR") + 1);
482 strcat (id2, "_EXPR");
483 new (&tem) id_base (id_base::CODE, id2);
484 op = operators->find_with_hash (&tem, tem.hashval);
485 if (op)
487 free (id2);
488 return op;
491 return 0;
494 typedef hash_map<nofree_string_hash, unsigned> cid_map_t;
497 /* The AST produced by parsing of the pattern definitions. */
499 struct dt_operand;
500 struct capture_info;
502 /* The base class for operands. */
504 struct operand {
505 enum op_type { OP_PREDICATE, OP_EXPR, OP_CAPTURE, OP_C_EXPR, OP_IF, OP_WITH };
506 operand (enum op_type type_, source_location loc_)
507 : type (type_), location (loc_) {}
508 enum op_type type;
509 source_location location;
510 virtual void gen_transform (FILE *, int, const char *, bool, int,
511 const char *, capture_info *,
512 dt_operand ** = 0,
513 bool = true)
514 { gcc_unreachable (); }
517 /* A predicate operand. Predicates are leafs in the AST. */
519 struct predicate : public operand
521 predicate (predicate_id *p_, source_location loc)
522 : operand (OP_PREDICATE, loc), p (p_) {}
523 predicate_id *p;
526 /* An operand that constitutes an expression. Expressions include
527 function calls and user-defined predicate invocations. */
529 struct expr : public operand
531 expr (id_base *operation_, source_location loc, bool is_commutative_ = false)
532 : operand (OP_EXPR, loc), operation (operation_),
533 ops (vNULL), expr_type (NULL), is_commutative (is_commutative_),
534 is_generic (false), force_single_use (false) {}
535 expr (expr *e)
536 : operand (OP_EXPR, e->location), operation (e->operation),
537 ops (vNULL), expr_type (e->expr_type), is_commutative (e->is_commutative),
538 is_generic (e->is_generic), force_single_use (e->force_single_use) {}
539 void append_op (operand *op) { ops.safe_push (op); }
540 /* The operator and its operands. */
541 id_base *operation;
542 vec<operand *> ops;
543 /* An explicitely specified type - used exclusively for conversions. */
544 const char *expr_type;
545 /* Whether the operation is to be applied commutatively. This is
546 later lowered to two separate patterns. */
547 bool is_commutative;
548 /* Whether the expression is expected to be in GENERIC form. */
549 bool is_generic;
550 /* Whether pushing any stmt to the sequence should be conditional
551 on this expression having a single-use. */
552 bool force_single_use;
553 virtual void gen_transform (FILE *f, int, const char *, bool, int,
554 const char *, capture_info *,
555 dt_operand ** = 0, bool = true);
558 /* An operator that is represented by native C code. This is always
559 a leaf operand in the AST. This class is also used to represent
560 the code to be generated for 'if' and 'with' expressions. */
562 struct c_expr : public operand
564 /* A mapping of an identifier and its replacement. Used to apply
565 'for' lowering. */
566 struct id_tab {
567 const char *id;
568 const char *oper;
569 id_tab (const char *id_, const char *oper_): id (id_), oper (oper_) {}
572 c_expr (cpp_reader *r_, source_location loc,
573 vec<cpp_token> code_, unsigned nr_stmts_,
574 vec<id_tab> ids_, cid_map_t *capture_ids_)
575 : operand (OP_C_EXPR, loc), r (r_), code (code_),
576 capture_ids (capture_ids_), nr_stmts (nr_stmts_), ids (ids_) {}
577 /* cpplib tokens and state to transform this back to source. */
578 cpp_reader *r;
579 vec<cpp_token> code;
580 cid_map_t *capture_ids;
581 /* The number of statements parsed (well, the number of ';'s). */
582 unsigned nr_stmts;
583 /* The identifier replacement vector. */
584 vec<id_tab> ids;
585 virtual void gen_transform (FILE *f, int, const char *, bool, int,
586 const char *, capture_info *,
587 dt_operand ** = 0, bool = true);
590 /* A wrapper around another operand that captures its value. */
592 struct capture : public operand
594 capture (source_location loc, unsigned where_, operand *what_)
595 : operand (OP_CAPTURE, loc), where (where_), what (what_) {}
596 /* Identifier index for the value. */
597 unsigned where;
598 /* The captured value. */
599 operand *what;
600 virtual void gen_transform (FILE *f, int, const char *, bool, int,
601 const char *, capture_info *,
602 dt_operand ** = 0, bool = true);
605 /* if expression. */
607 struct if_expr : public operand
609 if_expr (source_location loc)
610 : operand (OP_IF, loc), cond (NULL), trueexpr (NULL), falseexpr (NULL) {}
611 c_expr *cond;
612 operand *trueexpr;
613 operand *falseexpr;
616 /* with expression. */
618 struct with_expr : public operand
620 with_expr (source_location loc)
621 : operand (OP_WITH, loc), with (NULL), subexpr (NULL) {}
622 c_expr *with;
623 operand *subexpr;
626 template<>
627 template<>
628 inline bool
629 is_a_helper <capture *>::test (operand *op)
631 return op->type == operand::OP_CAPTURE;
634 template<>
635 template<>
636 inline bool
637 is_a_helper <predicate *>::test (operand *op)
639 return op->type == operand::OP_PREDICATE;
642 template<>
643 template<>
644 inline bool
645 is_a_helper <c_expr *>::test (operand *op)
647 return op->type == operand::OP_C_EXPR;
650 template<>
651 template<>
652 inline bool
653 is_a_helper <expr *>::test (operand *op)
655 return op->type == operand::OP_EXPR;
658 template<>
659 template<>
660 inline bool
661 is_a_helper <if_expr *>::test (operand *op)
663 return op->type == operand::OP_IF;
666 template<>
667 template<>
668 inline bool
669 is_a_helper <with_expr *>::test (operand *op)
671 return op->type == operand::OP_WITH;
674 /* The main class of a pattern and its transform. This is used to
675 represent both (simplify ...) and (match ...) kinds. The AST
676 duplicates all outer 'if' and 'for' expressions here so each
677 simplify can exist in isolation. */
679 struct simplify
681 enum simplify_kind { SIMPLIFY, MATCH };
683 simplify (simplify_kind kind_, operand *match_, operand *result_,
684 vec<vec<user_id *> > for_vec_, cid_map_t *capture_ids_)
685 : kind (kind_), match (match_), result (result_),
686 for_vec (for_vec_), for_subst_vec (vNULL),
687 capture_ids (capture_ids_), capture_max (capture_ids_->elements () - 1) {}
689 simplify_kind kind;
690 /* The expression that is matched against the GENERIC or GIMPLE IL. */
691 operand *match;
692 /* For a (simplify ...) an expression with ifs and withs with the expression
693 produced when the pattern applies in the leafs.
694 For a (match ...) the leafs are either empty if it is a simple predicate
695 or the single expression specifying the matched operands. */
696 struct operand *result;
697 /* Collected 'for' expression operators that have to be replaced
698 in the lowering phase. */
699 vec<vec<user_id *> > for_vec;
700 vec<std::pair<user_id *, id_base *> > for_subst_vec;
701 /* A map of capture identifiers to indexes. */
702 cid_map_t *capture_ids;
703 int capture_max;
706 /* Debugging routines for dumping the AST. */
708 DEBUG_FUNCTION void
709 print_operand (operand *o, FILE *f = stderr, bool flattened = false)
711 if (capture *c = dyn_cast<capture *> (o))
713 fprintf (f, "@%u", c->where);
714 if (c->what && flattened == false)
716 putc (':', f);
717 print_operand (c->what, f, flattened);
718 putc (' ', f);
722 else if (predicate *p = dyn_cast<predicate *> (o))
723 fprintf (f, "%s", p->p->id);
725 else if (is_a<c_expr *> (o))
726 fprintf (f, "c_expr");
728 else if (expr *e = dyn_cast<expr *> (o))
730 fprintf (f, "(%s", e->operation->id);
732 if (flattened == false)
734 putc (' ', f);
735 for (unsigned i = 0; i < e->ops.length (); ++i)
737 print_operand (e->ops[i], f, flattened);
738 putc (' ', f);
741 putc (')', f);
744 else
745 gcc_unreachable ();
748 DEBUG_FUNCTION void
749 print_matches (struct simplify *s, FILE *f = stderr)
751 fprintf (f, "for expression: ");
752 print_operand (s->match, f);
753 putc ('\n', f);
757 /* AST lowering. */
759 /* Lowering of commutative operators. */
761 static void
762 cartesian_product (const vec< vec<operand *> >& ops_vector,
763 vec< vec<operand *> >& result, vec<operand *>& v, unsigned n)
765 if (n == ops_vector.length ())
767 vec<operand *> xv = v.copy ();
768 result.safe_push (xv);
769 return;
772 for (unsigned i = 0; i < ops_vector[n].length (); ++i)
774 v[n] = ops_vector[n][i];
775 cartesian_product (ops_vector, result, v, n + 1);
779 /* Lower OP to two operands in case it is marked as commutative. */
781 static vec<operand *>
782 commutate (operand *op)
784 vec<operand *> ret = vNULL;
786 if (capture *c = dyn_cast <capture *> (op))
788 if (!c->what)
790 ret.safe_push (op);
791 return ret;
793 vec<operand *> v = commutate (c->what);
794 for (unsigned i = 0; i < v.length (); ++i)
796 capture *nc = new capture (c->location, c->where, v[i]);
797 ret.safe_push (nc);
799 return ret;
802 expr *e = dyn_cast <expr *> (op);
803 if (!e || e->ops.length () == 0)
805 ret.safe_push (op);
806 return ret;
809 vec< vec<operand *> > ops_vector = vNULL;
810 for (unsigned i = 0; i < e->ops.length (); ++i)
811 ops_vector.safe_push (commutate (e->ops[i]));
813 auto_vec< vec<operand *> > result;
814 auto_vec<operand *> v (e->ops.length ());
815 v.quick_grow_cleared (e->ops.length ());
816 cartesian_product (ops_vector, result, v, 0);
819 for (unsigned i = 0; i < result.length (); ++i)
821 expr *ne = new expr (e);
822 ne->is_commutative = false;
823 for (unsigned j = 0; j < result[i].length (); ++j)
824 ne->append_op (result[i][j]);
825 ret.safe_push (ne);
828 if (!e->is_commutative)
829 return ret;
831 for (unsigned i = 0; i < result.length (); ++i)
833 expr *ne = new expr (e);
834 ne->is_commutative = false;
835 // result[i].length () is 2 since e->operation is binary
836 for (unsigned j = result[i].length (); j; --j)
837 ne->append_op (result[i][j-1]);
838 ret.safe_push (ne);
841 return ret;
844 /* Lower operations marked as commutative in the AST of S and push
845 the resulting patterns to SIMPLIFIERS. */
847 static void
848 lower_commutative (simplify *s, vec<simplify *>& simplifiers)
850 vec<operand *> matchers = commutate (s->match);
851 for (unsigned i = 0; i < matchers.length (); ++i)
853 simplify *ns = new simplify (s->kind, matchers[i], s->result,
854 s->for_vec, s->capture_ids);
855 simplifiers.safe_push (ns);
859 /* Strip conditional conversios using operator OPER from O and its
860 children if STRIP, else replace them with an unconditional convert. */
862 operand *
863 lower_opt_convert (operand *o, enum tree_code oper,
864 enum tree_code to_oper, bool strip)
866 if (capture *c = dyn_cast<capture *> (o))
868 if (c->what)
869 return new capture (c->location, c->where,
870 lower_opt_convert (c->what, oper, to_oper, strip));
871 else
872 return c;
875 expr *e = dyn_cast<expr *> (o);
876 if (!e)
877 return o;
879 if (*e->operation == oper)
881 if (strip)
882 return lower_opt_convert (e->ops[0], oper, to_oper, strip);
884 expr *ne = new expr (e);
885 ne->operation = (to_oper == CONVERT_EXPR
886 ? get_operator ("CONVERT_EXPR")
887 : get_operator ("VIEW_CONVERT_EXPR"));
888 ne->append_op (lower_opt_convert (e->ops[0], oper, to_oper, strip));
889 return ne;
892 expr *ne = new expr (e);
893 for (unsigned i = 0; i < e->ops.length (); ++i)
894 ne->append_op (lower_opt_convert (e->ops[i], oper, to_oper, strip));
896 return ne;
899 /* Determine whether O or its children uses the conditional conversion
900 operator OPER. */
902 static bool
903 has_opt_convert (operand *o, enum tree_code oper)
905 if (capture *c = dyn_cast<capture *> (o))
907 if (c->what)
908 return has_opt_convert (c->what, oper);
909 else
910 return false;
913 expr *e = dyn_cast<expr *> (o);
914 if (!e)
915 return false;
917 if (*e->operation == oper)
918 return true;
920 for (unsigned i = 0; i < e->ops.length (); ++i)
921 if (has_opt_convert (e->ops[i], oper))
922 return true;
924 return false;
927 /* Lower conditional convert operators in O, expanding it to a vector
928 if required. */
930 static vec<operand *>
931 lower_opt_convert (operand *o)
933 vec<operand *> v1 = vNULL, v2;
935 v1.safe_push (o);
937 enum tree_code opers[]
938 = { CONVERT0, CONVERT_EXPR,
939 CONVERT1, CONVERT_EXPR,
940 CONVERT2, CONVERT_EXPR,
941 VIEW_CONVERT0, VIEW_CONVERT_EXPR,
942 VIEW_CONVERT1, VIEW_CONVERT_EXPR,
943 VIEW_CONVERT2, VIEW_CONVERT_EXPR };
945 /* Conditional converts are lowered to a pattern with the
946 conversion and one without. The three different conditional
947 convert codes are lowered separately. */
949 for (unsigned i = 0; i < sizeof (opers) / sizeof (enum tree_code); i += 2)
951 v2 = vNULL;
952 for (unsigned j = 0; j < v1.length (); ++j)
953 if (has_opt_convert (v1[j], opers[i]))
955 v2.safe_push (lower_opt_convert (v1[j],
956 opers[i], opers[i+1], false));
957 v2.safe_push (lower_opt_convert (v1[j],
958 opers[i], opers[i+1], true));
961 if (v2 != vNULL)
963 v1 = vNULL;
964 for (unsigned j = 0; j < v2.length (); ++j)
965 v1.safe_push (v2[j]);
969 return v1;
972 /* Lower conditional convert operators in the AST of S and push
973 the resulting multiple patterns to SIMPLIFIERS. */
975 static void
976 lower_opt_convert (simplify *s, vec<simplify *>& simplifiers)
978 vec<operand *> matchers = lower_opt_convert (s->match);
979 for (unsigned i = 0; i < matchers.length (); ++i)
981 simplify *ns = new simplify (s->kind, matchers[i], s->result,
982 s->for_vec, s->capture_ids);
983 simplifiers.safe_push (ns);
987 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
988 GENERIC and a GIMPLE variant. */
990 static vec<operand *>
991 lower_cond (operand *o)
993 vec<operand *> ro = vNULL;
995 if (capture *c = dyn_cast<capture *> (o))
997 if (c->what)
999 vec<operand *> lop = vNULL;
1000 lop = lower_cond (c->what);
1002 for (unsigned i = 0; i < lop.length (); ++i)
1003 ro.safe_push (new capture (c->location, c->where, lop[i]));
1004 return ro;
1008 expr *e = dyn_cast<expr *> (o);
1009 if (!e || e->ops.length () == 0)
1011 ro.safe_push (o);
1012 return ro;
1015 vec< vec<operand *> > ops_vector = vNULL;
1016 for (unsigned i = 0; i < e->ops.length (); ++i)
1017 ops_vector.safe_push (lower_cond (e->ops[i]));
1019 auto_vec< vec<operand *> > result;
1020 auto_vec<operand *> v (e->ops.length ());
1021 v.quick_grow_cleared (e->ops.length ());
1022 cartesian_product (ops_vector, result, v, 0);
1024 for (unsigned i = 0; i < result.length (); ++i)
1026 expr *ne = new expr (e);
1027 for (unsigned j = 0; j < result[i].length (); ++j)
1028 ne->append_op (result[i][j]);
1029 ro.safe_push (ne);
1030 /* If this is a COND with a captured expression or an
1031 expression with two operands then also match a GENERIC
1032 form on the compare. */
1033 if ((*e->operation == COND_EXPR
1034 || *e->operation == VEC_COND_EXPR)
1035 && ((is_a <capture *> (e->ops[0])
1036 && as_a <capture *> (e->ops[0])->what
1037 && is_a <expr *> (as_a <capture *> (e->ops[0])->what)
1038 && as_a <expr *>
1039 (as_a <capture *> (e->ops[0])->what)->ops.length () == 2)
1040 || (is_a <expr *> (e->ops[0])
1041 && as_a <expr *> (e->ops[0])->ops.length () == 2)))
1043 expr *ne = new expr (e);
1044 for (unsigned j = 0; j < result[i].length (); ++j)
1045 ne->append_op (result[i][j]);
1046 if (capture *c = dyn_cast <capture *> (ne->ops[0]))
1048 expr *ocmp = as_a <expr *> (c->what);
1049 expr *cmp = new expr (ocmp);
1050 for (unsigned j = 0; j < ocmp->ops.length (); ++j)
1051 cmp->append_op (ocmp->ops[j]);
1052 cmp->is_generic = true;
1053 ne->ops[0] = new capture (c->location, c->where, cmp);
1055 else
1057 expr *ocmp = as_a <expr *> (ne->ops[0]);
1058 expr *cmp = new expr (ocmp);
1059 for (unsigned j = 0; j < ocmp->ops.length (); ++j)
1060 cmp->append_op (ocmp->ops[j]);
1061 cmp->is_generic = true;
1062 ne->ops[0] = cmp;
1064 ro.safe_push (ne);
1068 return ro;
1071 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
1072 GENERIC and a GIMPLE variant. */
1074 static void
1075 lower_cond (simplify *s, vec<simplify *>& simplifiers)
1077 vec<operand *> matchers = lower_cond (s->match);
1078 for (unsigned i = 0; i < matchers.length (); ++i)
1080 simplify *ns = new simplify (s->kind, matchers[i], s->result,
1081 s->for_vec, s->capture_ids);
1082 simplifiers.safe_push (ns);
1086 /* In AST operand O replace operator ID with operator WITH. */
1088 operand *
1089 replace_id (operand *o, user_id *id, id_base *with)
1091 /* Deep-copy captures and expressions, replacing operations as
1092 needed. */
1093 if (capture *c = dyn_cast<capture *> (o))
1095 if (!c->what)
1096 return c;
1097 return new capture (c->location, c->where,
1098 replace_id (c->what, id, with));
1100 else if (expr *e = dyn_cast<expr *> (o))
1102 expr *ne = new expr (e);
1103 if (e->operation == id)
1104 ne->operation = with;
1105 for (unsigned i = 0; i < e->ops.length (); ++i)
1106 ne->append_op (replace_id (e->ops[i], id, with));
1107 return ne;
1109 else if (with_expr *w = dyn_cast <with_expr *> (o))
1111 with_expr *nw = new with_expr (w->location);
1112 nw->with = as_a <c_expr *> (replace_id (w->with, id, with));
1113 nw->subexpr = replace_id (w->subexpr, id, with);
1114 return nw;
1116 else if (if_expr *ife = dyn_cast <if_expr *> (o))
1118 if_expr *nife = new if_expr (ife->location);
1119 nife->cond = as_a <c_expr *> (replace_id (ife->cond, id, with));
1120 nife->trueexpr = replace_id (ife->trueexpr, id, with);
1121 if (ife->falseexpr)
1122 nife->falseexpr = replace_id (ife->falseexpr, id, with);
1123 return nife;
1126 /* For c_expr we simply record a string replacement table which is
1127 applied at code-generation time. */
1128 if (c_expr *ce = dyn_cast<c_expr *> (o))
1130 vec<c_expr::id_tab> ids = ce->ids.copy ();
1131 ids.safe_push (c_expr::id_tab (id->id, with->id));
1132 return new c_expr (ce->r, ce->location,
1133 ce->code, ce->nr_stmts, ids, ce->capture_ids);
1136 return o;
1139 /* Return true if the binary operator OP is ok for delayed substitution
1140 during for lowering. */
1142 static bool
1143 binary_ok (operator_id *op)
1145 switch (op->code)
1147 case PLUS_EXPR:
1148 case MINUS_EXPR:
1149 case MULT_EXPR:
1150 case TRUNC_DIV_EXPR:
1151 case CEIL_DIV_EXPR:
1152 case FLOOR_DIV_EXPR:
1153 case ROUND_DIV_EXPR:
1154 case TRUNC_MOD_EXPR:
1155 case CEIL_MOD_EXPR:
1156 case FLOOR_MOD_EXPR:
1157 case ROUND_MOD_EXPR:
1158 case RDIV_EXPR:
1159 case EXACT_DIV_EXPR:
1160 case MIN_EXPR:
1161 case MAX_EXPR:
1162 case BIT_IOR_EXPR:
1163 case BIT_XOR_EXPR:
1164 case BIT_AND_EXPR:
1165 return true;
1166 default:
1167 return false;
1171 /* Lower recorded fors for SIN and output to SIMPLIFIERS. */
1173 static void
1174 lower_for (simplify *sin, vec<simplify *>& simplifiers)
1176 vec<vec<user_id *> >& for_vec = sin->for_vec;
1177 unsigned worklist_start = 0;
1178 auto_vec<simplify *> worklist;
1179 worklist.safe_push (sin);
1181 /* Lower each recorded for separately, operating on the
1182 set of simplifiers created by the previous one.
1183 Lower inner-to-outer so inner for substitutes can refer
1184 to operators replaced by outer fors. */
1185 for (int fi = for_vec.length () - 1; fi >= 0; --fi)
1187 vec<user_id *>& ids = for_vec[fi];
1188 unsigned n_ids = ids.length ();
1189 unsigned max_n_opers = 0;
1190 bool can_delay_subst = (sin->kind == simplify::SIMPLIFY);
1191 for (unsigned i = 0; i < n_ids; ++i)
1193 if (ids[i]->substitutes.length () > max_n_opers)
1194 max_n_opers = ids[i]->substitutes.length ();
1195 /* Require that all substitutes are of the same kind so that
1196 if we delay substitution to the result op code generation
1197 can look at the first substitute for deciding things like
1198 types of operands. */
1199 enum id_base::id_kind kind = ids[i]->substitutes[0]->kind;
1200 for (unsigned j = 0; j < ids[i]->substitutes.length (); ++j)
1201 if (ids[i]->substitutes[j]->kind != kind)
1202 can_delay_subst = false;
1203 else if (operator_id *op
1204 = dyn_cast <operator_id *> (ids[i]->substitutes[j]))
1206 operator_id *op0
1207 = as_a <operator_id *> (ids[i]->substitutes[0]);
1208 if (strcmp (op->tcc, "tcc_comparison") == 0
1209 && strcmp (op0->tcc, "tcc_comparison") == 0)
1211 /* Unfortunately we can't just allow all tcc_binary. */
1212 else if (strcmp (op->tcc, "tcc_binary") == 0
1213 && strcmp (op0->tcc, "tcc_binary") == 0
1214 && binary_ok (op)
1215 && binary_ok (op0))
1217 else if ((strcmp (op->id + 1, "SHIFT_EXPR") == 0
1218 || strcmp (op->id + 1, "ROTATE_EXPR") == 0)
1219 && (strcmp (op0->id + 1, "SHIFT_EXPR") == 0
1220 || strcmp (op0->id + 1, "ROTATE_EXPR") == 0))
1222 else
1223 can_delay_subst = false;
1225 else if (is_a <fn_id *> (ids[i]->substitutes[j]))
1227 else
1228 can_delay_subst = false;
1231 unsigned worklist_end = worklist.length ();
1232 for (unsigned si = worklist_start; si < worklist_end; ++si)
1234 simplify *s = worklist[si];
1235 for (unsigned j = 0; j < max_n_opers; ++j)
1237 operand *match_op = s->match;
1238 operand *result_op = s->result;
1239 vec<std::pair<user_id *, id_base *> > subst;
1240 subst.create (n_ids);
1241 for (unsigned i = 0; i < n_ids; ++i)
1243 user_id *id = ids[i];
1244 id_base *oper = id->substitutes[j % id->substitutes.length ()];
1245 subst.quick_push (std::make_pair (id, oper));
1246 match_op = replace_id (match_op, id, oper);
1247 if (result_op
1248 && !can_delay_subst)
1249 result_op = replace_id (result_op, id, oper);
1251 simplify *ns = new simplify (s->kind, match_op, result_op,
1252 vNULL, s->capture_ids);
1253 ns->for_subst_vec.safe_splice (s->for_subst_vec);
1254 if (result_op
1255 && can_delay_subst)
1256 ns->for_subst_vec.safe_splice (subst);
1257 else
1258 subst.release ();
1259 worklist.safe_push (ns);
1262 worklist_start = worklist_end;
1265 /* Copy out the result from the last for lowering. */
1266 for (unsigned i = worklist_start; i < worklist.length (); ++i)
1267 simplifiers.safe_push (worklist[i]);
1270 /* Lower the AST for everything in SIMPLIFIERS. */
1272 static void
1273 lower (vec<simplify *>& simplifiers, bool gimple)
1275 auto_vec<simplify *> out_simplifiers;
1276 for (unsigned i = 0; i < simplifiers.length (); ++i)
1277 lower_opt_convert (simplifiers[i], out_simplifiers);
1279 simplifiers.truncate (0);
1280 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1281 lower_commutative (out_simplifiers[i], simplifiers);
1283 out_simplifiers.truncate (0);
1284 if (gimple)
1285 for (unsigned i = 0; i < simplifiers.length (); ++i)
1286 lower_cond (simplifiers[i], out_simplifiers);
1287 else
1288 out_simplifiers.safe_splice (simplifiers);
1291 simplifiers.truncate (0);
1292 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1293 lower_for (out_simplifiers[i], simplifiers);
1299 /* The decision tree built for generating GIMPLE and GENERIC pattern
1300 matching code. It represents the 'match' expression of all
1301 simplifies and has those as its leafs. */
1303 struct dt_simplify;
1305 /* A hash-map collecting semantically equivalent leafs in the decision
1306 tree for splitting out to separate functions. */
1307 struct sinfo
1309 dt_simplify *s;
1311 const char *fname;
1312 unsigned cnt;
1315 struct sinfo_hashmap_traits : simple_hashmap_traits <pointer_hash <dt_simplify> >
1317 static inline hashval_t hash (const key_type &);
1318 static inline bool equal_keys (const key_type &, const key_type &);
1319 template <typename T> static inline void remove (T &) {}
1322 typedef hash_map<void * /* unused */, sinfo *, sinfo_hashmap_traits>
1323 sinfo_map_t;
1326 /* Decision tree base class, used for DT_TRUE and DT_NODE. */
1328 struct dt_node
1330 enum dt_type { DT_NODE, DT_OPERAND, DT_TRUE, DT_MATCH, DT_SIMPLIFY };
1332 enum dt_type type;
1333 unsigned level;
1334 vec<dt_node *> kids;
1336 /* Statistics. */
1337 unsigned num_leafs;
1338 unsigned total_size;
1339 unsigned max_level;
1341 dt_node (enum dt_type type_): type (type_), level (0), kids (vNULL) {}
1343 dt_node *append_node (dt_node *);
1344 dt_node *append_op (operand *, dt_node *parent = 0, unsigned pos = 0);
1345 dt_node *append_true_op (dt_node *parent = 0, unsigned pos = 0);
1346 dt_node *append_match_op (dt_operand *, dt_node *parent = 0, unsigned pos = 0);
1347 dt_node *append_simplify (simplify *, unsigned, dt_operand **);
1349 virtual void gen (FILE *, int, bool) {}
1351 void gen_kids (FILE *, int, bool);
1352 void gen_kids_1 (FILE *, int, bool,
1353 vec<dt_operand *>, vec<dt_operand *>, vec<dt_operand *>,
1354 vec<dt_operand *>, vec<dt_operand *>, vec<dt_node *>);
1356 void analyze (sinfo_map_t &);
1359 /* Generic decision tree node used for DT_OPERAND and DT_MATCH. */
1361 struct dt_operand : public dt_node
1363 operand *op;
1364 dt_operand *match_dop;
1365 dt_operand *parent;
1366 unsigned pos;
1368 dt_operand (enum dt_type type, operand *op_, dt_operand *match_dop_,
1369 dt_operand *parent_ = 0, unsigned pos_ = 0)
1370 : dt_node (type), op (op_), match_dop (match_dop_),
1371 parent (parent_), pos (pos_) {}
1373 void gen (FILE *, int, bool);
1374 unsigned gen_predicate (FILE *, int, const char *, bool);
1375 unsigned gen_match_op (FILE *, int, const char *);
1377 unsigned gen_gimple_expr (FILE *, int);
1378 unsigned gen_generic_expr (FILE *, int, const char *);
1380 char *get_name (char *);
1381 void gen_opname (char *, unsigned);
1384 /* Leaf node of the decision tree, used for DT_SIMPLIFY. */
1386 struct dt_simplify : public dt_node
1388 simplify *s;
1389 unsigned pattern_no;
1390 dt_operand **indexes;
1391 sinfo *info;
1393 dt_simplify (simplify *s_, unsigned pattern_no_, dt_operand **indexes_)
1394 : dt_node (DT_SIMPLIFY), s (s_), pattern_no (pattern_no_),
1395 indexes (indexes_), info (NULL) {}
1397 void gen_1 (FILE *, int, bool, operand *);
1398 void gen (FILE *f, int, bool);
1401 template<>
1402 template<>
1403 inline bool
1404 is_a_helper <dt_operand *>::test (dt_node *n)
1406 return (n->type == dt_node::DT_OPERAND
1407 || n->type == dt_node::DT_MATCH);
1410 template<>
1411 template<>
1412 inline bool
1413 is_a_helper <dt_simplify *>::test (dt_node *n)
1415 return n->type == dt_node::DT_SIMPLIFY;
1420 /* A container for the actual decision tree. */
1422 struct decision_tree
1424 dt_node *root;
1426 void insert (struct simplify *, unsigned);
1427 void gen (FILE *f, bool gimple);
1428 void print (FILE *f = stderr);
1430 decision_tree () { root = new dt_node (dt_node::DT_NODE); }
1432 static dt_node *insert_operand (dt_node *, operand *, dt_operand **indexes,
1433 unsigned pos = 0, dt_node *parent = 0);
1434 static dt_node *find_node (vec<dt_node *>&, dt_node *);
1435 static bool cmp_node (dt_node *, dt_node *);
1436 static void print_node (dt_node *, FILE *f = stderr, unsigned = 0);
1439 /* Compare two AST operands O1 and O2 and return true if they are equal. */
1441 bool
1442 cmp_operand (operand *o1, operand *o2)
1444 if (!o1 || !o2 || o1->type != o2->type)
1445 return false;
1447 if (o1->type == operand::OP_PREDICATE)
1449 predicate *p1 = as_a<predicate *>(o1);
1450 predicate *p2 = as_a<predicate *>(o2);
1451 return p1->p == p2->p;
1453 else if (o1->type == operand::OP_EXPR)
1455 expr *e1 = static_cast<expr *>(o1);
1456 expr *e2 = static_cast<expr *>(o2);
1457 return (e1->operation == e2->operation
1458 && e1->is_generic == e2->is_generic);
1460 else
1461 return false;
1464 /* Compare two decision tree nodes N1 and N2 and return true if they
1465 are equal. */
1467 bool
1468 decision_tree::cmp_node (dt_node *n1, dt_node *n2)
1470 if (!n1 || !n2 || n1->type != n2->type)
1471 return false;
1473 if (n1 == n2)
1474 return true;
1476 if (n1->type == dt_node::DT_TRUE)
1477 return false;
1479 if (n1->type == dt_node::DT_OPERAND)
1480 return cmp_operand ((as_a<dt_operand *> (n1))->op,
1481 (as_a<dt_operand *> (n2))->op);
1482 else if (n1->type == dt_node::DT_MATCH)
1483 return ((as_a<dt_operand *> (n1))->match_dop
1484 == (as_a<dt_operand *> (n2))->match_dop);
1485 return false;
1488 /* Search OPS for a decision tree node like P and return it if found. */
1490 dt_node *
1491 decision_tree::find_node (vec<dt_node *>& ops, dt_node *p)
1493 /* We can merge adjacent DT_TRUE. */
1494 if (p->type == dt_node::DT_TRUE
1495 && !ops.is_empty ()
1496 && ops.last ()->type == dt_node::DT_TRUE)
1497 return ops.last ();
1498 for (int i = ops.length () - 1; i >= 0; --i)
1500 /* But we can't merge across DT_TRUE nodes as they serve as
1501 pattern order barriers to make sure that patterns apply
1502 in order of appearance in case multiple matches are possible. */
1503 if (ops[i]->type == dt_node::DT_TRUE)
1504 return NULL;
1505 if (decision_tree::cmp_node (ops[i], p))
1506 return ops[i];
1508 return NULL;
1511 /* Append N to the decision tree if it there is not already an existing
1512 identical child. */
1514 dt_node *
1515 dt_node::append_node (dt_node *n)
1517 dt_node *kid;
1519 kid = decision_tree::find_node (kids, n);
1520 if (kid)
1521 return kid;
1523 kids.safe_push (n);
1524 n->level = this->level + 1;
1526 return n;
1529 /* Append OP to the decision tree. */
1531 dt_node *
1532 dt_node::append_op (operand *op, dt_node *parent, unsigned pos)
1534 dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1535 dt_operand *n = new dt_operand (DT_OPERAND, op, 0, parent_, pos);
1536 return append_node (n);
1539 /* Append a DT_TRUE decision tree node. */
1541 dt_node *
1542 dt_node::append_true_op (dt_node *parent, unsigned pos)
1544 dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1545 dt_operand *n = new dt_operand (DT_TRUE, 0, 0, parent_, pos);
1546 return append_node (n);
1549 /* Append a DT_MATCH decision tree node. */
1551 dt_node *
1552 dt_node::append_match_op (dt_operand *match_dop, dt_node *parent, unsigned pos)
1554 dt_operand *parent_ = as_a<dt_operand *> (parent);
1555 dt_operand *n = new dt_operand (DT_MATCH, 0, match_dop, parent_, pos);
1556 return append_node (n);
1559 /* Append S to the decision tree. */
1561 dt_node *
1562 dt_node::append_simplify (simplify *s, unsigned pattern_no,
1563 dt_operand **indexes)
1565 dt_simplify *n = new dt_simplify (s, pattern_no, indexes);
1566 return append_node (n);
1569 /* Analyze the node and its children. */
1571 void
1572 dt_node::analyze (sinfo_map_t &map)
1574 num_leafs = 0;
1575 total_size = 1;
1576 max_level = level;
1578 if (type == DT_SIMPLIFY)
1580 /* Populate the map of equivalent simplifies. */
1581 dt_simplify *s = as_a <dt_simplify *> (this);
1582 bool existed;
1583 sinfo *&si = map.get_or_insert (s, &existed);
1584 if (!existed)
1586 si = new sinfo;
1587 si->s = s;
1588 si->cnt = 1;
1589 si->fname = NULL;
1591 else
1592 si->cnt++;
1593 s->info = si;
1594 num_leafs = 1;
1595 return;
1598 for (unsigned i = 0; i < kids.length (); ++i)
1600 kids[i]->analyze (map);
1601 num_leafs += kids[i]->num_leafs;
1602 total_size += kids[i]->total_size;
1603 max_level = MAX (max_level, kids[i]->max_level);
1607 /* Insert O into the decision tree and return the decision tree node found
1608 or created. */
1610 dt_node *
1611 decision_tree::insert_operand (dt_node *p, operand *o, dt_operand **indexes,
1612 unsigned pos, dt_node *parent)
1614 dt_node *q, *elm = 0;
1616 if (capture *c = dyn_cast<capture *> (o))
1618 unsigned capt_index = c->where;
1620 if (indexes[capt_index] == 0)
1622 if (c->what)
1623 q = insert_operand (p, c->what, indexes, pos, parent);
1624 else
1626 q = elm = p->append_true_op (parent, pos);
1627 goto at_assert_elm;
1629 // get to the last capture
1630 for (operand *what = c->what;
1631 what && is_a<capture *> (what);
1632 c = as_a<capture *> (what), what = c->what)
1635 if (!c->what)
1637 unsigned cc_index = c->where;
1638 dt_operand *match_op = indexes[cc_index];
1640 dt_operand temp (dt_node::DT_TRUE, 0, 0);
1641 elm = decision_tree::find_node (p->kids, &temp);
1643 if (elm == 0)
1645 dt_operand temp (dt_node::DT_MATCH, 0, match_op);
1646 elm = decision_tree::find_node (p->kids, &temp);
1649 else
1651 dt_operand temp (dt_node::DT_OPERAND, c->what, 0);
1652 elm = decision_tree::find_node (p->kids, &temp);
1655 at_assert_elm:
1656 gcc_assert (elm->type == dt_node::DT_TRUE
1657 || elm->type == dt_node::DT_OPERAND
1658 || elm->type == dt_node::DT_MATCH);
1659 indexes[capt_index] = static_cast<dt_operand *> (elm);
1660 return q;
1662 else
1664 p = p->append_match_op (indexes[capt_index], parent, pos);
1665 if (c->what)
1666 return insert_operand (p, c->what, indexes, 0, p);
1667 else
1668 return p;
1671 p = p->append_op (o, parent, pos);
1672 q = p;
1674 if (expr *e = dyn_cast <expr *>(o))
1676 for (unsigned i = 0; i < e->ops.length (); ++i)
1677 q = decision_tree::insert_operand (q, e->ops[i], indexes, i, p);
1680 return q;
1683 /* Insert S into the decision tree. */
1685 void
1686 decision_tree::insert (struct simplify *s, unsigned pattern_no)
1688 dt_operand **indexes = XCNEWVEC (dt_operand *, s->capture_max + 1);
1689 dt_node *p = decision_tree::insert_operand (root, s->match, indexes);
1690 p->append_simplify (s, pattern_no, indexes);
1693 /* Debug functions to dump the decision tree. */
1695 DEBUG_FUNCTION void
1696 decision_tree::print_node (dt_node *p, FILE *f, unsigned indent)
1698 if (p->type == dt_node::DT_NODE)
1699 fprintf (f, "root");
1700 else
1702 fprintf (f, "|");
1703 for (unsigned i = 0; i < indent; i++)
1704 fprintf (f, "-");
1706 if (p->type == dt_node::DT_OPERAND)
1708 dt_operand *dop = static_cast<dt_operand *>(p);
1709 print_operand (dop->op, f, true);
1711 else if (p->type == dt_node::DT_TRUE)
1712 fprintf (f, "true");
1713 else if (p->type == dt_node::DT_MATCH)
1714 fprintf (f, "match (%p)", (void *)((as_a<dt_operand *>(p))->match_dop));
1715 else if (p->type == dt_node::DT_SIMPLIFY)
1717 dt_simplify *s = static_cast<dt_simplify *> (p);
1718 fprintf (f, "simplify_%u { ", s->pattern_no);
1719 for (int i = 0; i <= s->s->capture_max; ++i)
1720 fprintf (f, "%p, ", (void *) s->indexes[i]);
1721 fprintf (f, " } ");
1725 fprintf (stderr, " (%p), %u, %u\n", (void *) p, p->level, p->kids.length ());
1727 for (unsigned i = 0; i < p->kids.length (); ++i)
1728 decision_tree::print_node (p->kids[i], f, indent + 2);
1731 DEBUG_FUNCTION void
1732 decision_tree::print (FILE *f)
1734 return decision_tree::print_node (root, f);
1738 /* For GENERIC we have to take care of wrapping multiple-used
1739 expressions with side-effects in save_expr and preserve side-effects
1740 of expressions with omit_one_operand. Analyze captures in
1741 match, result and with expressions and perform early-outs
1742 on the outermost match expression operands for cases we cannot
1743 handle. */
1745 struct capture_info
1747 capture_info (simplify *s, operand *, bool);
1748 void walk_match (operand *o, unsigned toplevel_arg, bool, bool);
1749 bool walk_result (operand *o, bool, operand *);
1750 void walk_c_expr (c_expr *);
1752 struct cinfo
1754 bool expr_p;
1755 bool cse_p;
1756 bool force_no_side_effects_p;
1757 bool force_single_use;
1758 bool cond_expr_cond_p;
1759 unsigned long toplevel_msk;
1760 int result_use_count;
1761 unsigned same_as;
1762 capture *c;
1765 auto_vec<cinfo> info;
1766 unsigned long force_no_side_effects;
1767 bool gimple;
1770 /* Analyze captures in S. */
1772 capture_info::capture_info (simplify *s, operand *result, bool gimple_)
1774 gimple = gimple_;
1776 expr *e;
1777 if (s->kind == simplify::MATCH)
1779 force_no_side_effects = -1;
1780 return;
1783 force_no_side_effects = 0;
1784 info.safe_grow_cleared (s->capture_max + 1);
1785 for (int i = 0; i <= s->capture_max; ++i)
1786 info[i].same_as = i;
1788 e = as_a <expr *> (s->match);
1789 for (unsigned i = 0; i < e->ops.length (); ++i)
1790 walk_match (e->ops[i], i,
1791 (i != 0 && *e->operation == COND_EXPR)
1792 || *e->operation == TRUTH_ANDIF_EXPR
1793 || *e->operation == TRUTH_ORIF_EXPR,
1794 i == 0
1795 && (*e->operation == COND_EXPR
1796 || *e->operation == VEC_COND_EXPR));
1798 walk_result (s->result, false, result);
1801 /* Analyze captures in the match expression piece O. */
1803 void
1804 capture_info::walk_match (operand *o, unsigned toplevel_arg,
1805 bool conditional_p, bool cond_expr_cond_p)
1807 if (capture *c = dyn_cast <capture *> (o))
1809 unsigned where = c->where;
1810 info[where].toplevel_msk |= 1 << toplevel_arg;
1811 info[where].force_no_side_effects_p |= conditional_p;
1812 info[where].cond_expr_cond_p |= cond_expr_cond_p;
1813 if (!info[where].c)
1814 info[where].c = c;
1815 if (!c->what)
1816 return;
1817 /* Recurse to exprs and captures. */
1818 if (is_a <capture *> (c->what)
1819 || is_a <expr *> (c->what))
1820 walk_match (c->what, toplevel_arg, conditional_p, false);
1821 /* We need to look past multiple captures to find a captured
1822 expression as with conditional converts two captures
1823 can be collapsed onto the same expression. Also collect
1824 what captures capture the same thing. */
1825 while (c->what && is_a <capture *> (c->what))
1827 c = as_a <capture *> (c->what);
1828 if (info[c->where].same_as != c->where
1829 && info[c->where].same_as != info[where].same_as)
1830 fatal_at (c->location, "cannot handle this collapsed capture");
1831 info[c->where].same_as = info[where].same_as;
1833 /* Mark expr (non-leaf) captures and forced single-use exprs. */
1834 expr *e;
1835 if (c->what
1836 && (e = dyn_cast <expr *> (c->what)))
1838 info[where].expr_p = true;
1839 info[where].force_single_use |= e->force_single_use;
1842 else if (expr *e = dyn_cast <expr *> (o))
1844 for (unsigned i = 0; i < e->ops.length (); ++i)
1846 bool cond_p = conditional_p;
1847 bool cond_expr_cond_p = false;
1848 if (i != 0 && *e->operation == COND_EXPR)
1849 cond_p = true;
1850 else if (*e->operation == TRUTH_ANDIF_EXPR
1851 || *e->operation == TRUTH_ORIF_EXPR)
1852 cond_p = true;
1853 if (i == 0
1854 && (*e->operation == COND_EXPR
1855 || *e->operation == VEC_COND_EXPR))
1856 cond_expr_cond_p = true;
1857 walk_match (e->ops[i], toplevel_arg, cond_p, cond_expr_cond_p);
1860 else if (is_a <predicate *> (o))
1862 /* Mark non-captured leafs toplevel arg for checking. */
1863 force_no_side_effects |= 1 << toplevel_arg;
1864 if (verbose >= 1
1865 && !gimple)
1866 warning_at (o->location,
1867 "forcing no side-effects on possibly lost leaf");
1869 else
1870 gcc_unreachable ();
1873 /* Analyze captures in the result expression piece O. Return true
1874 if RESULT was visited in one of the children. Only visit
1875 non-if/with children if they are rooted on RESULT. */
1877 bool
1878 capture_info::walk_result (operand *o, bool conditional_p, operand *result)
1880 if (capture *c = dyn_cast <capture *> (o))
1882 unsigned where = info[c->where].same_as;
1883 info[where].result_use_count++;
1884 /* If we substitute an expression capture we don't know
1885 which captures this will end up using (well, we don't
1886 compute that). Force the uses to be side-effect free
1887 which means forcing the toplevels that reach the
1888 expression side-effect free. */
1889 if (info[where].expr_p)
1890 force_no_side_effects |= info[where].toplevel_msk;
1891 /* Mark CSE capture uses as forced to have no side-effects. */
1892 if (c->what
1893 && is_a <expr *> (c->what))
1895 info[where].cse_p = true;
1896 walk_result (c->what, true, result);
1899 else if (expr *e = dyn_cast <expr *> (o))
1901 id_base *opr = e->operation;
1902 if (user_id *uid = dyn_cast <user_id *> (opr))
1903 opr = uid->substitutes[0];
1904 for (unsigned i = 0; i < e->ops.length (); ++i)
1906 bool cond_p = conditional_p;
1907 if (i != 0 && *e->operation == COND_EXPR)
1908 cond_p = true;
1909 else if (*e->operation == TRUTH_ANDIF_EXPR
1910 || *e->operation == TRUTH_ORIF_EXPR)
1911 cond_p = true;
1912 walk_result (e->ops[i], cond_p, result);
1915 else if (if_expr *e = dyn_cast <if_expr *> (o))
1917 /* 'if' conditions should be all fine. */
1918 if (e->trueexpr == result)
1920 walk_result (e->trueexpr, false, result);
1921 return true;
1923 if (e->falseexpr == result)
1925 walk_result (e->falseexpr, false, result);
1926 return true;
1928 bool res = false;
1929 if (is_a <if_expr *> (e->trueexpr)
1930 || is_a <with_expr *> (e->trueexpr))
1931 res |= walk_result (e->trueexpr, false, result);
1932 if (e->falseexpr
1933 && (is_a <if_expr *> (e->falseexpr)
1934 || is_a <with_expr *> (e->falseexpr)))
1935 res |= walk_result (e->falseexpr, false, result);
1936 return res;
1938 else if (with_expr *e = dyn_cast <with_expr *> (o))
1940 bool res = (e->subexpr == result);
1941 if (res
1942 || is_a <if_expr *> (e->subexpr)
1943 || is_a <with_expr *> (e->subexpr))
1944 res |= walk_result (e->subexpr, false, result);
1945 if (res)
1946 walk_c_expr (e->with);
1947 return res;
1949 else if (c_expr *e = dyn_cast <c_expr *> (o))
1950 walk_c_expr (e);
1951 else
1952 gcc_unreachable ();
1954 return false;
1957 /* Look for captures in the C expr E. */
1959 void
1960 capture_info::walk_c_expr (c_expr *e)
1962 /* Give up for C exprs mentioning captures not inside TREE_TYPE,
1963 TREE_REAL_CST, TREE_CODE or a predicate where they cannot
1964 really escape through. */
1965 unsigned p_depth = 0;
1966 for (unsigned i = 0; i < e->code.length (); ++i)
1968 const cpp_token *t = &e->code[i];
1969 const cpp_token *n = i < e->code.length () - 1 ? &e->code[i+1] : NULL;
1970 id_base *id;
1971 if (t->type == CPP_NAME
1972 && (strcmp ((const char *)CPP_HASHNODE
1973 (t->val.node.node)->ident.str, "TREE_TYPE") == 0
1974 || strcmp ((const char *)CPP_HASHNODE
1975 (t->val.node.node)->ident.str, "TREE_CODE") == 0
1976 || strcmp ((const char *)CPP_HASHNODE
1977 (t->val.node.node)->ident.str, "TREE_REAL_CST") == 0
1978 || ((id = get_operator ((const char *)CPP_HASHNODE
1979 (t->val.node.node)->ident.str))
1980 && is_a <predicate_id *> (id)))
1981 && n->type == CPP_OPEN_PAREN)
1982 p_depth++;
1983 else if (t->type == CPP_CLOSE_PAREN
1984 && p_depth > 0)
1985 p_depth--;
1986 else if (p_depth == 0
1987 && t->type == CPP_ATSIGN
1988 && (n->type == CPP_NUMBER
1989 || n->type == CPP_NAME)
1990 && !(n->flags & PREV_WHITE))
1992 const char *id;
1993 if (n->type == CPP_NUMBER)
1994 id = (const char *)n->val.str.text;
1995 else
1996 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
1997 unsigned where = *e->capture_ids->get(id);
1998 info[info[where].same_as].force_no_side_effects_p = true;
1999 if (verbose >= 1
2000 && !gimple)
2001 warning_at (t, "capture escapes");
2007 /* Code generation off the decision tree and the refered AST nodes. */
2009 bool
2010 is_conversion (id_base *op)
2012 return (*op == CONVERT_EXPR
2013 || *op == NOP_EXPR
2014 || *op == FLOAT_EXPR
2015 || *op == FIX_TRUNC_EXPR
2016 || *op == VIEW_CONVERT_EXPR);
2019 /* Get the type to be used for generating operands of OP from the
2020 various sources. */
2022 static const char *
2023 get_operand_type (id_base *op, const char *in_type,
2024 const char *expr_type,
2025 const char *other_oprnd_type)
2027 /* Generally operands whose type does not match the type of the
2028 expression generated need to know their types but match and
2029 thus can fall back to 'other_oprnd_type'. */
2030 if (is_conversion (op))
2031 return other_oprnd_type;
2032 else if (*op == REALPART_EXPR
2033 || *op == IMAGPART_EXPR)
2034 return other_oprnd_type;
2035 else if (is_a <operator_id *> (op)
2036 && strcmp (as_a <operator_id *> (op)->tcc, "tcc_comparison") == 0)
2037 return other_oprnd_type;
2038 else
2040 /* Otherwise all types should match - choose one in order of
2041 preference. */
2042 if (expr_type)
2043 return expr_type;
2044 else if (in_type)
2045 return in_type;
2046 else
2047 return other_oprnd_type;
2051 /* Generate transform code for an expression. */
2053 void
2054 expr::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
2055 int depth, const char *in_type, capture_info *cinfo,
2056 dt_operand **indexes, bool)
2058 id_base *opr = operation;
2059 /* When we delay operator substituting during lowering of fors we
2060 make sure that for code-gen purposes the effects of each substitute
2061 are the same. Thus just look at that. */
2062 if (user_id *uid = dyn_cast <user_id *> (opr))
2063 opr = uid->substitutes[0];
2065 bool conversion_p = is_conversion (opr);
2066 const char *type = expr_type;
2067 char optype[64];
2068 if (type)
2069 /* If there was a type specification in the pattern use it. */
2071 else if (conversion_p)
2072 /* For conversions we need to build the expression using the
2073 outer type passed in. */
2074 type = in_type;
2075 else if (*opr == REALPART_EXPR
2076 || *opr == IMAGPART_EXPR)
2078 /* __real and __imag use the component type of its operand. */
2079 sprintf (optype, "TREE_TYPE (TREE_TYPE (ops%d[0]))", depth);
2080 type = optype;
2082 else if (is_a <operator_id *> (opr)
2083 && !strcmp (as_a <operator_id *> (opr)->tcc, "tcc_comparison"))
2085 /* comparisons use boolean_type_node (or what gets in), but
2086 their operands need to figure out the types themselves. */
2087 sprintf (optype, "boolean_type_node");
2088 type = optype;
2090 else if (*opr == COND_EXPR
2091 || *opr == VEC_COND_EXPR)
2093 /* Conditions are of the same type as their first alternative. */
2094 sprintf (optype, "TREE_TYPE (ops%d[1])", depth);
2095 type = optype;
2097 else
2099 /* Other operations are of the same type as their first operand. */
2100 sprintf (optype, "TREE_TYPE (ops%d[0])", depth);
2101 type = optype;
2103 if (!type)
2104 fatal_at (location, "cannot determine type of operand");
2106 fprintf_indent (f, indent, "{\n");
2107 indent += 2;
2108 fprintf_indent (f, indent, "tree ops%d[%u], res;\n", depth, ops.length ());
2109 char op0type[64];
2110 snprintf (op0type, 64, "TREE_TYPE (ops%d[0])", depth);
2111 for (unsigned i = 0; i < ops.length (); ++i)
2113 char dest[32];
2114 snprintf (dest, 32, "ops%d[%u]", depth, i);
2115 const char *optype
2116 = get_operand_type (opr, in_type, expr_type,
2117 i == 0 ? NULL : op0type);
2118 ops[i]->gen_transform (f, indent, dest, gimple, depth + 1, optype,
2119 cinfo, indexes,
2120 ((!(*opr == COND_EXPR)
2121 && !(*opr == VEC_COND_EXPR))
2122 || i != 0));
2125 const char *opr_name;
2126 if (*operation == CONVERT_EXPR)
2127 opr_name = "NOP_EXPR";
2128 else
2129 opr_name = operation->id;
2131 if (gimple)
2133 if (*opr == CONVERT_EXPR)
2135 fprintf_indent (f, indent,
2136 "if (%s != TREE_TYPE (ops%d[0])\n",
2137 type, depth);
2138 fprintf_indent (f, indent,
2139 " && !useless_type_conversion_p (%s, TREE_TYPE (ops%d[0])))\n",
2140 type, depth);
2141 fprintf_indent (f, indent + 2, "{\n");
2142 indent += 4;
2144 /* ??? Building a stmt can fail for various reasons here, seq being
2145 NULL or the stmt referencing SSA names occuring in abnormal PHIs.
2146 So if we fail here we should continue matching other patterns. */
2147 fprintf_indent (f, indent, "code_helper tem_code = %s;\n", opr_name);
2148 fprintf_indent (f, indent, "tree tem_ops[3] = { ");
2149 for (unsigned i = 0; i < ops.length (); ++i)
2150 fprintf (f, "ops%d[%u]%s", depth, i,
2151 i == ops.length () - 1 ? " };\n" : ", ");
2152 fprintf_indent (f, indent,
2153 "gimple_resimplify%d (lseq, &tem_code, %s, tem_ops, valueize);\n",
2154 ops.length (), type);
2155 fprintf_indent (f, indent,
2156 "res = maybe_push_res_to_seq (tem_code, %s, tem_ops, lseq);\n",
2157 type);
2158 fprintf_indent (f, indent,
2159 "if (!res) return false;\n");
2160 if (*opr == CONVERT_EXPR)
2162 indent -= 4;
2163 fprintf_indent (f, indent, " }\n");
2164 fprintf_indent (f, indent, "else\n");
2165 fprintf_indent (f, indent, " res = ops%d[0];\n", depth);
2168 else
2170 if (*opr == CONVERT_EXPR)
2172 fprintf_indent (f, indent, "if (TREE_TYPE (ops%d[0]) != %s)\n",
2173 depth, type);
2174 indent += 2;
2176 if (opr->kind == id_base::CODE)
2177 fprintf_indent (f, indent, "res = fold_build%d_loc (loc, %s, %s",
2178 ops.length(), opr_name, type);
2179 else
2180 fprintf_indent (f, indent, "res = build_call_expr_loc (loc, "
2181 "builtin_decl_implicit (%s), %d", opr_name, ops.length());
2182 for (unsigned i = 0; i < ops.length (); ++i)
2183 fprintf (f, ", ops%d[%u]", depth, i);
2184 fprintf (f, ");\n");
2185 if (*opr == CONVERT_EXPR)
2187 indent -= 2;
2188 fprintf_indent (f, indent, "else\n");
2189 fprintf_indent (f, indent, " res = ops%d[0];\n", depth);
2192 fprintf_indent (f, indent, "%s = res;\n", dest);
2193 indent -= 2;
2194 fprintf_indent (f, indent, "}\n");
2197 /* Generate code for a c_expr which is either the expression inside
2198 an if statement or a sequence of statements which computes a
2199 result to be stored to DEST. */
2201 void
2202 c_expr::gen_transform (FILE *f, int indent, const char *dest,
2203 bool, int, const char *, capture_info *,
2204 dt_operand **, bool)
2206 if (dest && nr_stmts == 1)
2207 fprintf_indent (f, indent, "%s = ", dest);
2209 unsigned stmt_nr = 1;
2210 for (unsigned i = 0; i < code.length (); ++i)
2212 const cpp_token *token = &code[i];
2214 /* Replace captures for code-gen. */
2215 if (token->type == CPP_ATSIGN)
2217 const cpp_token *n = &code[i+1];
2218 if ((n->type == CPP_NUMBER
2219 || n->type == CPP_NAME)
2220 && !(n->flags & PREV_WHITE))
2222 if (token->flags & PREV_WHITE)
2223 fputc (' ', f);
2224 const char *id;
2225 if (n->type == CPP_NUMBER)
2226 id = (const char *)n->val.str.text;
2227 else
2228 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
2229 unsigned *cid = capture_ids->get (id);
2230 if (!cid)
2231 fatal_at (token, "unknown capture id");
2232 fprintf (f, "captures[%u]", *cid);
2233 ++i;
2234 continue;
2238 if (token->flags & PREV_WHITE)
2239 fputc (' ', f);
2241 if (token->type == CPP_NAME)
2243 const char *id = (const char *) NODE_NAME (token->val.node.node);
2244 unsigned j;
2245 for (j = 0; j < ids.length (); ++j)
2247 if (strcmp (id, ids[j].id) == 0)
2249 fprintf (f, "%s", ids[j].oper);
2250 break;
2253 if (j < ids.length ())
2254 continue;
2257 /* Output the token as string. */
2258 char *tk = (char *)cpp_token_as_text (r, token);
2259 fputs (tk, f);
2261 if (token->type == CPP_SEMICOLON)
2263 stmt_nr++;
2264 fputc ('\n', f);
2265 if (dest && stmt_nr == nr_stmts)
2266 fprintf_indent (f, indent, "%s = ", dest);
2271 /* Generate transform code for a capture. */
2273 void
2274 capture::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
2275 int depth, const char *in_type, capture_info *cinfo,
2276 dt_operand **indexes, bool expand_compares)
2278 if (what && is_a<expr *> (what))
2280 if (indexes[where] == 0)
2282 char buf[20];
2283 sprintf (buf, "captures[%u]", where);
2284 what->gen_transform (f, indent, buf, gimple, depth, in_type,
2285 cinfo, NULL);
2289 fprintf_indent (f, indent, "%s = captures[%u];\n", dest, where);
2291 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
2292 with substituting a capture of that.
2293 ??? Returning false here will also not allow any other patterns
2294 to match. */
2295 if (gimple && expand_compares
2296 && cinfo->info[where].cond_expr_cond_p)
2298 fprintf_indent (f, indent, "if (COMPARISON_CLASS_P (%s))\n", dest);
2299 fprintf_indent (f, indent, " {\n");
2300 fprintf_indent (f, indent, " if (!seq) return false;\n");
2301 fprintf_indent (f, indent, " %s = gimple_build (seq, TREE_CODE (%s),"
2302 " TREE_TYPE (%s), TREE_OPERAND (%s, 0),"
2303 " TREE_OPERAND (%s, 1));\n",
2304 dest, dest, dest, dest, dest);
2305 fprintf_indent (f, indent, " }\n");
2309 /* Return the name of the operand representing the decision tree node.
2310 Use NAME as space to generate it. */
2312 char *
2313 dt_operand::get_name (char *name)
2315 if (!parent)
2316 sprintf (name, "t");
2317 else if (parent->level == 1)
2318 sprintf (name, "op%u", pos);
2319 else if (parent->type == dt_node::DT_MATCH)
2320 return parent->get_name (name);
2321 else
2322 sprintf (name, "o%u%u", parent->level, pos);
2323 return name;
2326 /* Fill NAME with the operand name at position POS. */
2328 void
2329 dt_operand::gen_opname (char *name, unsigned pos)
2331 if (!parent)
2332 sprintf (name, "op%u", pos);
2333 else
2334 sprintf (name, "o%u%u", level, pos);
2337 /* Generate matching code for the decision tree operand which is
2338 a predicate. */
2340 unsigned
2341 dt_operand::gen_predicate (FILE *f, int indent, const char *opname, bool gimple)
2343 predicate *p = as_a <predicate *> (op);
2345 if (p->p->matchers.exists ())
2347 /* If this is a predicate generated from a pattern mangle its
2348 name and pass on the valueize hook. */
2349 if (gimple)
2350 fprintf_indent (f, indent, "if (gimple_%s (%s, valueize))\n",
2351 p->p->id, opname);
2352 else
2353 fprintf_indent (f, indent, "if (tree_%s (%s))\n", p->p->id, opname);
2355 else
2356 fprintf_indent (f, indent, "if (%s (%s))\n", p->p->id, opname);
2357 fprintf_indent (f, indent + 2, "{\n");
2358 return 1;
2361 /* Generate matching code for the decision tree operand which is
2362 a capture-match. */
2364 unsigned
2365 dt_operand::gen_match_op (FILE *f, int indent, const char *opname)
2367 char match_opname[20];
2368 match_dop->get_name (match_opname);
2369 fprintf_indent (f, indent, "if (%s == %s || operand_equal_p (%s, %s, 0))\n",
2370 opname, match_opname, opname, match_opname);
2371 fprintf_indent (f, indent + 2, "{\n");
2372 return 1;
2375 /* Generate GIMPLE matching code for the decision tree operand. */
2377 unsigned
2378 dt_operand::gen_gimple_expr (FILE *f, int indent)
2380 expr *e = static_cast<expr *> (op);
2381 id_base *id = e->operation;
2382 unsigned n_ops = e->ops.length ();
2384 for (unsigned i = 0; i < n_ops; ++i)
2386 char child_opname[20];
2387 gen_opname (child_opname, i);
2389 if (id->kind == id_base::CODE)
2391 if (e->is_generic
2392 || *id == REALPART_EXPR || *id == IMAGPART_EXPR
2393 || *id == BIT_FIELD_REF || *id == VIEW_CONVERT_EXPR)
2395 /* ??? If this is a memory operation we can't (and should not)
2396 match this. The only sensible operand types are
2397 SSA names and invariants. */
2398 fprintf_indent (f, indent,
2399 "tree %s = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), %i);\n",
2400 child_opname, i);
2401 fprintf_indent (f, indent,
2402 "if ((TREE_CODE (%s) == SSA_NAME\n",
2403 child_opname);
2404 fprintf_indent (f, indent,
2405 " || is_gimple_min_invariant (%s))\n",
2406 child_opname);
2407 fprintf_indent (f, indent,
2408 " && (%s = do_valueize (valueize, %s)))\n",
2409 child_opname, child_opname);
2410 fprintf_indent (f, indent,
2411 " {\n");
2412 indent += 4;
2413 continue;
2415 else
2416 fprintf_indent (f, indent,
2417 "tree %s = gimple_assign_rhs%u (def_stmt);\n",
2418 child_opname, i + 1);
2420 else
2421 fprintf_indent (f, indent,
2422 "tree %s = gimple_call_arg (def_stmt, %u);\n",
2423 child_opname, i);
2424 fprintf_indent (f, indent,
2425 "if ((%s = do_valueize (valueize, %s)))\n",
2426 child_opname, child_opname);
2427 fprintf_indent (f, indent, " {\n");
2428 indent += 4;
2430 /* While the toplevel operands are canonicalized by the caller
2431 after valueizing operands of sub-expressions we have to
2432 re-canonicalize operand order. */
2433 if (operator_id *code = dyn_cast <operator_id *> (id))
2435 /* ??? We can't canonicalize tcc_comparison operands here
2436 because that requires changing the comparison code which
2437 we already matched... */
2438 if (commutative_tree_code (code->code)
2439 || commutative_ternary_tree_code (code->code))
2441 char child_opname0[20], child_opname1[20];
2442 gen_opname (child_opname0, 0);
2443 gen_opname (child_opname1, 1);
2444 fprintf_indent (f, indent,
2445 "if (tree_swap_operands_p (%s, %s, false))\n",
2446 child_opname0, child_opname1);
2447 fprintf_indent (f, indent,
2448 " std::swap (%s, %s);\n",
2449 child_opname0, child_opname1);
2453 return n_ops;
2456 /* Generate GENERIC matching code for the decision tree operand. */
2458 unsigned
2459 dt_operand::gen_generic_expr (FILE *f, int indent, const char *opname)
2461 expr *e = static_cast<expr *> (op);
2462 unsigned n_ops = e->ops.length ();
2464 for (unsigned i = 0; i < n_ops; ++i)
2466 char child_opname[20];
2467 gen_opname (child_opname, i);
2469 if (e->operation->kind == id_base::CODE)
2470 fprintf_indent (f, indent, "tree %s = TREE_OPERAND (%s, %u);\n",
2471 child_opname, opname, i);
2472 else
2473 fprintf_indent (f, indent, "tree %s = CALL_EXPR_ARG (%s, %u);\n",
2474 child_opname, opname, i);
2477 return 0;
2480 /* Generate matching code for the children of the decision tree node. */
2482 void
2483 dt_node::gen_kids (FILE *f, int indent, bool gimple)
2485 auto_vec<dt_operand *> gimple_exprs;
2486 auto_vec<dt_operand *> generic_exprs;
2487 auto_vec<dt_operand *> fns;
2488 auto_vec<dt_operand *> generic_fns;
2489 auto_vec<dt_operand *> preds;
2490 auto_vec<dt_node *> others;
2492 for (unsigned i = 0; i < kids.length (); ++i)
2494 if (kids[i]->type == dt_node::DT_OPERAND)
2496 dt_operand *op = as_a<dt_operand *> (kids[i]);
2497 if (expr *e = dyn_cast <expr *> (op->op))
2499 if (e->ops.length () == 0
2500 && (!gimple || !(*e->operation == CONSTRUCTOR)))
2501 generic_exprs.safe_push (op);
2502 else if (e->operation->kind == id_base::FN)
2504 if (gimple)
2505 fns.safe_push (op);
2506 else
2507 generic_fns.safe_push (op);
2509 else if (e->operation->kind == id_base::PREDICATE)
2510 preds.safe_push (op);
2511 else
2513 if (gimple)
2514 gimple_exprs.safe_push (op);
2515 else
2516 generic_exprs.safe_push (op);
2519 else if (op->op->type == operand::OP_PREDICATE)
2520 others.safe_push (kids[i]);
2521 else
2522 gcc_unreachable ();
2524 else if (kids[i]->type == dt_node::DT_MATCH
2525 || kids[i]->type == dt_node::DT_SIMPLIFY)
2526 others.safe_push (kids[i]);
2527 else if (kids[i]->type == dt_node::DT_TRUE)
2529 /* A DT_TRUE operand serves as a barrier - generate code now
2530 for what we have collected sofar. */
2531 gen_kids_1 (f, indent, gimple, gimple_exprs, generic_exprs,
2532 fns, generic_fns, preds, others);
2533 /* And output the true operand itself. */
2534 kids[i]->gen (f, indent, gimple);
2535 gimple_exprs.truncate (0);
2536 generic_exprs.truncate (0);
2537 fns.truncate (0);
2538 generic_fns.truncate (0);
2539 preds.truncate (0);
2540 others.truncate (0);
2542 else
2543 gcc_unreachable ();
2546 /* Generate code for the remains. */
2547 gen_kids_1 (f, indent, gimple, gimple_exprs, generic_exprs,
2548 fns, generic_fns, preds, others);
2551 /* Generate matching code for the children of the decision tree node. */
2553 void
2554 dt_node::gen_kids_1 (FILE *f, int indent, bool gimple,
2555 vec<dt_operand *> gimple_exprs,
2556 vec<dt_operand *> generic_exprs,
2557 vec<dt_operand *> fns,
2558 vec<dt_operand *> generic_fns,
2559 vec<dt_operand *> preds,
2560 vec<dt_node *> others)
2562 char buf[128];
2563 char *kid_opname = buf;
2565 unsigned exprs_len = gimple_exprs.length ();
2566 unsigned gexprs_len = generic_exprs.length ();
2567 unsigned fns_len = fns.length ();
2568 unsigned gfns_len = generic_fns.length ();
2570 if (exprs_len || fns_len || gexprs_len || gfns_len)
2572 if (exprs_len)
2573 gimple_exprs[0]->get_name (kid_opname);
2574 else if (fns_len)
2575 fns[0]->get_name (kid_opname);
2576 else if (gfns_len)
2577 generic_fns[0]->get_name (kid_opname);
2578 else
2579 generic_exprs[0]->get_name (kid_opname);
2581 fprintf_indent (f, indent, "switch (TREE_CODE (%s))\n", kid_opname);
2582 fprintf_indent (f, indent, " {\n");
2583 indent += 2;
2586 if (exprs_len || fns_len)
2588 fprintf_indent (f, indent,
2589 "case SSA_NAME:\n");
2590 fprintf_indent (f, indent,
2591 " if (do_valueize (valueize, %s) != NULL_TREE)\n",
2592 kid_opname);
2593 fprintf_indent (f, indent,
2594 " {\n");
2595 fprintf_indent (f, indent,
2596 " gimple def_stmt = SSA_NAME_DEF_STMT (%s);\n",
2597 kid_opname);
2599 indent += 6;
2600 if (exprs_len)
2602 fprintf_indent (f, indent,
2603 "if (is_gimple_assign (def_stmt))\n");
2604 fprintf_indent (f, indent,
2605 " switch (gimple_assign_rhs_code (def_stmt))\n");
2606 indent += 4;
2607 fprintf_indent (f, indent, "{\n");
2608 for (unsigned i = 0; i < exprs_len; ++i)
2610 expr *e = as_a <expr *> (gimple_exprs[i]->op);
2611 id_base *op = e->operation;
2612 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2613 fprintf_indent (f, indent, "CASE_CONVERT:\n");
2614 else
2615 fprintf_indent (f, indent, "case %s:\n", op->id);
2616 fprintf_indent (f, indent, " {\n");
2617 gimple_exprs[i]->gen (f, indent + 4, true);
2618 fprintf_indent (f, indent, " break;\n");
2619 fprintf_indent (f, indent, " }\n");
2621 fprintf_indent (f, indent, "default:;\n");
2622 fprintf_indent (f, indent, "}\n");
2623 indent -= 4;
2626 if (fns_len)
2628 if (exprs_len)
2629 fprintf_indent (f, indent, "else ");
2630 else
2631 fprintf_indent (f, indent, " ");
2633 fprintf (f, "if (gimple_call_builtin_p (def_stmt, BUILT_IN_NORMAL))\n");
2634 fprintf_indent (f, indent,
2635 " {\n");
2636 fprintf_indent (f, indent,
2637 " tree fndecl = gimple_call_fndecl (def_stmt);\n");
2638 fprintf_indent (f, indent,
2639 " switch (DECL_FUNCTION_CODE (fndecl))\n");
2640 fprintf_indent (f, indent,
2641 " {\n");
2643 indent += 6;
2644 for (unsigned i = 0; i < fns_len; ++i)
2646 expr *e = as_a <expr *>(fns[i]->op);
2647 fprintf_indent (f, indent, "case %s:\n", e->operation->id);
2648 fprintf_indent (f, indent, " {\n");
2649 fns[i]->gen (f, indent + 4, true);
2650 fprintf_indent (f, indent, " break;\n");
2651 fprintf_indent (f, indent, " }\n");
2654 fprintf_indent (f, indent, "default:;\n");
2655 fprintf_indent (f, indent, "}\n");
2656 indent -= 6;
2657 fprintf_indent (f, indent, " }\n");
2660 indent -= 6;
2661 fprintf_indent (f, indent, " }\n");
2662 fprintf_indent (f, indent, " break;\n");
2665 for (unsigned i = 0; i < generic_exprs.length (); ++i)
2667 expr *e = as_a <expr *>(generic_exprs[i]->op);
2668 id_base *op = e->operation;
2669 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2670 fprintf_indent (f, indent, "CASE_CONVERT:\n");
2671 else
2672 fprintf_indent (f, indent, "case %s:\n", op->id);
2673 fprintf_indent (f, indent, " {\n");
2674 generic_exprs[i]->gen (f, indent + 4, gimple);
2675 fprintf_indent (f, indent, " break;\n");
2676 fprintf_indent (f, indent, " }\n");
2679 if (gfns_len)
2681 fprintf_indent (f, indent,
2682 "case CALL_EXPR:\n");
2683 fprintf_indent (f, indent,
2684 " {\n");
2685 fprintf_indent (f, indent,
2686 " tree fndecl = get_callee_fndecl (%s);\n",
2687 kid_opname);
2688 fprintf_indent (f, indent,
2689 " if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)\n");
2690 fprintf_indent (f, indent,
2691 " switch (DECL_FUNCTION_CODE (fndecl))\n");
2692 fprintf_indent (f, indent,
2693 " {\n");
2694 indent += 8;
2696 for (unsigned j = 0; j < generic_fns.length (); ++j)
2698 expr *e = as_a <expr *>(generic_fns[j]->op);
2699 gcc_assert (e->operation->kind == id_base::FN);
2701 fprintf_indent (f, indent, "case %s:\n", e->operation->id);
2702 fprintf_indent (f, indent, " {\n");
2703 generic_fns[j]->gen (f, indent + 4, false);
2704 fprintf_indent (f, indent, " break;\n");
2705 fprintf_indent (f, indent, " }\n");
2708 indent -= 8;
2709 fprintf_indent (f, indent, " default:;\n");
2710 fprintf_indent (f, indent, " }\n");
2711 fprintf_indent (f, indent, " break;\n");
2712 fprintf_indent (f, indent, " }\n");
2715 /* Close switch (TREE_CODE ()). */
2716 if (exprs_len || fns_len || gexprs_len || gfns_len)
2718 indent -= 4;
2719 fprintf_indent (f, indent, " default:;\n");
2720 fprintf_indent (f, indent, " }\n");
2723 for (unsigned i = 0; i < preds.length (); ++i)
2725 expr *e = as_a <expr *> (preds[i]->op);
2726 predicate_id *p = as_a <predicate_id *> (e->operation);
2727 preds[i]->get_name (kid_opname);
2728 fprintf_indent (f, indent, "tree %s_pops[%d];\n", kid_opname, p->nargs);
2729 fprintf_indent (f, indent, "if (%s_%s (%s, %s_pops%s))\n",
2730 gimple ? "gimple" : "tree",
2731 p->id, kid_opname, kid_opname,
2732 gimple ? ", valueize" : "");
2733 fprintf_indent (f, indent, " {\n");
2734 for (int j = 0; j < p->nargs; ++j)
2736 char child_opname[20];
2737 preds[i]->gen_opname (child_opname, j);
2738 fprintf_indent (f, indent + 4, "tree %s = %s_pops[%d];\n",
2739 child_opname, kid_opname, j);
2741 preds[i]->gen_kids (f, indent + 4, gimple);
2742 fprintf (f, "}\n");
2745 for (unsigned i = 0; i < others.length (); ++i)
2746 others[i]->gen (f, indent, gimple);
2749 /* Generate matching code for the decision tree operand. */
2751 void
2752 dt_operand::gen (FILE *f, int indent, bool gimple)
2754 char opname[20];
2755 get_name (opname);
2757 unsigned n_braces = 0;
2759 if (type == DT_OPERAND)
2760 switch (op->type)
2762 case operand::OP_PREDICATE:
2763 n_braces = gen_predicate (f, indent, opname, gimple);
2764 break;
2766 case operand::OP_EXPR:
2767 if (gimple)
2768 n_braces = gen_gimple_expr (f, indent);
2769 else
2770 n_braces = gen_generic_expr (f, indent, opname);
2771 break;
2773 default:
2774 gcc_unreachable ();
2776 else if (type == DT_TRUE)
2778 else if (type == DT_MATCH)
2779 n_braces = gen_match_op (f, indent, opname);
2780 else
2781 gcc_unreachable ();
2783 indent += 4 * n_braces;
2784 gen_kids (f, indent, gimple);
2786 for (unsigned i = 0; i < n_braces; ++i)
2788 indent -= 4;
2789 if (indent < 0)
2790 indent = 0;
2791 fprintf_indent (f, indent, " }\n");
2796 /* Generate code for the '(if ...)', '(with ..)' and actual transform
2797 step of a '(simplify ...)' or '(match ...)'. This handles everything
2798 that is not part of the decision tree (simplify->match).
2799 Main recursive worker. */
2801 void
2802 dt_simplify::gen_1 (FILE *f, int indent, bool gimple, operand *result)
2804 if (result)
2806 if (with_expr *w = dyn_cast <with_expr *> (result))
2808 fprintf_indent (f, indent, "{\n");
2809 indent += 4;
2810 output_line_directive (f, w->location);
2811 w->with->gen_transform (f, indent, NULL, true, 1, "type", NULL);
2812 gen_1 (f, indent, gimple, w->subexpr);
2813 indent -= 4;
2814 fprintf_indent (f, indent, "}\n");
2815 return;
2817 else if (if_expr *ife = dyn_cast <if_expr *> (result))
2819 output_line_directive (f, ife->location);
2820 fprintf_indent (f, indent, "if (");
2821 ife->cond->gen_transform (f, indent, NULL, true, 1, "type", NULL);
2822 fprintf (f, ")\n");
2823 fprintf_indent (f, indent + 2, "{\n");
2824 indent += 4;
2825 gen_1 (f, indent, gimple, ife->trueexpr);
2826 indent -= 4;
2827 fprintf_indent (f, indent + 2, "}\n");
2828 if (ife->falseexpr)
2830 fprintf_indent (f, indent, "else\n");
2831 fprintf_indent (f, indent + 2, "{\n");
2832 indent += 4;
2833 gen_1 (f, indent, gimple, ife->falseexpr);
2834 indent -= 4;
2835 fprintf_indent (f, indent + 2, "}\n");
2837 return;
2841 /* Analyze captures and perform early-outs on the incoming arguments
2842 that cover cases we cannot handle. */
2843 capture_info cinfo (s, result, gimple);
2844 if (s->kind == simplify::SIMPLIFY)
2846 if (!gimple)
2848 for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
2849 if (cinfo.force_no_side_effects & (1 << i))
2851 fprintf_indent (f, indent,
2852 "if (TREE_SIDE_EFFECTS (op%d)) return NULL_TREE;\n",
2854 if (verbose >= 1)
2855 warning_at (as_a <expr *> (s->match)->ops[i]->location,
2856 "forcing toplevel operand to have no "
2857 "side-effects");
2859 for (int i = 0; i <= s->capture_max; ++i)
2860 if (cinfo.info[i].cse_p)
2862 else if (cinfo.info[i].force_no_side_effects_p
2863 && (cinfo.info[i].toplevel_msk
2864 & cinfo.force_no_side_effects) == 0)
2866 fprintf_indent (f, indent,
2867 "if (TREE_SIDE_EFFECTS (captures[%d])) "
2868 "return NULL_TREE;\n", i);
2869 if (verbose >= 1)
2870 warning_at (cinfo.info[i].c->location,
2871 "forcing captured operand to have no "
2872 "side-effects");
2874 else if ((cinfo.info[i].toplevel_msk
2875 & cinfo.force_no_side_effects) != 0)
2876 /* Mark capture as having no side-effects if we had to verify
2877 that via forced toplevel operand checks. */
2878 cinfo.info[i].force_no_side_effects_p = true;
2880 if (gimple)
2882 /* Force single-use restriction by only allowing simple
2883 results via setting seq to NULL. */
2884 fprintf_indent (f, indent, "gimple_seq *lseq = seq;\n");
2885 bool first_p = true;
2886 for (int i = 0; i <= s->capture_max; ++i)
2887 if (cinfo.info[i].force_single_use)
2889 if (first_p)
2891 fprintf_indent (f, indent, "if (lseq\n");
2892 fprintf_indent (f, indent, " && (");
2893 first_p = false;
2895 else
2897 fprintf (f, "\n");
2898 fprintf_indent (f, indent, " || ");
2900 fprintf (f, "!single_use (captures[%d])", i);
2902 if (!first_p)
2904 fprintf (f, "))\n");
2905 fprintf_indent (f, indent, " lseq = NULL;\n");
2910 fprintf_indent (f, indent, "if (dump_file && (dump_flags & TDF_DETAILS)) "
2911 "fprintf (dump_file, \"Applying pattern ");
2912 output_line_directive (f,
2913 result ? result->location : s->match->location, true);
2914 fprintf (f, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
2916 if (!result)
2918 /* If there is no result then this is a predicate implementation. */
2919 fprintf_indent (f, indent, "return true;\n");
2921 else if (gimple)
2923 /* For GIMPLE simply drop NON_LVALUE_EXPR (which only appears
2924 in outermost position). */
2925 if (result->type == operand::OP_EXPR
2926 && *as_a <expr *> (result)->operation == NON_LVALUE_EXPR)
2927 result = as_a <expr *> (result)->ops[0];
2928 if (result->type == operand::OP_EXPR)
2930 expr *e = as_a <expr *> (result);
2931 id_base *opr = e->operation;
2932 bool is_predicate = false;
2933 /* When we delay operator substituting during lowering of fors we
2934 make sure that for code-gen purposes the effects of each substitute
2935 are the same. Thus just look at that. */
2936 if (user_id *uid = dyn_cast <user_id *> (opr))
2937 opr = uid->substitutes[0];
2938 else if (is_a <predicate_id *> (opr))
2939 is_predicate = true;
2940 if (!is_predicate)
2941 fprintf_indent (f, indent, "*res_code = %s;\n",
2942 *e->operation == CONVERT_EXPR
2943 ? "NOP_EXPR" : e->operation->id);
2944 for (unsigned j = 0; j < e->ops.length (); ++j)
2946 char dest[32];
2947 snprintf (dest, 32, "res_ops[%d]", j);
2948 const char *optype
2949 = get_operand_type (opr,
2950 "type", e->expr_type,
2951 j == 0 ? NULL : "TREE_TYPE (res_ops[0])");
2952 /* We need to expand GENERIC conditions we captured from
2953 COND_EXPRs. */
2954 bool expand_generic_cond_exprs_p
2955 = (!is_predicate
2956 /* But avoid doing that if the GENERIC condition is
2957 valid - which it is in the first operand of COND_EXPRs
2958 and VEC_COND_EXRPs. */
2959 && ((!(*opr == COND_EXPR)
2960 && !(*opr == VEC_COND_EXPR))
2961 || j != 0));
2962 e->ops[j]->gen_transform (f, indent, dest, true, 1, optype,
2963 &cinfo,
2964 indexes, expand_generic_cond_exprs_p);
2967 /* Re-fold the toplevel result. It's basically an embedded
2968 gimple_build w/o actually building the stmt. */
2969 if (!is_predicate)
2970 fprintf_indent (f, indent,
2971 "gimple_resimplify%d (lseq, res_code, type, "
2972 "res_ops, valueize);\n", e->ops.length ());
2974 else if (result->type == operand::OP_CAPTURE
2975 || result->type == operand::OP_C_EXPR)
2977 result->gen_transform (f, indent, "res_ops[0]", true, 1, "type",
2978 &cinfo, indexes, false);
2979 fprintf_indent (f, indent, "*res_code = TREE_CODE (res_ops[0]);\n");
2980 if (is_a <capture *> (result)
2981 && cinfo.info[as_a <capture *> (result)->where].cond_expr_cond_p)
2983 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
2984 with substituting a capture of that. */
2985 fprintf_indent (f, indent,
2986 "if (COMPARISON_CLASS_P (res_ops[0]))\n");
2987 fprintf_indent (f, indent,
2988 " {\n");
2989 fprintf_indent (f, indent,
2990 " tree tem = res_ops[0];\n");
2991 fprintf_indent (f, indent,
2992 " res_ops[0] = TREE_OPERAND (tem, 0);\n");
2993 fprintf_indent (f, indent,
2994 " res_ops[1] = TREE_OPERAND (tem, 1);\n");
2995 fprintf_indent (f, indent,
2996 " }\n");
2999 else
3000 gcc_unreachable ();
3001 fprintf_indent (f, indent, "return true;\n");
3003 else /* GENERIC */
3005 bool is_predicate = false;
3006 if (result->type == operand::OP_EXPR)
3008 expr *e = as_a <expr *> (result);
3009 id_base *opr = e->operation;
3010 /* When we delay operator substituting during lowering of fors we
3011 make sure that for code-gen purposes the effects of each substitute
3012 are the same. Thus just look at that. */
3013 if (user_id *uid = dyn_cast <user_id *> (opr))
3014 opr = uid->substitutes[0];
3015 else if (is_a <predicate_id *> (opr))
3016 is_predicate = true;
3017 /* Search for captures used multiple times in the result expression
3018 and dependent on TREE_SIDE_EFFECTS emit a SAVE_EXPR. */
3019 if (!is_predicate)
3020 for (int i = 0; i < s->capture_max + 1; ++i)
3022 if (cinfo.info[i].same_as != (unsigned)i)
3023 continue;
3024 if (!cinfo.info[i].force_no_side_effects_p
3025 && cinfo.info[i].result_use_count > 1)
3027 fprintf_indent (f, indent,
3028 "if (TREE_SIDE_EFFECTS (captures[%d]))\n",
3030 fprintf_indent (f, indent,
3031 " captures[%d] = save_expr (captures[%d]);\n",
3032 i, i);
3035 for (unsigned j = 0; j < e->ops.length (); ++j)
3037 char dest[32];
3038 if (is_predicate)
3039 snprintf (dest, 32, "res_ops[%d]", j);
3040 else
3042 fprintf_indent (f, indent, "tree res_op%d;\n", j);
3043 snprintf (dest, 32, "res_op%d", j);
3045 const char *optype
3046 = get_operand_type (opr,
3047 "type", e->expr_type,
3048 j == 0
3049 ? NULL : "TREE_TYPE (res_op0)");
3050 e->ops[j]->gen_transform (f, indent, dest, false, 1, optype,
3051 &cinfo, indexes);
3053 if (is_predicate)
3054 fprintf_indent (f, indent, "return true;\n");
3055 else
3057 fprintf_indent (f, indent, "tree res;\n");
3058 /* Re-fold the toplevel result. Use non_lvalue to
3059 build NON_LVALUE_EXPRs so they get properly
3060 ignored when in GIMPLE form. */
3061 if (*opr == NON_LVALUE_EXPR)
3062 fprintf_indent (f, indent,
3063 "res = non_lvalue_loc (loc, res_op0);\n");
3064 else
3066 if (is_a <operator_id *> (opr))
3067 fprintf_indent (f, indent,
3068 "res = fold_build%d_loc (loc, %s, type",
3069 e->ops.length (),
3070 *e->operation == CONVERT_EXPR
3071 ? "NOP_EXPR" : e->operation->id);
3072 else
3073 fprintf_indent (f, indent,
3074 "res = build_call_expr_loc "
3075 "(loc, builtin_decl_implicit (%s), %d",
3076 e->operation->id, e->ops.length());
3077 for (unsigned j = 0; j < e->ops.length (); ++j)
3078 fprintf (f, ", res_op%d", j);
3079 fprintf (f, ");\n");
3083 else if (result->type == operand::OP_CAPTURE
3084 || result->type == operand::OP_C_EXPR)
3087 fprintf_indent (f, indent, "tree res;\n");
3088 result->gen_transform (f, indent, "res", false, 1, "type",
3089 &cinfo, indexes);
3091 else
3092 gcc_unreachable ();
3093 if (!is_predicate)
3095 /* Search for captures not used in the result expression and dependent
3096 on TREE_SIDE_EFFECTS emit omit_one_operand. */
3097 for (int i = 0; i < s->capture_max + 1; ++i)
3099 if (cinfo.info[i].same_as != (unsigned)i)
3100 continue;
3101 if (!cinfo.info[i].force_no_side_effects_p
3102 && !cinfo.info[i].expr_p
3103 && cinfo.info[i].result_use_count == 0)
3105 fprintf_indent (f, indent,
3106 "if (TREE_SIDE_EFFECTS (captures[%d]))\n",
3108 fprintf_indent (f, indent + 2,
3109 "res = build2_loc (loc, COMPOUND_EXPR, type, "
3110 "fold_ignored_result (captures[%d]), res);\n",
3114 fprintf_indent (f, indent, "return res;\n");
3119 /* Generate code for the '(if ...)', '(with ..)' and actual transform
3120 step of a '(simplify ...)' or '(match ...)'. This handles everything
3121 that is not part of the decision tree (simplify->match). */
3123 void
3124 dt_simplify::gen (FILE *f, int indent, bool gimple)
3126 fprintf_indent (f, indent, "{\n");
3127 indent += 2;
3128 output_line_directive (f,
3129 s->result ? s->result->location : s->match->location);
3130 if (s->capture_max >= 0)
3132 char opname[20];
3133 fprintf_indent (f, indent, "tree captures[%u] ATTRIBUTE_UNUSED = { %s",
3134 s->capture_max + 1, indexes[0]->get_name (opname));
3136 for (int i = 1; i <= s->capture_max; ++i)
3137 fprintf (f, ", %s", indexes[i]->get_name (opname));
3138 fprintf (f, " };\n");
3141 /* If we have a split-out function for the actual transform, call it. */
3142 if (info && info->fname)
3144 if (gimple)
3146 fprintf_indent (f, indent, "if (%s (res_code, res_ops, seq, "
3147 "valueize, type, captures", info->fname);
3148 for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3149 fprintf (f, ", %s", s->for_subst_vec[i].second->id);
3150 fprintf (f, "))\n");
3151 fprintf_indent (f, indent, " return true;\n");
3153 else
3155 fprintf_indent (f, indent, "tree res = %s (loc, type",
3156 info->fname);
3157 for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
3158 fprintf (f, ", op%d", i);
3159 fprintf (f, ", captures");
3160 for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3161 fprintf (f, ", %s", s->for_subst_vec[i].second->id);
3162 fprintf (f, ");\n");
3163 fprintf_indent (f, indent, "if (res) return res;\n");
3166 else
3168 for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3170 if (is_a <operator_id *> (s->for_subst_vec[i].second))
3171 fprintf_indent (f, indent, "enum tree_code %s = %s;\n",
3172 s->for_subst_vec[i].first->id,
3173 s->for_subst_vec[i].second->id);
3174 else if (is_a <fn_id *> (s->for_subst_vec[i].second))
3175 fprintf_indent (f, indent, "enum built_in_function %s = %s;\n",
3176 s->for_subst_vec[i].first->id,
3177 s->for_subst_vec[i].second->id);
3178 else
3179 gcc_unreachable ();
3181 gen_1 (f, indent, gimple, s->result);
3184 indent -= 2;
3185 fprintf_indent (f, indent, "}\n");
3189 /* Hash function for finding equivalent transforms. */
3191 hashval_t
3192 sinfo_hashmap_traits::hash (const key_type &v)
3194 /* Only bother to compare those originating from the same source pattern. */
3195 return v->s->result->location;
3198 /* Compare function for finding equivalent transforms. */
3200 static bool
3201 compare_op (operand *o1, simplify *s1, operand *o2, simplify *s2)
3203 if (o1->type != o2->type)
3204 return false;
3206 switch (o1->type)
3208 case operand::OP_IF:
3210 if_expr *if1 = as_a <if_expr *> (o1);
3211 if_expr *if2 = as_a <if_expr *> (o2);
3212 /* ??? Properly compare c-exprs. */
3213 if (if1->cond != if2->cond)
3214 return false;
3215 if (!compare_op (if1->trueexpr, s1, if2->trueexpr, s2))
3216 return false;
3217 if (if1->falseexpr != if2->falseexpr
3218 || (if1->falseexpr
3219 && !compare_op (if1->falseexpr, s1, if2->falseexpr, s2)))
3220 return false;
3221 return true;
3223 case operand::OP_WITH:
3225 with_expr *with1 = as_a <with_expr *> (o1);
3226 with_expr *with2 = as_a <with_expr *> (o2);
3227 if (with1->with != with2->with)
3228 return false;
3229 return compare_op (with1->subexpr, s1, with2->subexpr, s2);
3231 default:;
3234 /* We've hit a result. Time to compare capture-infos - this is required
3235 in addition to the conservative pointer-equivalency of the result IL. */
3236 capture_info cinfo1 (s1, o1, true);
3237 capture_info cinfo2 (s2, o2, true);
3239 if (cinfo1.force_no_side_effects != cinfo2.force_no_side_effects
3240 || cinfo1.info.length () != cinfo2.info.length ())
3241 return false;
3243 for (unsigned i = 0; i < cinfo1.info.length (); ++i)
3245 if (cinfo1.info[i].expr_p != cinfo2.info[i].expr_p
3246 || cinfo1.info[i].cse_p != cinfo2.info[i].cse_p
3247 || (cinfo1.info[i].force_no_side_effects_p
3248 != cinfo2.info[i].force_no_side_effects_p)
3249 || cinfo1.info[i].force_single_use != cinfo2.info[i].force_single_use
3250 || cinfo1.info[i].cond_expr_cond_p != cinfo2.info[i].cond_expr_cond_p
3251 /* toplevel_msk is an optimization */
3252 || cinfo1.info[i].result_use_count != cinfo2.info[i].result_use_count
3253 || cinfo1.info[i].same_as != cinfo2.info[i].same_as
3254 /* the pointer back to the capture is for diagnostics only */)
3255 return false;
3258 /* ??? Deep-compare the actual result. */
3259 return o1 == o2;
3262 bool
3263 sinfo_hashmap_traits::equal_keys (const key_type &v,
3264 const key_type &candidate)
3266 return compare_op (v->s->result, v->s, candidate->s->result, candidate->s);
3270 /* Main entry to generate code for matching GIMPLE IL off the decision
3271 tree. */
3273 void
3274 decision_tree::gen (FILE *f, bool gimple)
3276 sinfo_map_t si;
3278 root->analyze (si);
3280 fprintf (stderr, "%s decision tree has %u leafs, maximum depth %u and "
3281 "a total number of %u nodes\n",
3282 gimple ? "GIMPLE" : "GENERIC",
3283 root->num_leafs, root->max_level, root->total_size);
3285 /* First split out the transform part of equal leafs. */
3286 unsigned rcnt = 0;
3287 unsigned fcnt = 1;
3288 for (sinfo_map_t::iterator iter = si.begin ();
3289 iter != si.end (); ++iter)
3291 sinfo *s = (*iter).second;
3292 /* Do not split out single uses. */
3293 if (s->cnt <= 1)
3294 continue;
3296 rcnt += s->cnt - 1;
3297 if (verbose >= 1)
3299 fprintf (stderr, "found %u uses of", s->cnt);
3300 output_line_directive (stderr, s->s->s->result->location);
3303 /* Generate a split out function with the leaf transform code. */
3304 s->fname = xasprintf ("%s_simplify_%u", gimple ? "gimple" : "generic",
3305 fcnt++);
3306 if (gimple)
3307 fprintf (f, "\nstatic bool\n"
3308 "%s (code_helper *res_code, tree *res_ops,\n"
3309 " gimple_seq *seq, tree (*valueize)(tree) "
3310 "ATTRIBUTE_UNUSED,\n"
3311 " tree ARG_UNUSED (type), tree *ARG_UNUSED "
3312 "(captures)\n",
3313 s->fname);
3314 else
3316 fprintf (f, "\nstatic tree\n"
3317 "%s (location_t ARG_UNUSED (loc), tree ARG_UNUSED (type),\n",
3318 (*iter).second->fname);
3319 for (unsigned i = 0;
3320 i < as_a <expr *>(s->s->s->match)->ops.length (); ++i)
3321 fprintf (f, " tree ARG_UNUSED (op%d),", i);
3322 fprintf (f, " tree *captures\n");
3324 for (unsigned i = 0; i < s->s->s->for_subst_vec.length (); ++i)
3326 if (is_a <operator_id *> (s->s->s->for_subst_vec[i].second))
3327 fprintf (f, ", enum tree_code ARG_UNUSED (%s)",
3328 s->s->s->for_subst_vec[i].first->id);
3329 else if (is_a <fn_id *> (s->s->s->for_subst_vec[i].second))
3330 fprintf (f, ", enum built_in_function ARG_UNUSED (%s)",
3331 s->s->s->for_subst_vec[i].first->id);
3334 fprintf (f, ")\n{\n");
3335 s->s->gen_1 (f, 2, gimple, s->s->s->result);
3336 if (gimple)
3337 fprintf (f, " return false;\n");
3338 else
3339 fprintf (f, " return NULL_TREE;\n");
3340 fprintf (f, "}\n");
3342 fprintf (stderr, "removed %u duplicate tails\n", rcnt);
3344 for (unsigned n = 1; n <= 3; ++n)
3346 /* First generate split-out functions. */
3347 for (unsigned i = 0; i < root->kids.length (); i++)
3349 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
3350 expr *e = static_cast<expr *>(dop->op);
3351 if (e->ops.length () != n
3352 /* Builtin simplifications are somewhat premature on
3353 GENERIC. The following drops patterns with outermost
3354 calls. It's easy to emit overloads for function code
3355 though if necessary. */
3356 || (!gimple
3357 && e->operation->kind != id_base::CODE))
3358 continue;
3360 if (gimple)
3361 fprintf (f, "\nstatic bool\n"
3362 "gimple_simplify_%s (code_helper *res_code, tree *res_ops,\n"
3363 " gimple_seq *seq, tree (*valueize)(tree) "
3364 "ATTRIBUTE_UNUSED,\n"
3365 " code_helper ARG_UNUSED (code), tree "
3366 "ARG_UNUSED (type)\n",
3367 e->operation->id);
3368 else
3369 fprintf (f, "\nstatic tree\n"
3370 "generic_simplify_%s (location_t ARG_UNUSED (loc), enum "
3371 "tree_code ARG_UNUSED (code), tree ARG_UNUSED (type)",
3372 e->operation->id);
3373 for (unsigned i = 0; i < n; ++i)
3374 fprintf (f, ", tree op%d", i);
3375 fprintf (f, ")\n");
3376 fprintf (f, "{\n");
3377 dop->gen_kids (f, 2, gimple);
3378 if (gimple)
3379 fprintf (f, " return false;\n");
3380 else
3381 fprintf (f, " return NULL_TREE;\n");
3382 fprintf (f, "}\n");
3385 /* Then generate the main entry with the outermost switch and
3386 tail-calls to the split-out functions. */
3387 if (gimple)
3388 fprintf (f, "\nstatic bool\n"
3389 "gimple_simplify (code_helper *res_code, tree *res_ops,\n"
3390 " gimple_seq *seq, tree (*valueize)(tree),\n"
3391 " code_helper code, tree type");
3392 else
3393 fprintf (f, "\ntree\n"
3394 "generic_simplify (location_t loc, enum tree_code code, "
3395 "tree type ATTRIBUTE_UNUSED");
3396 for (unsigned i = 0; i < n; ++i)
3397 fprintf (f, ", tree op%d", i);
3398 fprintf (f, ")\n");
3399 fprintf (f, "{\n");
3401 if (gimple)
3402 fprintf (f, " switch (code.get_rep())\n"
3403 " {\n");
3404 else
3405 fprintf (f, " switch (code)\n"
3406 " {\n");
3407 for (unsigned i = 0; i < root->kids.length (); i++)
3409 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
3410 expr *e = static_cast<expr *>(dop->op);
3411 if (e->ops.length () != n
3412 /* Builtin simplifications are somewhat premature on
3413 GENERIC. The following drops patterns with outermost
3414 calls. It's easy to emit overloads for function code
3415 though if necessary. */
3416 || (!gimple
3417 && e->operation->kind != id_base::CODE))
3418 continue;
3420 if (*e->operation == CONVERT_EXPR
3421 || *e->operation == NOP_EXPR)
3422 fprintf (f, " CASE_CONVERT:\n");
3423 else
3424 fprintf (f, " case %s%s:\n",
3425 is_a <fn_id *> (e->operation) ? "-" : "",
3426 e->operation->id);
3427 if (gimple)
3428 fprintf (f, " return gimple_simplify_%s (res_code, res_ops, "
3429 "seq, valueize, code, type", e->operation->id);
3430 else
3431 fprintf (f, " return generic_simplify_%s (loc, code, type",
3432 e->operation->id);
3433 for (unsigned i = 0; i < n; ++i)
3434 fprintf (f, ", op%d", i);
3435 fprintf (f, ");\n");
3437 fprintf (f, " default:;\n"
3438 " }\n");
3440 if (gimple)
3441 fprintf (f, " return false;\n");
3442 else
3443 fprintf (f, " return NULL_TREE;\n");
3444 fprintf (f, "}\n");
3448 /* Output code to implement the predicate P from the decision tree DT. */
3450 void
3451 write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple)
3453 fprintf (f, "\nbool\n"
3454 "%s%s (tree t%s%s)\n"
3455 "{\n", gimple ? "gimple_" : "tree_", p->id,
3456 p->nargs > 0 ? ", tree *res_ops" : "",
3457 gimple ? ", tree (*valueize)(tree)" : "");
3458 /* Conveniently make 'type' available. */
3459 fprintf_indent (f, 2, "tree type = TREE_TYPE (t);\n");
3461 if (!gimple)
3462 fprintf_indent (f, 2, "if (TREE_SIDE_EFFECTS (t)) return false;\n");
3463 dt.root->gen_kids (f, 2, gimple);
3465 fprintf_indent (f, 2, "return false;\n"
3466 "}\n");
3469 /* Write the common header for the GIMPLE/GENERIC IL matching routines. */
3471 static void
3472 write_header (FILE *f, const char *head)
3474 fprintf (f, "/* Generated automatically by the program `genmatch' from\n");
3475 fprintf (f, " a IL pattern matching and simplification description. */\n");
3477 /* Include the header instead of writing it awkwardly quoted here. */
3478 fprintf (f, "\n#include \"%s\"\n", head);
3483 /* AST parsing. */
3485 class parser
3487 public:
3488 parser (cpp_reader *);
3490 private:
3491 const cpp_token *next ();
3492 const cpp_token *peek (unsigned = 1);
3493 const cpp_token *peek_ident (const char * = NULL, unsigned = 1);
3494 const cpp_token *expect (enum cpp_ttype);
3495 const cpp_token *eat_token (enum cpp_ttype);
3496 const char *get_string ();
3497 const char *get_ident ();
3498 const cpp_token *eat_ident (const char *);
3499 const char *get_number ();
3501 id_base *parse_operation ();
3502 operand *parse_capture (operand *, bool);
3503 operand *parse_expr ();
3504 c_expr *parse_c_expr (cpp_ttype);
3505 operand *parse_op ();
3507 void record_operlist (source_location, user_id *);
3509 void parse_pattern ();
3510 operand *parse_result (operand *, predicate_id *);
3511 void push_simplify (simplify::simplify_kind,
3512 vec<simplify *>&, operand *, operand *);
3513 void parse_simplify (simplify::simplify_kind,
3514 vec<simplify *>&, predicate_id *, operand *);
3515 void parse_for (source_location);
3516 void parse_if (source_location);
3517 void parse_predicates (source_location);
3518 void parse_operator_list (source_location);
3520 cpp_reader *r;
3521 vec<c_expr *> active_ifs;
3522 vec<vec<user_id *> > active_fors;
3523 hash_set<user_id *> *oper_lists_set;
3524 vec<user_id *> oper_lists;
3526 cid_map_t *capture_ids;
3528 public:
3529 vec<simplify *> simplifiers;
3530 vec<predicate_id *> user_predicates;
3531 bool parsing_match_operand;
3534 /* Lexing helpers. */
3536 /* Read the next non-whitespace token from R. */
3538 const cpp_token *
3539 parser::next ()
3541 const cpp_token *token;
3544 token = cpp_get_token (r);
3546 while (token->type == CPP_PADDING
3547 && token->type != CPP_EOF);
3548 return token;
3551 /* Peek at the next non-whitespace token from R. */
3553 const cpp_token *
3554 parser::peek (unsigned num)
3556 const cpp_token *token;
3557 unsigned i = 0;
3560 token = cpp_peek_token (r, i++);
3562 while ((token->type == CPP_PADDING
3563 && token->type != CPP_EOF)
3564 || (--num > 0));
3565 /* If we peek at EOF this is a fatal error as it leaves the
3566 cpp_reader in unusable state. Assume we really wanted a
3567 token and thus this EOF is unexpected. */
3568 if (token->type == CPP_EOF)
3569 fatal_at (token, "unexpected end of file");
3570 return token;
3573 /* Peek at the next identifier token (or return NULL if the next
3574 token is not an identifier or equal to ID if supplied). */
3576 const cpp_token *
3577 parser::peek_ident (const char *id, unsigned num)
3579 const cpp_token *token = peek (num);
3580 if (token->type != CPP_NAME)
3581 return 0;
3583 if (id == 0)
3584 return token;
3586 const char *t = (const char *) CPP_HASHNODE (token->val.node.node)->ident.str;
3587 if (strcmp (id, t) == 0)
3588 return token;
3590 return 0;
3593 /* Read the next token from R and assert it is of type TK. */
3595 const cpp_token *
3596 parser::expect (enum cpp_ttype tk)
3598 const cpp_token *token = next ();
3599 if (token->type != tk)
3600 fatal_at (token, "expected %s, got %s",
3601 cpp_type2name (tk, 0), cpp_type2name (token->type, 0));
3603 return token;
3606 /* Consume the next token from R and assert it is of type TK. */
3608 const cpp_token *
3609 parser::eat_token (enum cpp_ttype tk)
3611 return expect (tk);
3614 /* Read the next token from R and assert it is of type CPP_STRING and
3615 return its value. */
3617 const char *
3618 parser::get_string ()
3620 const cpp_token *token = expect (CPP_STRING);
3621 return (const char *)token->val.str.text;
3624 /* Read the next token from R and assert it is of type CPP_NAME and
3625 return its value. */
3627 const char *
3628 parser::get_ident ()
3630 const cpp_token *token = expect (CPP_NAME);
3631 return (const char *)CPP_HASHNODE (token->val.node.node)->ident.str;
3634 /* Eat an identifier token with value S from R. */
3636 const cpp_token *
3637 parser::eat_ident (const char *s)
3639 const cpp_token *token = peek ();
3640 const char *t = get_ident ();
3641 if (strcmp (s, t) != 0)
3642 fatal_at (token, "expected '%s' got '%s'\n", s, t);
3643 return token;
3646 /* Read the next token from R and assert it is of type CPP_NUMBER and
3647 return its value. */
3649 const char *
3650 parser::get_number ()
3652 const cpp_token *token = expect (CPP_NUMBER);
3653 return (const char *)token->val.str.text;
3657 /* Record an operator-list use for transparent for handling. */
3659 void
3660 parser::record_operlist (source_location loc, user_id *p)
3662 if (!oper_lists_set->add (p))
3664 if (!oper_lists.is_empty ()
3665 && oper_lists[0]->substitutes.length () != p->substitutes.length ())
3666 fatal_at (loc, "User-defined operator list does not have the "
3667 "same number of entries as others used in the pattern");
3668 oper_lists.safe_push (p);
3672 /* Parse the operator ID, special-casing convert?, convert1? and
3673 convert2? */
3675 id_base *
3676 parser::parse_operation ()
3678 const cpp_token *id_tok = peek ();
3679 const char *id = get_ident ();
3680 const cpp_token *token = peek ();
3681 if (strcmp (id, "convert0") == 0)
3682 fatal_at (id_tok, "use 'convert?' here");
3683 else if (strcmp (id, "view_convert0") == 0)
3684 fatal_at (id_tok, "use 'view_convert?' here");
3685 if (token->type == CPP_QUERY
3686 && !(token->flags & PREV_WHITE))
3688 if (strcmp (id, "convert") == 0)
3689 id = "convert0";
3690 else if (strcmp (id, "convert1") == 0)
3692 else if (strcmp (id, "convert2") == 0)
3694 else if (strcmp (id, "view_convert") == 0)
3695 id = "view_convert0";
3696 else if (strcmp (id, "view_convert1") == 0)
3698 else if (strcmp (id, "view_convert2") == 0)
3700 else
3701 fatal_at (id_tok, "non-convert operator conditionalized");
3703 if (!parsing_match_operand)
3704 fatal_at (id_tok, "conditional convert can only be used in "
3705 "match expression");
3706 eat_token (CPP_QUERY);
3708 else if (strcmp (id, "convert1") == 0
3709 || strcmp (id, "convert2") == 0
3710 || strcmp (id, "view_convert1") == 0
3711 || strcmp (id, "view_convert2") == 0)
3712 fatal_at (id_tok, "expected '?' after conditional operator");
3713 id_base *op = get_operator (id);
3714 if (!op)
3715 fatal_at (id_tok, "unknown operator %s", id);
3717 user_id *p = dyn_cast<user_id *> (op);
3718 if (p && p->is_oper_list)
3720 if (active_fors.length() == 0)
3721 record_operlist (id_tok->src_loc, p);
3722 else
3723 fatal_at (id_tok, "operator-list %s cannot be exapnded inside 'for'", id);
3725 return op;
3728 /* Parse a capture.
3729 capture = '@'<number> */
3731 struct operand *
3732 parser::parse_capture (operand *op, bool require_existing)
3734 source_location src_loc = eat_token (CPP_ATSIGN)->src_loc;
3735 const cpp_token *token = peek ();
3736 const char *id = NULL;
3737 if (token->type == CPP_NUMBER)
3738 id = get_number ();
3739 else if (token->type == CPP_NAME)
3740 id = get_ident ();
3741 else
3742 fatal_at (token, "expected number or identifier");
3743 unsigned next_id = capture_ids->elements ();
3744 bool existed;
3745 unsigned &num = capture_ids->get_or_insert (id, &existed);
3746 if (!existed)
3748 if (require_existing)
3749 fatal_at (src_loc, "unknown capture id");
3750 num = next_id;
3752 return new capture (src_loc, num, op);
3755 /* Parse an expression
3756 expr = '(' <operation>[capture][flag][type] <operand>... ')' */
3758 struct operand *
3759 parser::parse_expr ()
3761 const cpp_token *token = peek ();
3762 expr *e = new expr (parse_operation (), token->src_loc);
3763 token = peek ();
3764 operand *op;
3765 bool is_commutative = false;
3766 bool force_capture = false;
3767 const char *expr_type = NULL;
3769 if (token->type == CPP_COLON
3770 && !(token->flags & PREV_WHITE))
3772 eat_token (CPP_COLON);
3773 token = peek ();
3774 if (token->type == CPP_NAME
3775 && !(token->flags & PREV_WHITE))
3777 const char *s = get_ident ();
3778 if (!parsing_match_operand)
3779 expr_type = s;
3780 else
3782 const char *sp = s;
3783 while (*sp)
3785 if (*sp == 'c')
3786 is_commutative = true;
3787 else if (*sp == 's')
3789 e->force_single_use = true;
3790 force_capture = true;
3792 else
3793 fatal_at (token, "flag %c not recognized", *sp);
3794 sp++;
3797 token = peek ();
3799 else
3800 fatal_at (token, "expected flag or type specifying identifier");
3803 if (token->type == CPP_ATSIGN
3804 && !(token->flags & PREV_WHITE))
3805 op = parse_capture (e, !parsing_match_operand);
3806 else if (force_capture)
3808 unsigned num = capture_ids->elements ();
3809 char id[8];
3810 bool existed;
3811 sprintf (id, "__%u", num);
3812 capture_ids->get_or_insert (xstrdup (id), &existed);
3813 if (existed)
3814 fatal_at (token, "reserved capture id '%s' already used", id);
3815 op = new capture (token->src_loc, num, e);
3817 else
3818 op = e;
3821 const cpp_token *token = peek ();
3822 if (token->type == CPP_CLOSE_PAREN)
3824 if (e->operation->nargs != -1
3825 && e->operation->nargs != (int) e->ops.length ())
3826 fatal_at (token, "'%s' expects %u operands, not %u",
3827 e->operation->id, e->operation->nargs, e->ops.length ());
3828 if (is_commutative)
3830 if (e->ops.length () == 2)
3831 e->is_commutative = true;
3832 else
3833 fatal_at (token, "only binary operators or function with "
3834 "two arguments can be marked commutative");
3836 e->expr_type = expr_type;
3837 return op;
3839 e->append_op (parse_op ());
3841 while (1);
3844 /* Lex native C code delimited by START recording the preprocessing tokens
3845 for later processing.
3846 c_expr = ('{'|'(') <pp token>... ('}'|')') */
3848 c_expr *
3849 parser::parse_c_expr (cpp_ttype start)
3851 const cpp_token *token;
3852 cpp_ttype end;
3853 unsigned opencnt;
3854 vec<cpp_token> code = vNULL;
3855 unsigned nr_stmts = 0;
3856 source_location loc = eat_token (start)->src_loc;
3857 if (start == CPP_OPEN_PAREN)
3858 end = CPP_CLOSE_PAREN;
3859 else if (start == CPP_OPEN_BRACE)
3860 end = CPP_CLOSE_BRACE;
3861 else
3862 gcc_unreachable ();
3863 opencnt = 1;
3866 token = next ();
3868 /* Count brace pairs to find the end of the expr to match. */
3869 if (token->type == start)
3870 opencnt++;
3871 else if (token->type == end
3872 && --opencnt == 0)
3873 break;
3875 /* This is a lame way of counting the number of statements. */
3876 if (token->type == CPP_SEMICOLON)
3877 nr_stmts++;
3879 /* If this is possibly a user-defined identifier mark it used. */
3880 if (token->type == CPP_NAME)
3882 id_base *idb = get_operator ((const char *)CPP_HASHNODE
3883 (token->val.node.node)->ident.str);
3884 user_id *p;
3885 if (idb && (p = dyn_cast<user_id *> (idb)) && p->is_oper_list)
3886 record_operlist (token->src_loc, p);
3889 /* Record the token. */
3890 code.safe_push (*token);
3892 while (1);
3893 return new c_expr (r, loc, code, nr_stmts, vNULL, capture_ids);
3896 /* Parse an operand which is either an expression, a predicate or
3897 a standalone capture.
3898 op = predicate | expr | c_expr | capture */
3900 struct operand *
3901 parser::parse_op ()
3903 const cpp_token *token = peek ();
3904 struct operand *op = NULL;
3905 if (token->type == CPP_OPEN_PAREN)
3907 eat_token (CPP_OPEN_PAREN);
3908 op = parse_expr ();
3909 eat_token (CPP_CLOSE_PAREN);
3911 else if (token->type == CPP_OPEN_BRACE)
3913 op = parse_c_expr (CPP_OPEN_BRACE);
3915 else
3917 /* Remaining ops are either empty or predicates */
3918 if (token->type == CPP_NAME)
3920 const char *id = get_ident ();
3921 id_base *opr = get_operator (id);
3922 if (!opr)
3923 fatal_at (token, "expected predicate name");
3924 if (operator_id *code = dyn_cast <operator_id *> (opr))
3926 if (code->nargs != 0)
3927 fatal_at (token, "using an operator with operands as predicate");
3928 /* Parse the zero-operand operator "predicates" as
3929 expression. */
3930 op = new expr (opr, token->src_loc);
3932 else if (user_id *code = dyn_cast <user_id *> (opr))
3934 if (code->nargs != 0)
3935 fatal_at (token, "using an operator with operands as predicate");
3936 /* Parse the zero-operand operator "predicates" as
3937 expression. */
3938 op = new expr (opr, token->src_loc);
3940 else if (predicate_id *p = dyn_cast <predicate_id *> (opr))
3941 op = new predicate (p, token->src_loc);
3942 else
3943 fatal_at (token, "using an unsupported operator as predicate");
3944 if (!parsing_match_operand)
3945 fatal_at (token, "predicates are only allowed in match expression");
3946 token = peek ();
3947 if (token->flags & PREV_WHITE)
3948 return op;
3950 else if (token->type != CPP_COLON
3951 && token->type != CPP_ATSIGN)
3952 fatal_at (token, "expected expression or predicate");
3953 /* optionally followed by a capture and a predicate. */
3954 if (token->type == CPP_COLON)
3955 fatal_at (token, "not implemented: predicate on leaf operand");
3956 if (token->type == CPP_ATSIGN)
3957 op = parse_capture (op, !parsing_match_operand);
3960 return op;
3963 /* Create a new simplify from the current parsing state and MATCH,
3964 MATCH_LOC, RESULT and RESULT_LOC and push it to SIMPLIFIERS. */
3966 void
3967 parser::push_simplify (simplify::simplify_kind kind,
3968 vec<simplify *>& simplifiers,
3969 operand *match, operand *result)
3971 /* Build and push a temporary for operator list uses in expressions. */
3972 if (!oper_lists.is_empty ())
3973 active_fors.safe_push (oper_lists);
3975 simplifiers.safe_push
3976 (new simplify (kind, match, result,
3977 active_fors.copy (), capture_ids));
3979 if (!oper_lists.is_empty ())
3980 active_fors.pop ();
3983 /* Parse
3984 <result-op> = <op> | <if> | <with>
3985 <if> = '(' 'if' '(' <c-expr> ')' <result-op> ')'
3986 <with> = '(' 'with' '{' <c-expr> '}' <result-op> ')'
3987 and return it. */
3989 operand *
3990 parser::parse_result (operand *result, predicate_id *matcher)
3992 const cpp_token *token = peek ();
3993 if (token->type != CPP_OPEN_PAREN)
3994 return parse_op ();
3996 eat_token (CPP_OPEN_PAREN);
3997 if (peek_ident ("if"))
3999 eat_ident ("if");
4000 if_expr *ife = new if_expr (token->src_loc);
4001 ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4002 if (peek ()->type == CPP_OPEN_PAREN)
4004 ife->trueexpr = parse_result (result, matcher);
4005 if (peek ()->type == CPP_OPEN_PAREN)
4006 ife->falseexpr = parse_result (result, matcher);
4007 else if (peek ()->type != CPP_CLOSE_PAREN)
4008 ife->falseexpr = parse_op ();
4010 else if (peek ()->type != CPP_CLOSE_PAREN)
4012 ife->trueexpr = parse_op ();
4013 if (peek ()->type == CPP_OPEN_PAREN)
4014 ife->falseexpr = parse_result (result, matcher);
4015 else if (peek ()->type != CPP_CLOSE_PAREN)
4016 ife->falseexpr = parse_op ();
4018 /* If this if is immediately closed then it contains a
4019 manual matcher or is part of a predicate definition. */
4020 else /* if (peek ()->type == CPP_CLOSE_PAREN) */
4022 if (!matcher)
4023 fatal_at (peek (), "manual transform not implemented");
4024 ife->trueexpr = result;
4026 eat_token (CPP_CLOSE_PAREN);
4027 return ife;
4029 else if (peek_ident ("with"))
4031 eat_ident ("with");
4032 with_expr *withe = new with_expr (token->src_loc);
4033 /* Parse (with c-expr expr) as (if-with (true) expr). */
4034 withe->with = parse_c_expr (CPP_OPEN_BRACE);
4035 withe->with->nr_stmts = 0;
4036 withe->subexpr = parse_result (result, matcher);
4037 eat_token (CPP_CLOSE_PAREN);
4038 return withe;
4040 else if (peek_ident ("switch"))
4042 token = eat_ident ("switch");
4043 source_location ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
4044 eat_ident ("if");
4045 if_expr *ife = new if_expr (ifloc);
4046 operand *res = ife;
4047 ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4048 if (peek ()->type == CPP_OPEN_PAREN)
4049 ife->trueexpr = parse_result (result, matcher);
4050 else
4051 ife->trueexpr = parse_op ();
4052 eat_token (CPP_CLOSE_PAREN);
4053 if (peek ()->type != CPP_OPEN_PAREN
4054 || !peek_ident ("if", 2))
4055 fatal_at (token, "switch can be implemented with a single if");
4056 while (peek ()->type != CPP_CLOSE_PAREN)
4058 if (peek ()->type == CPP_OPEN_PAREN)
4060 if (peek_ident ("if", 2))
4062 ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
4063 eat_ident ("if");
4064 ife->falseexpr = new if_expr (ifloc);
4065 ife = as_a <if_expr *> (ife->falseexpr);
4066 ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4067 if (peek ()->type == CPP_OPEN_PAREN)
4068 ife->trueexpr = parse_result (result, matcher);
4069 else
4070 ife->trueexpr = parse_op ();
4071 eat_token (CPP_CLOSE_PAREN);
4073 else
4075 /* switch default clause */
4076 ife->falseexpr = parse_result (result, matcher);
4077 eat_token (CPP_CLOSE_PAREN);
4078 return res;
4081 else
4083 /* switch default clause */
4084 ife->falseexpr = parse_op ();
4085 eat_token (CPP_CLOSE_PAREN);
4086 return res;
4089 eat_token (CPP_CLOSE_PAREN);
4090 return res;
4092 else
4094 operand *op = result;
4095 if (!matcher)
4096 op = parse_expr ();
4097 eat_token (CPP_CLOSE_PAREN);
4098 return op;
4102 /* Parse
4103 simplify = 'simplify' <expr> <result-op>
4105 match = 'match' <ident> <expr> [<result-op>]
4106 and fill SIMPLIFIERS with the results. */
4108 void
4109 parser::parse_simplify (simplify::simplify_kind kind,
4110 vec<simplify *>& simplifiers, predicate_id *matcher,
4111 operand *result)
4113 /* Reset the capture map. */
4114 if (!capture_ids)
4115 capture_ids = new cid_map_t;
4116 /* Reset oper_lists and set. */
4117 hash_set <user_id *> olist;
4118 oper_lists_set = &olist;
4119 oper_lists = vNULL;
4121 const cpp_token *loc = peek ();
4122 parsing_match_operand = true;
4123 struct operand *match = parse_op ();
4124 parsing_match_operand = false;
4125 if (match->type == operand::OP_CAPTURE && !matcher)
4126 fatal_at (loc, "outermost expression cannot be captured");
4127 if (match->type == operand::OP_EXPR
4128 && is_a <predicate_id *> (as_a <expr *> (match)->operation))
4129 fatal_at (loc, "outermost expression cannot be a predicate");
4131 /* Splice active_ifs onto result and continue parsing the
4132 "then" expr. */
4133 if_expr *active_if = NULL;
4134 for (int i = active_ifs.length (); i > 0; --i)
4136 if_expr *ifc = new if_expr (active_ifs[i-1]->location);
4137 ifc->cond = active_ifs[i-1];
4138 ifc->trueexpr = active_if;
4139 active_if = ifc;
4141 if_expr *outermost_if = active_if;
4142 while (active_if && active_if->trueexpr)
4143 active_if = as_a <if_expr *> (active_if->trueexpr);
4145 const cpp_token *token = peek ();
4147 /* If this if is immediately closed then it is part of a predicate
4148 definition. Push it. */
4149 if (token->type == CPP_CLOSE_PAREN)
4151 if (!matcher)
4152 fatal_at (token, "expected transform expression");
4153 if (active_if)
4155 active_if->trueexpr = result;
4156 result = outermost_if;
4158 push_simplify (kind, simplifiers, match, result);
4159 return;
4162 operand *tem = parse_result (result, matcher);
4163 if (active_if)
4165 active_if->trueexpr = tem;
4166 result = outermost_if;
4168 else
4169 result = tem;
4171 push_simplify (kind, simplifiers, match, result);
4174 /* Parsing of the outer control structures. */
4176 /* Parse a for expression
4177 for = '(' 'for' <subst>... <pattern> ')'
4178 subst = <ident> '(' <ident>... ')' */
4180 void
4181 parser::parse_for (source_location)
4183 auto_vec<const cpp_token *> user_id_tokens;
4184 vec<user_id *> user_ids = vNULL;
4185 const cpp_token *token;
4186 unsigned min_n_opers = 0, max_n_opers = 0;
4188 while (1)
4190 token = peek ();
4191 if (token->type != CPP_NAME)
4192 break;
4194 /* Insert the user defined operators into the operator hash. */
4195 const char *id = get_ident ();
4196 if (get_operator (id) != NULL)
4197 fatal_at (token, "operator already defined");
4198 user_id *op = new user_id (id);
4199 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
4200 *slot = op;
4201 user_ids.safe_push (op);
4202 user_id_tokens.safe_push (token);
4204 eat_token (CPP_OPEN_PAREN);
4206 int arity = -1;
4207 while ((token = peek_ident ()) != 0)
4209 const char *oper = get_ident ();
4210 id_base *idb = get_operator (oper);
4211 if (idb == NULL)
4212 fatal_at (token, "no such operator '%s'", oper);
4213 if (*idb == CONVERT0 || *idb == CONVERT1 || *idb == CONVERT2
4214 || *idb == VIEW_CONVERT0 || *idb == VIEW_CONVERT1
4215 || *idb == VIEW_CONVERT2)
4216 fatal_at (token, "conditional operators cannot be used inside for");
4218 if (arity == -1)
4219 arity = idb->nargs;
4220 else if (idb->nargs == -1)
4222 else if (idb->nargs != arity)
4223 fatal_at (token, "operator '%s' with arity %d does not match "
4224 "others with arity %d", oper, idb->nargs, arity);
4226 user_id *p = dyn_cast<user_id *> (idb);
4227 if (p)
4229 if (p->is_oper_list)
4230 op->substitutes.safe_splice (p->substitutes);
4231 else
4232 fatal_at (token, "iterator cannot be used as operator-list");
4234 else
4235 op->substitutes.safe_push (idb);
4237 op->nargs = arity;
4238 token = expect (CPP_CLOSE_PAREN);
4240 unsigned nsubstitutes = op->substitutes.length ();
4241 if (nsubstitutes == 0)
4242 fatal_at (token, "A user-defined operator must have at least "
4243 "one substitution");
4244 if (max_n_opers == 0)
4246 min_n_opers = nsubstitutes;
4247 max_n_opers = nsubstitutes;
4249 else
4251 if (nsubstitutes % min_n_opers != 0
4252 && min_n_opers % nsubstitutes != 0)
4253 fatal_at (token, "All user-defined identifiers must have a "
4254 "multiple number of operator substitutions of the "
4255 "smallest number of substitutions");
4256 if (nsubstitutes < min_n_opers)
4257 min_n_opers = nsubstitutes;
4258 else if (nsubstitutes > max_n_opers)
4259 max_n_opers = nsubstitutes;
4263 unsigned n_ids = user_ids.length ();
4264 if (n_ids == 0)
4265 fatal_at (token, "for requires at least one user-defined identifier");
4267 token = peek ();
4268 if (token->type == CPP_CLOSE_PAREN)
4269 fatal_at (token, "no pattern defined in for");
4271 active_fors.safe_push (user_ids);
4272 while (1)
4274 token = peek ();
4275 if (token->type == CPP_CLOSE_PAREN)
4276 break;
4277 parse_pattern ();
4279 active_fors.pop ();
4281 /* Remove user-defined operators from the hash again. */
4282 for (unsigned i = 0; i < user_ids.length (); ++i)
4284 if (!user_ids[i]->used)
4285 warning_at (user_id_tokens[i],
4286 "operator %s defined but not used", user_ids[i]->id);
4287 operators->remove_elt (user_ids[i]);
4291 /* Parse an identifier associated with a list of operators.
4292 oprs = '(' 'define_operator_list' <ident> <ident>... ')' */
4294 void
4295 parser::parse_operator_list (source_location)
4297 const cpp_token *token = peek ();
4298 const char *id = get_ident ();
4300 if (get_operator (id) != 0)
4301 fatal_at (token, "operator %s already defined", id);
4303 user_id *op = new user_id (id, true);
4304 int arity = -1;
4306 while ((token = peek_ident ()) != 0)
4308 token = peek ();
4309 const char *oper = get_ident ();
4310 id_base *idb = get_operator (oper);
4312 if (idb == 0)
4313 fatal_at (token, "no such operator '%s'", oper);
4315 if (arity == -1)
4316 arity = idb->nargs;
4317 else if (idb->nargs == -1)
4319 else if (arity != idb->nargs)
4320 fatal_at (token, "operator '%s' with arity %d does not match "
4321 "others with arity %d", oper, idb->nargs, arity);
4323 /* We allow composition of multiple operator lists. */
4324 if (user_id *p = dyn_cast<user_id *> (idb))
4325 op->substitutes.safe_splice (p->substitutes);
4326 else
4327 op->substitutes.safe_push (idb);
4330 // Check that there is no junk after id-list
4331 token = peek();
4332 if (token->type != CPP_CLOSE_PAREN)
4333 fatal_at (token, "expected identifier got %s", cpp_type2name (token->type, 0));
4335 if (op->substitutes.length () == 0)
4336 fatal_at (token, "operator-list cannot be empty");
4338 op->nargs = arity;
4339 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
4340 *slot = op;
4343 /* Parse an outer if expression.
4344 if = '(' 'if' '(' <c-expr> ')' <pattern> ')' */
4346 void
4347 parser::parse_if (source_location)
4349 c_expr *ifexpr = parse_c_expr (CPP_OPEN_PAREN);
4351 const cpp_token *token = peek ();
4352 if (token->type == CPP_CLOSE_PAREN)
4353 fatal_at (token, "no pattern defined in if");
4355 active_ifs.safe_push (ifexpr);
4356 while (1)
4358 const cpp_token *token = peek ();
4359 if (token->type == CPP_CLOSE_PAREN)
4360 break;
4362 parse_pattern ();
4364 active_ifs.pop ();
4367 /* Parse a list of predefined predicate identifiers.
4368 preds = '(' 'define_predicates' <ident>... ')' */
4370 void
4371 parser::parse_predicates (source_location)
4375 const cpp_token *token = peek ();
4376 if (token->type != CPP_NAME)
4377 break;
4379 add_predicate (get_ident ());
4381 while (1);
4384 /* Parse outer control structures.
4385 pattern = <preds>|<for>|<if>|<simplify>|<match> */
4387 void
4388 parser::parse_pattern ()
4390 /* All clauses start with '('. */
4391 eat_token (CPP_OPEN_PAREN);
4392 const cpp_token *token = peek ();
4393 const char *id = get_ident ();
4394 if (strcmp (id, "simplify") == 0)
4396 parse_simplify (simplify::SIMPLIFY, simplifiers, NULL, NULL);
4397 capture_ids = NULL;
4399 else if (strcmp (id, "match") == 0)
4401 bool with_args = false;
4402 source_location e_loc = peek ()->src_loc;
4403 if (peek ()->type == CPP_OPEN_PAREN)
4405 eat_token (CPP_OPEN_PAREN);
4406 with_args = true;
4408 const char *name = get_ident ();
4409 id_base *id = get_operator (name);
4410 predicate_id *p;
4411 if (!id)
4413 p = add_predicate (name);
4414 user_predicates.safe_push (p);
4416 else if ((p = dyn_cast <predicate_id *> (id)))
4418 else
4419 fatal_at (token, "cannot add a match to a non-predicate ID");
4420 /* Parse (match <id> <arg>... (match-expr)) here. */
4421 expr *e = NULL;
4422 if (with_args)
4424 capture_ids = new cid_map_t;
4425 e = new expr (p, e_loc);
4426 while (peek ()->type == CPP_ATSIGN)
4427 e->append_op (parse_capture (NULL, false));
4428 eat_token (CPP_CLOSE_PAREN);
4430 if (p->nargs != -1
4431 && ((e && e->ops.length () != (unsigned)p->nargs)
4432 || (!e && p->nargs != 0)))
4433 fatal_at (token, "non-matching number of match operands");
4434 p->nargs = e ? e->ops.length () : 0;
4435 parse_simplify (simplify::MATCH, p->matchers, p, e);
4436 capture_ids = NULL;
4438 else if (strcmp (id, "for") == 0)
4439 parse_for (token->src_loc);
4440 else if (strcmp (id, "if") == 0)
4441 parse_if (token->src_loc);
4442 else if (strcmp (id, "define_predicates") == 0)
4444 if (active_ifs.length () > 0
4445 || active_fors.length () > 0)
4446 fatal_at (token, "define_predicates inside if or for is not supported");
4447 parse_predicates (token->src_loc);
4449 else if (strcmp (id, "define_operator_list") == 0)
4451 if (active_ifs.length () > 0
4452 || active_fors.length () > 0)
4453 fatal_at (token, "operator-list inside if or for is not supported");
4454 parse_operator_list (token->src_loc);
4456 else
4457 fatal_at (token, "expected %s'simplify', 'match', 'for' or 'if'",
4458 active_ifs.length () == 0 && active_fors.length () == 0
4459 ? "'define_predicates', " : "");
4461 eat_token (CPP_CLOSE_PAREN);
4464 /* Main entry of the parser. Repeatedly parse outer control structures. */
4466 parser::parser (cpp_reader *r_)
4468 r = r_;
4469 active_ifs = vNULL;
4470 active_fors = vNULL;
4471 simplifiers = vNULL;
4472 oper_lists_set = NULL;
4473 oper_lists = vNULL;
4474 capture_ids = NULL;
4475 user_predicates = vNULL;
4476 parsing_match_operand = false;
4478 const cpp_token *token = next ();
4479 while (token->type != CPP_EOF)
4481 _cpp_backup_tokens (r, 1);
4482 parse_pattern ();
4483 token = next ();
4488 /* Helper for the linemap code. */
4490 static size_t
4491 round_alloc_size (size_t s)
4493 return s;
4497 /* The genmatch generator progam. It reads from a pattern description
4498 and outputs GIMPLE or GENERIC IL matching and simplification routines. */
4501 main (int argc, char **argv)
4503 cpp_reader *r;
4505 progname = "genmatch";
4507 if (argc < 2)
4508 return 1;
4510 bool gimple = true;
4511 char *input = argv[argc-1];
4512 for (int i = 1; i < argc - 1; ++i)
4514 if (strcmp (argv[i], "--gimple") == 0)
4515 gimple = true;
4516 else if (strcmp (argv[i], "--generic") == 0)
4517 gimple = false;
4518 else if (strcmp (argv[i], "-v") == 0)
4519 verbose = 1;
4520 else if (strcmp (argv[i], "-vv") == 0)
4521 verbose = 2;
4522 else
4524 fprintf (stderr, "Usage: genmatch "
4525 "[--gimple] [--generic] [-v[v]] input\n");
4526 return 1;
4530 line_table = XCNEW (struct line_maps);
4531 linemap_init (line_table, 0);
4532 line_table->reallocator = xrealloc;
4533 line_table->round_alloc_size = round_alloc_size;
4535 r = cpp_create_reader (CLK_GNUC99, NULL, line_table);
4536 cpp_callbacks *cb = cpp_get_callbacks (r);
4537 cb->error = error_cb;
4539 if (!cpp_read_main_file (r, input))
4540 return 1;
4541 cpp_define (r, gimple ? "GIMPLE=1": "GENERIC=1");
4542 cpp_define (r, gimple ? "GENERIC=0": "GIMPLE=0");
4544 /* Pre-seed operators. */
4545 operators = new hash_table<id_base> (1024);
4546 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
4547 add_operator (SYM, # SYM, # TYPE, NARGS);
4548 #define END_OF_BASE_TREE_CODES
4549 #include "tree.def"
4550 add_operator (CONVERT0, "CONVERT0", "tcc_unary", 1);
4551 add_operator (CONVERT1, "CONVERT1", "tcc_unary", 1);
4552 add_operator (CONVERT2, "CONVERT2", "tcc_unary", 1);
4553 add_operator (VIEW_CONVERT0, "VIEW_CONVERT0", "tcc_unary", 1);
4554 add_operator (VIEW_CONVERT1, "VIEW_CONVERT1", "tcc_unary", 1);
4555 add_operator (VIEW_CONVERT2, "VIEW_CONVERT2", "tcc_unary", 1);
4556 #undef END_OF_BASE_TREE_CODES
4557 #undef DEFTREECODE
4559 /* Pre-seed builtin functions.
4560 ??? Cannot use N (name) as that is targetm.emultls.get_address
4561 for BUILT_IN_EMUTLS_GET_ADDRESS ... */
4562 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) \
4563 add_builtin (ENUM, # ENUM);
4564 #include "builtins.def"
4565 #undef DEF_BUILTIN
4567 /* Parse ahead! */
4568 parser p (r);
4570 if (gimple)
4571 write_header (stdout, "gimple-match-head.c");
4572 else
4573 write_header (stdout, "generic-match-head.c");
4575 /* Go over all predicates defined with patterns and perform
4576 lowering and code generation. */
4577 for (unsigned i = 0; i < p.user_predicates.length (); ++i)
4579 predicate_id *pred = p.user_predicates[i];
4580 lower (pred->matchers, gimple);
4582 if (verbose == 2)
4583 for (unsigned i = 0; i < pred->matchers.length (); ++i)
4584 print_matches (pred->matchers[i]);
4586 decision_tree dt;
4587 for (unsigned i = 0; i < pred->matchers.length (); ++i)
4588 dt.insert (pred->matchers[i], i);
4590 if (verbose == 2)
4591 dt.print (stderr);
4593 write_predicate (stdout, pred, dt, gimple);
4596 /* Lower the main simplifiers and generate code for them. */
4597 lower (p.simplifiers, gimple);
4599 if (verbose == 2)
4600 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
4601 print_matches (p.simplifiers[i]);
4603 decision_tree dt;
4604 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
4605 dt.insert (p.simplifiers[i], i);
4607 if (verbose == 2)
4608 dt.print (stderr);
4610 dt.gen (stdout, gimple);
4612 /* Finalize. */
4613 cpp_finish (r, NULL);
4614 cpp_destroy (r);
4616 delete operators;
4618 return 0;