2015-01-16 Bernd Edlinger <bernd.edlinger@hotmail.de>
[official-gcc.git] / gcc / genmatch.c
blobea557a5bef4537b020f8e5a7bcc84b113a3c3a66
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 "ggc.h"
29 #include <cpplib.h>
30 #include "errors.h"
31 #include "hashtab.h"
32 #include "hash-table.h"
33 #include "hash-map.h"
34 #include "hash-set.h"
35 #include "vec.h"
36 #include "is-a.h"
39 /* Stubs for GGC referenced through instantiations triggered by hash-map. */
40 void *ggc_internal_cleared_alloc (size_t, void (*)(void *),
41 size_t, size_t MEM_STAT_DECL)
43 return NULL;
45 void ggc_free (void *)
50 /* libccp helpers. */
52 static struct line_maps *line_table;
54 static bool
55 #if GCC_VERSION >= 4001
56 __attribute__((format (printf, 6, 0)))
57 #endif
58 error_cb (cpp_reader *, int errtype, int, source_location location,
59 unsigned int, const char *msg, va_list *ap)
61 const line_map *map;
62 linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
63 expanded_location loc = linemap_expand_location (line_table, map, location);
64 fprintf (stderr, "%s:%d:%d %s: ", loc.file, loc.line, loc.column,
65 (errtype == CPP_DL_WARNING) ? "warning" : "error");
66 vfprintf (stderr, msg, *ap);
67 fprintf (stderr, "\n");
68 FILE *f = fopen (loc.file, "r");
69 if (f)
71 char buf[128];
72 while (loc.line > 0)
74 if (!fgets (buf, 128, f))
75 goto notfound;
76 if (buf[strlen (buf) - 1] != '\n')
78 if (loc.line > 1)
79 loc.line++;
81 loc.line--;
83 fprintf (stderr, "%s", buf);
84 for (int i = 0; i < loc.column - 1; ++i)
85 fputc (' ', stderr);
86 fputc ('^', stderr);
87 fputc ('\n', stderr);
88 notfound:
89 fclose (f);
92 if (errtype == CPP_DL_FATAL)
93 exit (1);
94 return false;
97 static void
98 #if GCC_VERSION >= 4001
99 __attribute__((format (printf, 2, 3)))
100 #endif
101 fatal_at (const cpp_token *tk, const char *msg, ...)
103 va_list ap;
104 va_start (ap, msg);
105 error_cb (NULL, CPP_DL_FATAL, 0, tk->src_loc, 0, msg, &ap);
106 va_end (ap);
109 static void
110 #if GCC_VERSION >= 4001
111 __attribute__((format (printf, 2, 3)))
112 #endif
113 fatal_at (source_location loc, const char *msg, ...)
115 va_list ap;
116 va_start (ap, msg);
117 error_cb (NULL, CPP_DL_FATAL, 0, loc, 0, msg, &ap);
118 va_end (ap);
121 static void
122 #if GCC_VERSION >= 4001
123 __attribute__((format (printf, 2, 3)))
124 #endif
125 warning_at (const cpp_token *tk, const char *msg, ...)
127 va_list ap;
128 va_start (ap, msg);
129 error_cb (NULL, CPP_DL_WARNING, 0, tk->src_loc, 0, msg, &ap);
130 va_end (ap);
133 static void
134 output_line_directive (FILE *f, source_location location,
135 bool dumpfile = false)
137 const line_map *map;
138 linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
139 expanded_location loc = linemap_expand_location (line_table, map, location);
140 if (dumpfile)
142 /* When writing to a dumpfile only dump the filename. */
143 const char *file = strrchr (loc.file, DIR_SEPARATOR);
144 if (!file)
145 file = loc.file;
146 else
147 ++file;
148 fprintf (f, "%s:%d", file, loc.line);
150 else
151 /* Other gen programs really output line directives here, at least for
152 development it's right now more convenient to have line information
153 from the generated file. Still keep the directives as comment for now
154 to easily back-point to the meta-description. */
155 fprintf (f, "/* #line %d \"%s\" */\n", loc.line, loc.file);
159 /* Pull in tree codes and builtin function codes from their
160 definition files. */
162 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM,
163 enum tree_code {
164 #include "tree.def"
165 CONVERT0,
166 CONVERT1,
167 CONVERT2,
168 MAX_TREE_CODES
170 #undef DEFTREECODE
172 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
173 enum built_in_function {
174 #include "builtins.def"
175 END_BUILTINS
177 #undef DEF_BUILTIN
180 /* Base class for all identifiers the parser knows. */
182 struct id_base : typed_noop_remove<id_base>
184 enum id_kind { CODE, FN, PREDICATE, USER } kind;
186 id_base (id_kind, const char *, int = -1);
188 hashval_t hashval;
189 int nargs;
190 const char *id;
192 /* hash_table support. */
193 typedef id_base value_type;
194 typedef id_base compare_type;
195 static inline hashval_t hash (const value_type *);
196 static inline int equal (const value_type *, const compare_type *);
199 inline hashval_t
200 id_base::hash (const value_type *op)
202 return op->hashval;
205 inline int
206 id_base::equal (const value_type *op1,
207 const compare_type *op2)
209 return (op1->hashval == op2->hashval
210 && strcmp (op1->id, op2->id) == 0);
213 /* Hashtable of known pattern operators. This is pre-seeded from
214 all known tree codes and all known builtin function ids. */
215 static hash_table<id_base> *operators;
217 id_base::id_base (id_kind kind_, const char *id_, int nargs_)
219 kind = kind_;
220 id = id_;
221 nargs = nargs_;
222 hashval = htab_hash_string (id);
225 /* Identifier that maps to a tree code. */
227 struct operator_id : public id_base
229 operator_id (enum tree_code code_, const char *id_, unsigned nargs_,
230 const char *tcc_)
231 : id_base (id_base::CODE, id_, nargs_), code (code_), tcc (tcc_) {}
232 enum tree_code code;
233 const char *tcc;
236 /* Identifier that maps to a builtin function code. */
238 struct fn_id : public id_base
240 fn_id (enum built_in_function fn_, const char *id_)
241 : id_base (id_base::FN, id_), fn (fn_) {}
242 enum built_in_function fn;
245 struct simplify;
247 /* Identifier that maps to a user-defined predicate. */
249 struct predicate_id : public id_base
251 predicate_id (const char *id_)
252 : id_base (id_base::PREDICATE, id_), matchers (vNULL) {}
253 vec<simplify *> matchers;
256 /* Identifier that maps to a operator defined by a 'for' directive. */
258 struct user_id : public id_base
260 user_id (const char *id_, bool is_oper_list_ = false)
261 : id_base (id_base::USER, id_), substitutes (vNULL),
262 used (false), is_oper_list (is_oper_list_) {}
263 vec<id_base *> substitutes;
264 bool used;
265 bool is_oper_list;
268 template<>
269 template<>
270 inline bool
271 is_a_helper <fn_id *>::test (id_base *id)
273 return id->kind == id_base::FN;
276 template<>
277 template<>
278 inline bool
279 is_a_helper <operator_id *>::test (id_base *id)
281 return id->kind == id_base::CODE;
284 template<>
285 template<>
286 inline bool
287 is_a_helper <predicate_id *>::test (id_base *id)
289 return id->kind == id_base::PREDICATE;
292 template<>
293 template<>
294 inline bool
295 is_a_helper <user_id *>::test (id_base *id)
297 return id->kind == id_base::USER;
300 /* Add a predicate identifier to the hash. */
302 static predicate_id *
303 add_predicate (const char *id)
305 predicate_id *p = new predicate_id (id);
306 id_base **slot = operators->find_slot_with_hash (p, p->hashval, INSERT);
307 if (*slot)
308 fatal ("duplicate id definition");
309 *slot = p;
310 return p;
313 /* Add a tree code identifier to the hash. */
315 static void
316 add_operator (enum tree_code code, const char *id,
317 const char *tcc, unsigned nargs)
319 if (strcmp (tcc, "tcc_unary") != 0
320 && strcmp (tcc, "tcc_binary") != 0
321 && strcmp (tcc, "tcc_comparison") != 0
322 && strcmp (tcc, "tcc_expression") != 0
323 /* For {REAL,IMAG}PART_EXPR and VIEW_CONVERT_EXPR. */
324 && strcmp (tcc, "tcc_reference") != 0
325 /* To have INTEGER_CST and friends as "predicate operators". */
326 && strcmp (tcc, "tcc_constant") != 0
327 /* And allow CONSTRUCTOR for vector initializers. */
328 && !(code == CONSTRUCTOR))
329 return;
330 operator_id *op = new operator_id (code, id, nargs, tcc);
331 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
332 if (*slot)
333 fatal ("duplicate id definition");
334 *slot = op;
337 /* Add a builtin identifier to the hash. */
339 static void
340 add_builtin (enum built_in_function code, const char *id)
342 fn_id *fn = new fn_id (code, id);
343 id_base **slot = operators->find_slot_with_hash (fn, fn->hashval, INSERT);
344 if (*slot)
345 fatal ("duplicate id definition");
346 *slot = fn;
349 /* Helper for easy comparing ID with tree code CODE. */
351 static bool
352 operator==(id_base &id, enum tree_code code)
354 if (operator_id *oid = dyn_cast <operator_id *> (&id))
355 return oid->code == code;
356 return false;
359 /* Lookup the identifier ID. */
361 id_base *
362 get_operator (const char *id)
364 id_base tem (id_base::CODE, id);
366 id_base *op = operators->find_with_hash (&tem, tem.hashval);
367 if (op)
369 /* If this is a user-defined identifier track whether it was used. */
370 if (user_id *uid = dyn_cast<user_id *> (op))
371 uid->used = true;
372 return op;
375 /* Try all-uppercase. */
376 char *id2 = xstrdup (id);
377 for (unsigned i = 0; i < strlen (id2); ++i)
378 id2[i] = TOUPPER (id2[i]);
379 new (&tem) id_base (id_base::CODE, id2);
380 op = operators->find_with_hash (&tem, tem.hashval);
381 if (op)
383 free (id2);
384 return op;
387 /* Try _EXPR appended. */
388 id2 = (char *)xrealloc (id2, strlen (id2) + sizeof ("_EXPR") + 1);
389 strcat (id2, "_EXPR");
390 new (&tem) id_base (id_base::CODE, id2);
391 op = operators->find_with_hash (&tem, tem.hashval);
392 if (op)
394 free (id2);
395 return op;
398 return 0;
402 /* Helper for the capture-id map. */
404 struct capture_id_map_hasher : default_hashmap_traits
406 static inline hashval_t hash (const char *);
407 static inline bool equal_keys (const char *, const char *);
410 inline hashval_t
411 capture_id_map_hasher::hash (const char *id)
413 return htab_hash_string (id);
416 inline bool
417 capture_id_map_hasher::equal_keys (const char *id1, const char *id2)
419 return strcmp (id1, id2) == 0;
422 typedef hash_map<const char *, unsigned, capture_id_map_hasher> cid_map_t;
425 /* The AST produced by parsing of the pattern definitions. */
427 struct dt_operand;
428 struct capture_info;
430 /* The base class for operands. */
432 struct operand {
433 enum op_type { OP_PREDICATE, OP_EXPR, OP_CAPTURE, OP_C_EXPR };
434 operand (enum op_type type_) : type (type_) {}
435 enum op_type type;
436 virtual void gen_transform (FILE *, const char *, bool, int,
437 const char *, capture_info *,
438 dt_operand ** = 0,
439 bool = true)
440 { gcc_unreachable (); }
443 /* A predicate operand. Predicates are leafs in the AST. */
445 struct predicate : public operand
447 predicate (predicate_id *p_) : operand (OP_PREDICATE), p (p_) {}
448 predicate_id *p;
451 /* An operand that constitutes an expression. Expressions include
452 function calls and user-defined predicate invocations. */
454 struct expr : public operand
456 expr (id_base *operation_, bool is_commutative_ = false)
457 : operand (OP_EXPR), operation (operation_),
458 ops (vNULL), expr_type (NULL), is_commutative (is_commutative_),
459 is_generic (false) {}
460 void append_op (operand *op) { ops.safe_push (op); }
461 /* The operator and its operands. */
462 id_base *operation;
463 vec<operand *> ops;
464 /* An explicitely specified type - used exclusively for conversions. */
465 const char *expr_type;
466 /* Whether the operation is to be applied commutatively. This is
467 later lowered to two separate patterns. */
468 bool is_commutative;
469 /* Whether the expression is expected to be in GENERIC form. */
470 bool is_generic;
471 virtual void gen_transform (FILE *f, const char *, bool, int,
472 const char *, capture_info *,
473 dt_operand ** = 0, bool = true);
476 /* An operator that is represented by native C code. This is always
477 a leaf operand in the AST. This class is also used to represent
478 the code to be generated for 'if' and 'with' expressions. */
480 struct c_expr : public operand
482 /* A mapping of an identifier and its replacement. Used to apply
483 'for' lowering. */
484 struct id_tab {
485 const char *id;
486 const char *oper;
487 id_tab (const char *id_, const char *oper_): id (id_), oper (oper_) {}
490 c_expr (cpp_reader *r_, vec<cpp_token> code_, unsigned nr_stmts_,
491 vec<id_tab> ids_, cid_map_t *capture_ids_)
492 : operand (OP_C_EXPR), r (r_), code (code_), capture_ids (capture_ids_),
493 nr_stmts (nr_stmts_), ids (ids_) {}
494 /* cpplib tokens and state to transform this back to source. */
495 cpp_reader *r;
496 vec<cpp_token> code;
497 cid_map_t *capture_ids;
498 /* The number of statements parsed (well, the number of ';'s). */
499 unsigned nr_stmts;
500 /* The identifier replacement vector. */
501 vec<id_tab> ids;
502 virtual void gen_transform (FILE *f, const char *, bool, int,
503 const char *, capture_info *,
504 dt_operand ** = 0, bool = true);
507 /* A wrapper around another operand that captures its value. */
509 struct capture : public operand
511 capture (unsigned where_, operand *what_)
512 : operand (OP_CAPTURE), where (where_), what (what_) {}
513 /* Identifier index for the value. */
514 unsigned where;
515 /* The captured value. */
516 operand *what;
517 virtual void gen_transform (FILE *f, const char *, bool, int,
518 const char *, capture_info *,
519 dt_operand ** = 0, bool = true);
522 template<>
523 template<>
524 inline bool
525 is_a_helper <capture *>::test (operand *op)
527 return op->type == operand::OP_CAPTURE;
530 template<>
531 template<>
532 inline bool
533 is_a_helper <predicate *>::test (operand *op)
535 return op->type == operand::OP_PREDICATE;
538 template<>
539 template<>
540 inline bool
541 is_a_helper <c_expr *>::test (operand *op)
543 return op->type == operand::OP_C_EXPR;
546 template<>
547 template<>
548 inline bool
549 is_a_helper <expr *>::test (operand *op)
551 return op->type == operand::OP_EXPR;
554 /* Helper to distinguish 'if' from 'with' expressions. */
556 struct if_or_with
558 if_or_with (operand *cexpr_, source_location location_, bool is_with_)
559 : location (location_), cexpr (cexpr_), is_with (is_with_) {}
560 source_location location;
561 operand *cexpr;
562 bool is_with;
565 /* The main class of a pattern and its transform. This is used to
566 represent both (simplify ...) and (match ...) kinds. The AST
567 duplicates all outer 'if' and 'for' expressions here so each
568 simplify can exist in isolation. */
570 struct simplify
572 simplify (operand *match_, source_location match_location_,
573 struct operand *result_, source_location result_location_,
574 vec<if_or_with> ifexpr_vec_, vec<vec<user_id *> > for_vec_,
575 cid_map_t *capture_ids_)
576 : match (match_), match_location (match_location_),
577 result (result_), result_location (result_location_),
578 ifexpr_vec (ifexpr_vec_), for_vec (for_vec_),
579 capture_ids (capture_ids_), capture_max (capture_ids_->elements () - 1) {}
581 /* The expression that is matched against the GENERIC or GIMPLE IL. */
582 operand *match;
583 source_location match_location;
584 /* For a (simplify ...) the expression produced when the pattern applies.
585 For a (match ...) either NULL if it is a simple predicate or the
586 single expression specifying the matched operands. */
587 struct operand *result;
588 source_location result_location;
589 /* Collected 'if' expressions that need to evaluate to true to make
590 the pattern apply. */
591 vec<if_or_with> ifexpr_vec;
592 /* Collected 'for' expression operators that have to be replaced
593 in the lowering phase. */
594 vec<vec<user_id *> > for_vec;
595 /* A map of capture identifiers to indexes. */
596 cid_map_t *capture_ids;
597 int capture_max;
600 /* Debugging routines for dumping the AST. */
602 DEBUG_FUNCTION void
603 print_operand (operand *o, FILE *f = stderr, bool flattened = false)
605 if (capture *c = dyn_cast<capture *> (o))
607 fprintf (f, "@%u", c->where);
608 if (c->what && flattened == false)
610 putc (':', f);
611 print_operand (c->what, f, flattened);
612 putc (' ', f);
616 else if (predicate *p = dyn_cast<predicate *> (o))
617 fprintf (f, "%s", p->p->id);
619 else if (is_a<c_expr *> (o))
620 fprintf (f, "c_expr");
622 else if (expr *e = dyn_cast<expr *> (o))
624 fprintf (f, "(%s", e->operation->id);
626 if (flattened == false)
628 putc (' ', f);
629 for (unsigned i = 0; i < e->ops.length (); ++i)
631 print_operand (e->ops[i], f, flattened);
632 putc (' ', f);
635 putc (')', f);
638 else
639 gcc_unreachable ();
642 DEBUG_FUNCTION void
643 print_matches (struct simplify *s, FILE *f = stderr)
645 fprintf (f, "for expression: ");
646 print_operand (s->match, f);
647 putc ('\n', f);
651 /* AST lowering. */
653 /* Lowering of commutative operators. */
655 static void
656 cartesian_product (const vec< vec<operand *> >& ops_vector,
657 vec< vec<operand *> >& result, vec<operand *>& v, unsigned n)
659 if (n == ops_vector.length ())
661 vec<operand *> xv = v.copy ();
662 result.safe_push (xv);
663 return;
666 for (unsigned i = 0; i < ops_vector[n].length (); ++i)
668 v[n] = ops_vector[n][i];
669 cartesian_product (ops_vector, result, v, n + 1);
673 /* Lower OP to two operands in case it is marked as commutative. */
675 static vec<operand *>
676 commutate (operand *op)
678 vec<operand *> ret = vNULL;
680 if (capture *c = dyn_cast <capture *> (op))
682 if (!c->what)
684 ret.safe_push (op);
685 return ret;
687 vec<operand *> v = commutate (c->what);
688 for (unsigned i = 0; i < v.length (); ++i)
690 capture *nc = new capture (c->where, v[i]);
691 ret.safe_push (nc);
693 return ret;
696 expr *e = dyn_cast <expr *> (op);
697 if (!e || e->ops.length () == 0)
699 ret.safe_push (op);
700 return ret;
703 vec< vec<operand *> > ops_vector = vNULL;
704 for (unsigned i = 0; i < e->ops.length (); ++i)
705 ops_vector.safe_push (commutate (e->ops[i]));
707 auto_vec< vec<operand *> > result;
708 auto_vec<operand *> v (e->ops.length ());
709 v.quick_grow_cleared (e->ops.length ());
710 cartesian_product (ops_vector, result, v, 0);
713 for (unsigned i = 0; i < result.length (); ++i)
715 expr *ne = new expr (e->operation);
716 for (unsigned j = 0; j < result[i].length (); ++j)
717 ne->append_op (result[i][j]);
718 ret.safe_push (ne);
721 if (!e->is_commutative)
722 return ret;
724 for (unsigned i = 0; i < result.length (); ++i)
726 expr *ne = new expr (e->operation);
727 // result[i].length () is 2 since e->operation is binary
728 for (unsigned j = result[i].length (); j; --j)
729 ne->append_op (result[i][j-1]);
730 ret.safe_push (ne);
733 return ret;
736 /* Lower operations marked as commutative in the AST of S and push
737 the resulting patterns to SIMPLIFIERS. */
739 static void
740 lower_commutative (simplify *s, vec<simplify *>& simplifiers)
742 vec<operand *> matchers = commutate (s->match);
743 for (unsigned i = 0; i < matchers.length (); ++i)
745 simplify *ns = new simplify (matchers[i], s->match_location,
746 s->result, s->result_location, s->ifexpr_vec,
747 s->for_vec, s->capture_ids);
748 simplifiers.safe_push (ns);
752 /* Strip conditional conversios using operator OPER from O and its
753 children if STRIP, else replace them with an unconditional convert. */
755 operand *
756 lower_opt_convert (operand *o, enum tree_code oper, bool strip)
758 if (capture *c = dyn_cast<capture *> (o))
760 if (c->what)
761 return new capture (c->where, lower_opt_convert (c->what, oper, strip));
762 else
763 return c;
766 expr *e = dyn_cast<expr *> (o);
767 if (!e)
768 return o;
770 if (*e->operation == oper)
772 if (strip)
773 return lower_opt_convert (e->ops[0], oper, strip);
775 expr *ne = new expr (get_operator ("CONVERT_EXPR"));
776 ne->append_op (lower_opt_convert (e->ops[0], oper, strip));
777 return ne;
780 expr *ne = new expr (e->operation, e->is_commutative);
781 for (unsigned i = 0; i < e->ops.length (); ++i)
782 ne->append_op (lower_opt_convert (e->ops[i], oper, strip));
784 return ne;
787 /* Determine whether O or its children uses the conditional conversion
788 operator OPER. */
790 static bool
791 has_opt_convert (operand *o, enum tree_code oper)
793 if (capture *c = dyn_cast<capture *> (o))
795 if (c->what)
796 return has_opt_convert (c->what, oper);
797 else
798 return false;
801 expr *e = dyn_cast<expr *> (o);
802 if (!e)
803 return false;
805 if (*e->operation == oper)
806 return true;
808 for (unsigned i = 0; i < e->ops.length (); ++i)
809 if (has_opt_convert (e->ops[i], oper))
810 return true;
812 return false;
815 /* Lower conditional convert operators in O, expanding it to a vector
816 if required. */
818 static vec<operand *>
819 lower_opt_convert (operand *o)
821 vec<operand *> v1 = vNULL, v2;
823 v1.safe_push (o);
825 enum tree_code opers[] = { CONVERT0, CONVERT1, CONVERT2 };
827 /* Conditional converts are lowered to a pattern with the
828 conversion and one without. The three different conditional
829 convert codes are lowered separately. */
831 for (unsigned i = 0; i < 3; ++i)
833 v2 = vNULL;
834 for (unsigned j = 0; j < v1.length (); ++j)
835 if (has_opt_convert (v1[j], opers[i]))
837 v2.safe_push (lower_opt_convert (v1[j], opers[i], false));
838 v2.safe_push (lower_opt_convert (v1[j], opers[i], true));
841 if (v2 != vNULL)
843 v1 = vNULL;
844 for (unsigned j = 0; j < v2.length (); ++j)
845 v1.safe_push (v2[j]);
849 return v1;
852 /* Lower conditional convert operators in the AST of S and push
853 the resulting multiple patterns to SIMPLIFIERS. */
855 static void
856 lower_opt_convert (simplify *s, vec<simplify *>& simplifiers)
858 vec<operand *> matchers = lower_opt_convert (s->match);
859 for (unsigned i = 0; i < matchers.length (); ++i)
861 simplify *ns = new simplify (matchers[i], s->match_location,
862 s->result, s->result_location, s->ifexpr_vec,
863 s->for_vec, s->capture_ids);
864 simplifiers.safe_push (ns);
868 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
869 GENERIC and a GIMPLE variant. */
871 static vec<operand *>
872 lower_cond (operand *o)
874 vec<operand *> ro = vNULL;
876 if (capture *c = dyn_cast<capture *> (o))
878 if (c->what)
880 vec<operand *> lop = vNULL;
881 lop = lower_cond (c->what);
883 for (unsigned i = 0; i < lop.length (); ++i)
884 ro.safe_push (new capture (c->where, lop[i]));
885 return ro;
889 expr *e = dyn_cast<expr *> (o);
890 if (!e || e->ops.length () == 0)
892 ro.safe_push (o);
893 return ro;
896 vec< vec<operand *> > ops_vector = vNULL;
897 for (unsigned i = 0; i < e->ops.length (); ++i)
898 ops_vector.safe_push (lower_cond (e->ops[i]));
900 auto_vec< vec<operand *> > result;
901 auto_vec<operand *> v (e->ops.length ());
902 v.quick_grow_cleared (e->ops.length ());
903 cartesian_product (ops_vector, result, v, 0);
905 for (unsigned i = 0; i < result.length (); ++i)
907 expr *ne = new expr (e->operation);
908 for (unsigned j = 0; j < result[i].length (); ++j)
909 ne->append_op (result[i][j]);
910 ro.safe_push (ne);
911 /* If this is a COND with a captured expression or an
912 expression with two operands then also match a GENERIC
913 form on the compare. */
914 if ((*e->operation == COND_EXPR
915 || *e->operation == VEC_COND_EXPR)
916 && ((is_a <capture *> (e->ops[0])
917 && as_a <capture *> (e->ops[0])->what
918 && is_a <expr *> (as_a <capture *> (e->ops[0])->what)
919 && as_a <expr *>
920 (as_a <capture *> (e->ops[0])->what)->ops.length () == 2)
921 || (is_a <expr *> (e->ops[0])
922 && as_a <expr *> (e->ops[0])->ops.length () == 2)))
924 expr *ne = new expr (e->operation);
925 for (unsigned j = 0; j < result[i].length (); ++j)
926 ne->append_op (result[i][j]);
927 if (capture *c = dyn_cast <capture *> (ne->ops[0]))
929 expr *ocmp = as_a <expr *> (c->what);
930 expr *cmp = new expr (ocmp->operation);
931 for (unsigned j = 0; j < ocmp->ops.length (); ++j)
932 cmp->append_op (ocmp->ops[j]);
933 cmp->is_generic = true;
934 ne->ops[0] = new capture (c->where, cmp);
936 else
938 expr *ocmp = as_a <expr *> (ne->ops[0]);
939 expr *cmp = new expr (ocmp->operation);
940 for (unsigned j = 0; j < ocmp->ops.length (); ++j)
941 cmp->append_op (ocmp->ops[j]);
942 cmp->is_generic = true;
943 ne->ops[0] = cmp;
945 ro.safe_push (ne);
949 return ro;
952 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
953 GENERIC and a GIMPLE variant. */
955 static void
956 lower_cond (simplify *s, vec<simplify *>& simplifiers)
958 vec<operand *> matchers = lower_cond (s->match);
959 for (unsigned i = 0; i < matchers.length (); ++i)
961 simplify *ns = new simplify (matchers[i], s->match_location,
962 s->result, s->result_location, s->ifexpr_vec,
963 s->for_vec, s->capture_ids);
964 simplifiers.safe_push (ns);
968 /* In AST operand O replace operator ID with operator WITH. */
970 operand *
971 replace_id (operand *o, user_id *id, id_base *with)
973 /* Deep-copy captures and expressions, replacing operations as
974 needed. */
975 if (capture *c = dyn_cast<capture *> (o))
977 if (!c->what)
978 return c;
979 return new capture (c->where, replace_id (c->what, id, with));
981 else if (expr *e = dyn_cast<expr *> (o))
983 expr *ne = new expr (e->operation == id ? with : e->operation,
984 e->is_commutative);
985 for (unsigned i = 0; i < e->ops.length (); ++i)
986 ne->append_op (replace_id (e->ops[i], id, with));
987 return ne;
990 /* For c_expr we simply record a string replacement table which is
991 applied at code-generation time. */
992 if (c_expr *ce = dyn_cast<c_expr *> (o))
994 vec<c_expr::id_tab> ids = ce->ids.copy ();
995 ids.safe_push (c_expr::id_tab (id->id, with->id));
996 return new c_expr (ce->r, ce->code, ce->nr_stmts, ids, ce->capture_ids);
999 return o;
1002 /* Lower recorded fors for SIN and output to SIMPLIFIERS. */
1004 static void
1005 lower_for (simplify *sin, vec<simplify *>& simplifiers)
1007 vec<vec<user_id *> >& for_vec = sin->for_vec;
1008 unsigned worklist_start = 0;
1009 auto_vec<simplify *> worklist;
1010 worklist.safe_push (sin);
1012 /* Lower each recorded for separately, operating on the
1013 set of simplifiers created by the previous one.
1014 Lower inner-to-outer so inner for substitutes can refer
1015 to operators replaced by outer fors. */
1016 for (int fi = for_vec.length () - 1; fi >= 0; --fi)
1018 vec<user_id *>& ids = for_vec[fi];
1019 unsigned n_ids = ids.length ();
1020 unsigned max_n_opers = 0;
1021 for (unsigned i = 0; i < n_ids; ++i)
1022 if (ids[i]->substitutes.length () > max_n_opers)
1023 max_n_opers = ids[i]->substitutes.length ();
1025 unsigned worklist_end = worklist.length ();
1026 for (unsigned si = worklist_start; si < worklist_end; ++si)
1028 simplify *s = worklist[si];
1029 for (unsigned j = 0; j < max_n_opers; ++j)
1031 operand *match_op = s->match;
1032 operand *result_op = s->result;
1033 vec<if_or_with> ifexpr_vec = s->ifexpr_vec.copy ();
1035 for (unsigned i = 0; i < n_ids; ++i)
1037 user_id *id = ids[i];
1038 id_base *oper = id->substitutes[j % id->substitutes.length ()];
1039 match_op = replace_id (match_op, id, oper);
1040 if (result_op)
1041 result_op = replace_id (result_op, id, oper);
1042 for (unsigned k = 0; k < s->ifexpr_vec.length (); ++k)
1043 ifexpr_vec[k].cexpr = replace_id (ifexpr_vec[k].cexpr,
1044 id, oper);
1046 simplify *ns = new simplify (match_op, s->match_location,
1047 result_op, s->result_location,
1048 ifexpr_vec, vNULL, s->capture_ids);
1049 worklist.safe_push (ns);
1052 worklist_start = worklist_end;
1055 /* Copy out the result from the last for lowering. */
1056 for (unsigned i = worklist_start; i < worklist.length (); ++i)
1057 simplifiers.safe_push (worklist[i]);
1060 /* Lower the AST for everything in SIMPLIFIERS. */
1062 static void
1063 lower (vec<simplify *>& simplifiers, bool gimple)
1065 auto_vec<simplify *> out_simplifiers;
1066 for (unsigned i = 0; i < simplifiers.length (); ++i)
1067 lower_opt_convert (simplifiers[i], out_simplifiers);
1069 simplifiers.truncate (0);
1070 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1071 lower_commutative (out_simplifiers[i], simplifiers);
1073 out_simplifiers.truncate (0);
1074 if (gimple)
1075 for (unsigned i = 0; i < simplifiers.length (); ++i)
1076 lower_cond (simplifiers[i], out_simplifiers);
1077 else
1078 out_simplifiers.safe_splice (simplifiers);
1081 simplifiers.truncate (0);
1082 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1083 lower_for (out_simplifiers[i], simplifiers);
1089 /* The decision tree built for generating GIMPLE and GENERIC pattern
1090 matching code. It represents the 'match' expression of all
1091 simplifies and has those as its leafs. */
1093 /* Decision tree base class, used for DT_TRUE and DT_NODE. */
1095 struct dt_node
1097 enum dt_type { DT_NODE, DT_OPERAND, DT_TRUE, DT_MATCH, DT_SIMPLIFY };
1099 enum dt_type type;
1100 unsigned level;
1101 vec<dt_node *> kids;
1103 dt_node (enum dt_type type_): type (type_), level (0), kids (vNULL) {}
1105 dt_node *append_node (dt_node *);
1106 dt_node *append_op (operand *, dt_node *parent = 0, unsigned pos = 0);
1107 dt_node *append_true_op (dt_node *parent = 0, unsigned pos = 0);
1108 dt_node *append_match_op (dt_operand *, dt_node *parent = 0, unsigned pos = 0);
1109 dt_node *append_simplify (simplify *, unsigned, dt_operand **);
1111 virtual void gen (FILE *, bool) {}
1113 void gen_kids (FILE *, bool);
1114 void gen_kids_1 (FILE *, bool,
1115 vec<dt_operand *>, vec<dt_operand *>, vec<dt_operand *>,
1116 vec<dt_operand *>, vec<dt_operand *>, vec<dt_node *>);
1119 /* Generic decision tree node used for DT_OPERAND and DT_MATCH. */
1121 struct dt_operand : public dt_node
1123 operand *op;
1124 dt_operand *match_dop;
1125 dt_operand *parent;
1126 unsigned pos;
1128 dt_operand (enum dt_type type, operand *op_, dt_operand *match_dop_,
1129 dt_operand *parent_ = 0, unsigned pos_ = 0)
1130 : dt_node (type), op (op_), match_dop (match_dop_),
1131 parent (parent_), pos (pos_) {}
1133 void gen (FILE *, bool);
1134 unsigned gen_predicate (FILE *, const char *, bool);
1135 unsigned gen_match_op (FILE *, const char *);
1137 unsigned gen_gimple_expr (FILE *);
1138 unsigned gen_generic_expr (FILE *, const char *);
1140 char *get_name (char *);
1141 void gen_opname (char *, unsigned);
1144 /* Leaf node of the decision tree, used for DT_SIMPLIFY. */
1146 struct dt_simplify : public dt_node
1148 simplify *s;
1149 unsigned pattern_no;
1150 dt_operand **indexes;
1152 dt_simplify (simplify *s_, unsigned pattern_no_, dt_operand **indexes_)
1153 : dt_node (DT_SIMPLIFY), s (s_), pattern_no (pattern_no_),
1154 indexes (indexes_) {}
1156 void gen (FILE *f, bool);
1159 template<>
1160 template<>
1161 inline bool
1162 is_a_helper <dt_operand *>::test (dt_node *n)
1164 return (n->type == dt_node::DT_OPERAND
1165 || n->type == dt_node::DT_MATCH);
1168 /* A container for the actual decision tree. */
1170 struct decision_tree
1172 dt_node *root;
1174 void insert (struct simplify *, unsigned);
1175 void gen_gimple (FILE *f = stderr);
1176 void gen_generic (FILE *f = stderr);
1177 void print (FILE *f = stderr);
1179 decision_tree () { root = new dt_node (dt_node::DT_NODE); }
1181 static dt_node *insert_operand (dt_node *, operand *, dt_operand **indexes,
1182 unsigned pos = 0, dt_node *parent = 0);
1183 static dt_node *find_node (vec<dt_node *>&, dt_node *);
1184 static bool cmp_node (dt_node *, dt_node *);
1185 static void print_node (dt_node *, FILE *f = stderr, unsigned = 0);
1188 /* Compare two AST operands O1 and O2 and return true if they are equal. */
1190 bool
1191 cmp_operand (operand *o1, operand *o2)
1193 if (!o1 || !o2 || o1->type != o2->type)
1194 return false;
1196 if (o1->type == operand::OP_PREDICATE)
1198 predicate *p1 = as_a<predicate *>(o1);
1199 predicate *p2 = as_a<predicate *>(o2);
1200 return p1->p == p2->p;
1202 else if (o1->type == operand::OP_EXPR)
1204 expr *e1 = static_cast<expr *>(o1);
1205 expr *e2 = static_cast<expr *>(o2);
1206 return (e1->operation == e2->operation
1207 && e1->is_generic == e2->is_generic);
1209 else
1210 return false;
1213 /* Compare two decision tree nodes N1 and N2 and return true if they
1214 are equal. */
1216 bool
1217 decision_tree::cmp_node (dt_node *n1, dt_node *n2)
1219 if (!n1 || !n2 || n1->type != n2->type)
1220 return false;
1222 if (n1 == n2)
1223 return true;
1225 if (n1->type == dt_node::DT_TRUE)
1226 return false;
1228 if (n1->type == dt_node::DT_OPERAND)
1229 return cmp_operand ((as_a<dt_operand *> (n1))->op,
1230 (as_a<dt_operand *> (n2))->op);
1231 else if (n1->type == dt_node::DT_MATCH)
1232 return ((as_a<dt_operand *> (n1))->match_dop
1233 == (as_a<dt_operand *> (n2))->match_dop);
1234 return false;
1237 /* Search OPS for a decision tree node like P and return it if found. */
1239 dt_node *
1240 decision_tree::find_node (vec<dt_node *>& ops, dt_node *p)
1242 /* We can merge adjacent DT_TRUE. */
1243 if (p->type == dt_node::DT_TRUE
1244 && !ops.is_empty ()
1245 && ops.last ()->type == dt_node::DT_TRUE)
1246 return ops.last ();
1247 for (int i = ops.length () - 1; i >= 0; --i)
1249 /* But we can't merge across DT_TRUE nodes as they serve as
1250 pattern order barriers to make sure that patterns apply
1251 in order of appearance in case multiple matches are possible. */
1252 if (ops[i]->type == dt_node::DT_TRUE)
1253 return NULL;
1254 if (decision_tree::cmp_node (ops[i], p))
1255 return ops[i];
1257 return NULL;
1260 /* Append N to the decision tree if it there is not already an existing
1261 identical child. */
1263 dt_node *
1264 dt_node::append_node (dt_node *n)
1266 dt_node *kid;
1268 kid = decision_tree::find_node (kids, n);
1269 if (kid)
1270 return kid;
1272 kids.safe_push (n);
1273 n->level = this->level + 1;
1275 return n;
1278 /* Append OP to the decision tree. */
1280 dt_node *
1281 dt_node::append_op (operand *op, dt_node *parent, unsigned pos)
1283 dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1284 dt_operand *n = new dt_operand (DT_OPERAND, op, 0, parent_, pos);
1285 return append_node (n);
1288 /* Append a DT_TRUE decision tree node. */
1290 dt_node *
1291 dt_node::append_true_op (dt_node *parent, unsigned pos)
1293 dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1294 dt_operand *n = new dt_operand (DT_TRUE, 0, 0, parent_, pos);
1295 return append_node (n);
1298 /* Append a DT_MATCH decision tree node. */
1300 dt_node *
1301 dt_node::append_match_op (dt_operand *match_dop, dt_node *parent, unsigned pos)
1303 dt_operand *parent_ = as_a<dt_operand *> (parent);
1304 dt_operand *n = new dt_operand (DT_MATCH, 0, match_dop, parent_, pos);
1305 return append_node (n);
1308 /* Append S to the decision tree. */
1310 dt_node *
1311 dt_node::append_simplify (simplify *s, unsigned pattern_no,
1312 dt_operand **indexes)
1314 dt_simplify *n = new dt_simplify (s, pattern_no, indexes);
1315 return append_node (n);
1318 /* Insert O into the decision tree and return the decision tree node found
1319 or created. */
1321 dt_node *
1322 decision_tree::insert_operand (dt_node *p, operand *o, dt_operand **indexes,
1323 unsigned pos, dt_node *parent)
1325 dt_node *q, *elm = 0;
1327 if (capture *c = dyn_cast<capture *> (o))
1329 unsigned capt_index = c->where;
1331 if (indexes[capt_index] == 0)
1333 if (c->what)
1334 q = insert_operand (p, c->what, indexes, pos, parent);
1335 else
1337 q = elm = p->append_true_op (parent, pos);
1338 goto at_assert_elm;
1340 // get to the last capture
1341 for (operand *what = c->what;
1342 what && is_a<capture *> (what);
1343 c = as_a<capture *> (what), what = c->what)
1346 if (!c->what)
1348 unsigned cc_index = c->where;
1349 dt_operand *match_op = indexes[cc_index];
1351 dt_operand temp (dt_node::DT_TRUE, 0, 0);
1352 elm = decision_tree::find_node (p->kids, &temp);
1354 if (elm == 0)
1356 dt_operand temp (dt_node::DT_MATCH, 0, match_op);
1357 elm = decision_tree::find_node (p->kids, &temp);
1360 else
1362 dt_operand temp (dt_node::DT_OPERAND, c->what, 0);
1363 elm = decision_tree::find_node (p->kids, &temp);
1366 at_assert_elm:
1367 gcc_assert (elm->type == dt_node::DT_TRUE
1368 || elm->type == dt_node::DT_OPERAND
1369 || elm->type == dt_node::DT_MATCH);
1370 indexes[capt_index] = static_cast<dt_operand *> (elm);
1371 return q;
1373 else
1375 p = p->append_match_op (indexes[capt_index], parent, pos);
1376 if (c->what)
1377 return insert_operand (p, c->what, indexes, 0, p);
1378 else
1379 return p;
1382 p = p->append_op (o, parent, pos);
1383 q = p;
1385 if (expr *e = dyn_cast <expr *>(o))
1387 for (unsigned i = 0; i < e->ops.length (); ++i)
1388 q = decision_tree::insert_operand (q, e->ops[i], indexes, i, p);
1391 return q;
1394 /* Insert S into the decision tree. */
1396 void
1397 decision_tree::insert (struct simplify *s, unsigned pattern_no)
1399 dt_operand **indexes = XCNEWVEC (dt_operand *, s->capture_max + 1);
1400 dt_node *p = decision_tree::insert_operand (root, s->match, indexes);
1401 p->append_simplify (s, pattern_no, indexes);
1404 /* Debug functions to dump the decision tree. */
1406 DEBUG_FUNCTION void
1407 decision_tree::print_node (dt_node *p, FILE *f, unsigned indent)
1409 if (p->type == dt_node::DT_NODE)
1410 fprintf (f, "root");
1411 else
1413 fprintf (f, "|");
1414 for (unsigned i = 0; i < indent; i++)
1415 fprintf (f, "-");
1417 if (p->type == dt_node::DT_OPERAND)
1419 dt_operand *dop = static_cast<dt_operand *>(p);
1420 print_operand (dop->op, f, true);
1422 else if (p->type == dt_node::DT_TRUE)
1423 fprintf (f, "true");
1424 else if (p->type == dt_node::DT_MATCH)
1425 fprintf (f, "match (%p)", (void *)((as_a<dt_operand *>(p))->match_dop));
1426 else if (p->type == dt_node::DT_SIMPLIFY)
1428 dt_simplify *s = static_cast<dt_simplify *> (p);
1429 fprintf (f, "simplify_%u { ", s->pattern_no);
1430 for (int i = 0; i <= s->s->capture_max; ++i)
1431 fprintf (f, "%p, ", (void *) s->indexes[i]);
1432 fprintf (f, " } ");
1436 fprintf (stderr, " (%p), %u, %u\n", (void *) p, p->level, p->kids.length ());
1438 for (unsigned i = 0; i < p->kids.length (); ++i)
1439 decision_tree::print_node (p->kids[i], f, indent + 2);
1442 DEBUG_FUNCTION void
1443 decision_tree::print (FILE *f)
1445 return decision_tree::print_node (root, f);
1449 /* For GENERIC we have to take care of wrapping multiple-used
1450 expressions with side-effects in save_expr and preserve side-effects
1451 of expressions with omit_one_operand. Analyze captures in
1452 match, result and with expressions and perform early-outs
1453 on the outermost match expression operands for cases we cannot
1454 handle. */
1456 struct capture_info
1458 capture_info (simplify *s);
1459 void walk_match (operand *o, unsigned toplevel_arg, bool, bool);
1460 void walk_result (operand *o, bool);
1461 void walk_c_expr (c_expr *);
1463 struct cinfo
1465 bool expr_p;
1466 bool cse_p;
1467 bool force_no_side_effects_p;
1468 bool cond_expr_cond_p;
1469 unsigned long toplevel_msk;
1470 int result_use_count;
1473 auto_vec<cinfo> info;
1474 unsigned long force_no_side_effects;
1477 /* Analyze captures in S. */
1479 capture_info::capture_info (simplify *s)
1481 expr *e;
1482 if (!s->result
1483 || ((e = dyn_cast <expr *> (s->result))
1484 && is_a <predicate_id *> (e->operation)))
1486 force_no_side_effects = -1;
1487 return;
1490 force_no_side_effects = 0;
1491 info.safe_grow_cleared (s->capture_max + 1);
1492 e = as_a <expr *> (s->match);
1493 for (unsigned i = 0; i < e->ops.length (); ++i)
1494 walk_match (e->ops[i], i,
1495 (i != 0 && *e->operation == COND_EXPR)
1496 || *e->operation == TRUTH_ANDIF_EXPR
1497 || *e->operation == TRUTH_ORIF_EXPR,
1498 i == 0
1499 && (*e->operation == COND_EXPR
1500 || *e->operation == VEC_COND_EXPR));
1502 walk_result (s->result, false);
1504 for (unsigned i = 0; i < s->ifexpr_vec.length (); ++i)
1505 if (s->ifexpr_vec[i].is_with)
1506 walk_c_expr (as_a <c_expr *>(s->ifexpr_vec[i].cexpr));
1509 /* Analyze captures in the match expression piece O. */
1511 void
1512 capture_info::walk_match (operand *o, unsigned toplevel_arg,
1513 bool conditional_p, bool cond_expr_cond_p)
1515 if (capture *c = dyn_cast <capture *> (o))
1517 info[c->where].toplevel_msk |= 1 << toplevel_arg;
1518 info[c->where].force_no_side_effects_p |= conditional_p;
1519 info[c->where].cond_expr_cond_p |= cond_expr_cond_p;
1520 /* Mark expr (non-leaf) captures and recurse. */
1521 if (c->what
1522 && is_a <expr *> (c->what))
1524 info[c->where].expr_p = true;
1525 walk_match (c->what, toplevel_arg, conditional_p, false);
1528 else if (expr *e = dyn_cast <expr *> (o))
1530 for (unsigned i = 0; i < e->ops.length (); ++i)
1532 bool cond_p = conditional_p;
1533 bool cond_expr_cond_p = false;
1534 if (i != 0 && *e->operation == COND_EXPR)
1535 cond_p = true;
1536 else if (*e->operation == TRUTH_ANDIF_EXPR
1537 || *e->operation == TRUTH_ORIF_EXPR)
1538 cond_p = true;
1539 if (i == 0
1540 && (*e->operation == COND_EXPR
1541 || *e->operation == VEC_COND_EXPR))
1542 cond_expr_cond_p = true;
1543 walk_match (e->ops[i], toplevel_arg, cond_p, cond_expr_cond_p);
1546 else if (is_a <predicate *> (o))
1548 /* Mark non-captured leafs toplevel arg for checking. */
1549 force_no_side_effects |= 1 << toplevel_arg;
1551 else
1552 gcc_unreachable ();
1555 /* Analyze captures in the result expression piece O. */
1557 void
1558 capture_info::walk_result (operand *o, bool conditional_p)
1560 if (capture *c = dyn_cast <capture *> (o))
1562 info[c->where].result_use_count++;
1563 /* If we substitute an expression capture we don't know
1564 which captures this will end up using (well, we don't
1565 compute that). Force the uses to be side-effect free
1566 which means forcing the toplevels that reach the
1567 expression side-effect free. */
1568 if (info[c->where].expr_p)
1569 force_no_side_effects |= info[c->where].toplevel_msk;
1570 /* Mark CSE capture capture uses as forced to have
1571 no side-effects. */
1572 if (c->what
1573 && is_a <expr *> (c->what))
1575 info[c->where].cse_p = true;
1576 walk_result (c->what, true);
1579 else if (expr *e = dyn_cast <expr *> (o))
1581 for (unsigned i = 0; i < e->ops.length (); ++i)
1583 bool cond_p = conditional_p;
1584 if (i != 0 && *e->operation == COND_EXPR)
1585 cond_p = true;
1586 else if (*e->operation == TRUTH_ANDIF_EXPR
1587 || *e->operation == TRUTH_ORIF_EXPR)
1588 cond_p = true;
1589 walk_result (e->ops[i], cond_p);
1592 else if (c_expr *e = dyn_cast <c_expr *> (o))
1593 walk_c_expr (e);
1594 else
1595 gcc_unreachable ();
1598 /* Look for captures in the C expr E. */
1600 void
1601 capture_info::walk_c_expr (c_expr *e)
1603 /* Give up for C exprs mentioning captures not inside TREE_TYPE (). */
1604 unsigned p_depth = 0;
1605 for (unsigned i = 0; i < e->code.length (); ++i)
1607 const cpp_token *t = &e->code[i];
1608 const cpp_token *n = i < e->code.length () - 1 ? &e->code[i+1] : NULL;
1609 if (t->type == CPP_NAME
1610 && strcmp ((const char *)CPP_HASHNODE
1611 (t->val.node.node)->ident.str, "TREE_TYPE") == 0
1612 && n->type == CPP_OPEN_PAREN)
1613 p_depth++;
1614 else if (t->type == CPP_CLOSE_PAREN
1615 && p_depth > 0)
1616 p_depth--;
1617 else if (p_depth == 0
1618 && t->type == CPP_ATSIGN
1619 && (n->type == CPP_NUMBER
1620 || n->type == CPP_NAME)
1621 && !(n->flags & PREV_WHITE))
1623 const char *id;
1624 if (n->type == CPP_NUMBER)
1625 id = (const char *)n->val.str.text;
1626 else
1627 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
1628 info[*e->capture_ids->get(id)].force_no_side_effects_p = true;
1634 /* Code generation off the decision tree and the refered AST nodes. */
1636 bool
1637 is_conversion (id_base *op)
1639 return (*op == CONVERT_EXPR
1640 || *op == NOP_EXPR
1641 || *op == FLOAT_EXPR
1642 || *op == FIX_TRUNC_EXPR
1643 || *op == VIEW_CONVERT_EXPR);
1646 /* Get the type to be used for generating operands of OP from the
1647 various sources. */
1649 static const char *
1650 get_operand_type (id_base *op, const char *in_type,
1651 const char *expr_type,
1652 const char *other_oprnd_type)
1654 /* Generally operands whose type does not match the type of the
1655 expression generated need to know their types but match and
1656 thus can fall back to 'other_oprnd_type'. */
1657 if (is_conversion (op))
1658 return other_oprnd_type;
1659 else if (*op == REALPART_EXPR
1660 || *op == IMAGPART_EXPR)
1661 return other_oprnd_type;
1662 else if (is_a <operator_id *> (op)
1663 && strcmp (as_a <operator_id *> (op)->tcc, "tcc_comparison") == 0)
1664 return other_oprnd_type;
1665 else
1667 /* Otherwise all types should match - choose one in order of
1668 preference. */
1669 if (expr_type)
1670 return expr_type;
1671 else if (in_type)
1672 return in_type;
1673 else
1674 return other_oprnd_type;
1678 /* Generate transform code for an expression. */
1680 void
1681 expr::gen_transform (FILE *f, const char *dest, bool gimple, int depth,
1682 const char *in_type, capture_info *cinfo,
1683 dt_operand **indexes, bool)
1685 bool conversion_p = is_conversion (operation);
1686 const char *type = expr_type;
1687 char optype[64];
1688 if (type)
1689 /* If there was a type specification in the pattern use it. */
1691 else if (conversion_p)
1692 /* For conversions we need to build the expression using the
1693 outer type passed in. */
1694 type = in_type;
1695 else if (*operation == REALPART_EXPR
1696 || *operation == IMAGPART_EXPR)
1698 /* __real and __imag use the component type of its operand. */
1699 sprintf (optype, "TREE_TYPE (TREE_TYPE (ops%d[0]))", depth);
1700 type = optype;
1702 else if (is_a <operator_id *> (operation)
1703 && !strcmp (as_a <operator_id *> (operation)->tcc, "tcc_comparison"))
1705 /* comparisons use boolean_type_node (or what gets in), but
1706 their operands need to figure out the types themselves. */
1707 sprintf (optype, "boolean_type_node");
1708 type = optype;
1710 else
1712 /* Other operations are of the same type as their first operand. */
1713 sprintf (optype, "TREE_TYPE (ops%d[0])", depth);
1714 type = optype;
1716 if (!type)
1717 fatal ("two conversions in a row");
1719 fprintf (f, "{\n");
1720 fprintf (f, " tree ops%d[%u], res;\n", depth, ops.length ());
1721 char op0type[64];
1722 snprintf (op0type, 64, "TREE_TYPE (ops%d[0])", depth);
1723 for (unsigned i = 0; i < ops.length (); ++i)
1725 char dest[32];
1726 snprintf (dest, 32, " ops%d[%u]", depth, i);
1727 const char *optype
1728 = get_operand_type (operation, in_type, expr_type,
1729 i == 0 ? NULL : op0type);
1730 ops[i]->gen_transform (f, dest, gimple, depth + 1, optype, cinfo, indexes,
1731 ((!(*operation == COND_EXPR)
1732 && !(*operation == VEC_COND_EXPR))
1733 || i != 0));
1736 const char *opr;
1737 if (*operation == CONVERT_EXPR)
1738 opr = "NOP_EXPR";
1739 else
1740 opr = operation->id;
1742 if (gimple)
1744 /* ??? Have another helper that is like gimple_build but may
1745 fail if seq == NULL. */
1746 fprintf (f, " if (!seq)\n"
1747 " {\n"
1748 " res = gimple_simplify (%s, %s", opr, type);
1749 for (unsigned i = 0; i < ops.length (); ++i)
1750 fprintf (f, ", ops%d[%u]", depth, i);
1751 fprintf (f, ", seq, valueize);\n");
1752 fprintf (f, " if (!res) return false;\n");
1753 fprintf (f, " }\n");
1754 fprintf (f, " else\n");
1755 fprintf (f, " res = gimple_build (seq, UNKNOWN_LOCATION, %s, %s",
1756 opr, type);
1757 for (unsigned i = 0; i < ops.length (); ++i)
1758 fprintf (f, ", ops%d[%u]", depth, i);
1759 fprintf (f, ", valueize);\n");
1761 else
1763 if (operation->kind == id_base::CODE)
1764 fprintf (f, " res = fold_build%d_loc (loc, %s, %s",
1765 ops.length(), opr, type);
1766 else
1767 fprintf (f, " res = build_call_expr_loc (loc, "
1768 "builtin_decl_implicit (%s), %d", opr, ops.length());
1769 for (unsigned i = 0; i < ops.length (); ++i)
1770 fprintf (f, ", ops%d[%u]", depth, i);
1771 fprintf (f, ");\n");
1773 fprintf (f, " %s = res;\n", dest);
1774 fprintf (f, "}\n");
1777 /* Generate code for a c_expr which is either the expression inside
1778 an if statement or a sequence of statements which computes a
1779 result to be stored to DEST. */
1781 void
1782 c_expr::gen_transform (FILE *f, const char *dest,
1783 bool, int, const char *, capture_info *,
1784 dt_operand **, bool)
1786 if (dest && nr_stmts == 1)
1787 fprintf (f, "%s = ", dest);
1789 unsigned stmt_nr = 1;
1790 for (unsigned i = 0; i < code.length (); ++i)
1792 const cpp_token *token = &code[i];
1794 /* Replace captures for code-gen. */
1795 if (token->type == CPP_ATSIGN)
1797 const cpp_token *n = &code[i+1];
1798 if ((n->type == CPP_NUMBER
1799 || n->type == CPP_NAME)
1800 && !(n->flags & PREV_WHITE))
1802 if (token->flags & PREV_WHITE)
1803 fputc (' ', f);
1804 const char *id;
1805 if (n->type == CPP_NUMBER)
1806 id = (const char *)n->val.str.text;
1807 else
1808 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
1809 fprintf (f, "captures[%u]", *capture_ids->get(id));
1810 ++i;
1811 continue;
1815 if (token->flags & PREV_WHITE)
1816 fputc (' ', f);
1818 if (token->type == CPP_NAME)
1820 const char *id = (const char *) NODE_NAME (token->val.node.node);
1821 unsigned j;
1822 for (j = 0; j < ids.length (); ++j)
1824 if (strcmp (id, ids[j].id) == 0)
1826 fprintf (f, "%s", ids[j].oper);
1827 break;
1830 if (j < ids.length ())
1831 continue;
1834 /* Output the token as string. */
1835 char *tk = (char *)cpp_token_as_text (r, token);
1836 fputs (tk, f);
1838 if (token->type == CPP_SEMICOLON)
1840 stmt_nr++;
1841 if (dest && stmt_nr == nr_stmts)
1842 fprintf (f, "\n %s = ", dest);
1843 else
1844 fputc ('\n', f);
1849 /* Generate transform code for a capture. */
1851 void
1852 capture::gen_transform (FILE *f, const char *dest, bool gimple, int depth,
1853 const char *in_type, capture_info *cinfo,
1854 dt_operand **indexes, bool expand_compares)
1856 if (what && is_a<expr *> (what))
1858 if (indexes[where] == 0)
1860 char buf[20];
1861 sprintf (buf, "captures[%u]", where);
1862 what->gen_transform (f, buf, gimple, depth, in_type, cinfo, NULL);
1866 fprintf (f, "%s = captures[%u];\n", dest, where);
1868 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
1869 with substituting a capture of that.
1870 ??? Returning false here will also not allow any other patterns
1871 to match. */
1872 if (gimple && expand_compares
1873 && cinfo->info[where].cond_expr_cond_p)
1874 fprintf (f, "if (COMPARISON_CLASS_P (%s))\n"
1875 " {\n"
1876 " if (!seq) return false;\n"
1877 " %s = gimple_build (seq, TREE_CODE (%s),"
1878 " TREE_TYPE (%s), TREE_OPERAND (%s, 0),"
1879 " TREE_OPERAND (%s, 1));\n"
1880 " }\n", dest, dest, dest, dest, dest, dest);
1883 /* Return the name of the operand representing the decision tree node.
1884 Use NAME as space to generate it. */
1886 char *
1887 dt_operand::get_name (char *name)
1889 if (!parent)
1890 sprintf (name, "t");
1891 else if (parent->level == 1)
1892 sprintf (name, "op%u", pos);
1893 else if (parent->type == dt_node::DT_MATCH)
1894 return parent->get_name (name);
1895 else
1896 sprintf (name, "o%u%u", parent->level, pos);
1897 return name;
1900 /* Fill NAME with the operand name at position POS. */
1902 void
1903 dt_operand::gen_opname (char *name, unsigned pos)
1905 if (!parent)
1906 sprintf (name, "op%u", pos);
1907 else
1908 sprintf (name, "o%u%u", level, pos);
1911 /* Generate matching code for the decision tree operand which is
1912 a predicate. */
1914 unsigned
1915 dt_operand::gen_predicate (FILE *f, const char *opname, bool gimple)
1917 predicate *p = as_a <predicate *> (op);
1919 if (p->p->matchers.exists ())
1921 /* If this is a predicate generated from a pattern mangle its
1922 name and pass on the valueize hook. */
1923 if (gimple)
1924 fprintf (f, "if (gimple_%s (%s, valueize))\n", p->p->id, opname);
1925 else
1926 fprintf (f, "if (tree_%s (%s))\n", p->p->id, opname);
1928 else
1929 fprintf (f, "if (%s (%s))\n", p->p->id, opname);
1930 fprintf (f, "{\n");
1931 return 1;
1934 /* Generate matching code for the decision tree operand which is
1935 a capture-match. */
1937 unsigned
1938 dt_operand::gen_match_op (FILE *f, const char *opname)
1940 char match_opname[20];
1941 match_dop->get_name (match_opname);
1942 fprintf (f, "if (%s == %s || operand_equal_p (%s, %s, 0))\n",
1943 opname, match_opname, opname, match_opname);
1944 fprintf (f, "{\n");
1945 return 1;
1948 /* Generate GIMPLE matching code for the decision tree operand. */
1950 unsigned
1951 dt_operand::gen_gimple_expr (FILE *f)
1953 expr *e = static_cast<expr *> (op);
1954 id_base *id = e->operation;
1955 unsigned n_ops = e->ops.length ();
1957 for (unsigned i = 0; i < n_ops; ++i)
1959 char child_opname[20];
1960 gen_opname (child_opname, i);
1962 if (id->kind == id_base::CODE)
1964 if (e->is_generic
1965 || *id == REALPART_EXPR || *id == IMAGPART_EXPR
1966 || *id == BIT_FIELD_REF || *id == VIEW_CONVERT_EXPR)
1968 /* ??? If this is a memory operation we can't (and should not)
1969 match this. The only sensible operand types are
1970 SSA names and invariants. */
1971 fprintf (f, "tree %s = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), %i);\n",
1972 child_opname, i);
1973 fprintf (f, "if ((TREE_CODE (%s) == SSA_NAME\n"
1974 "|| is_gimple_min_invariant (%s))\n"
1975 "&& (%s = do_valueize (valueize, %s)))\n"
1976 "{\n", child_opname, child_opname, child_opname,
1977 child_opname);
1978 continue;
1980 else
1981 fprintf (f, "tree %s = gimple_assign_rhs%u (def_stmt);\n",
1982 child_opname, i + 1);
1984 else
1985 fprintf (f, "tree %s = gimple_call_arg (def_stmt, %u);\n",
1986 child_opname, i);
1987 fprintf (f, "if ((%s = do_valueize (valueize, %s)))\n",
1988 child_opname, child_opname);
1989 fprintf (f, "{\n");
1992 return n_ops;
1995 /* Generate GENERIC matching code for the decision tree operand. */
1997 unsigned
1998 dt_operand::gen_generic_expr (FILE *f, const char *opname)
2000 expr *e = static_cast<expr *> (op);
2001 unsigned n_ops = e->ops.length ();
2003 for (unsigned i = 0; i < n_ops; ++i)
2005 char child_opname[20];
2006 gen_opname (child_opname, i);
2008 if (e->operation->kind == id_base::CODE)
2009 fprintf (f, "tree %s = TREE_OPERAND (%s, %u);\n",
2010 child_opname, opname, i);
2011 else
2012 fprintf (f, "tree %s = CALL_EXPR_ARG (%s, %u);\n",
2013 child_opname, opname, i);
2016 return 0;
2019 /* Generate matching code for the children of the decision tree node. */
2021 void
2022 dt_node::gen_kids (FILE *f, bool gimple)
2024 auto_vec<dt_operand *> gimple_exprs;
2025 auto_vec<dt_operand *> generic_exprs;
2026 auto_vec<dt_operand *> fns;
2027 auto_vec<dt_operand *> generic_fns;
2028 auto_vec<dt_operand *> preds;
2029 auto_vec<dt_node *> others;
2031 for (unsigned i = 0; i < kids.length (); ++i)
2033 if (kids[i]->type == dt_node::DT_OPERAND)
2035 dt_operand *op = as_a<dt_operand *> (kids[i]);
2036 if (expr *e = dyn_cast <expr *> (op->op))
2038 if (e->ops.length () == 0
2039 && (!gimple || !(*e->operation == CONSTRUCTOR)))
2040 generic_exprs.safe_push (op);
2041 else if (e->operation->kind == id_base::FN)
2043 if (gimple)
2044 fns.safe_push (op);
2045 else
2046 generic_fns.safe_push (op);
2048 else if (e->operation->kind == id_base::PREDICATE)
2049 preds.safe_push (op);
2050 else
2052 if (gimple)
2053 gimple_exprs.safe_push (op);
2054 else
2055 generic_exprs.safe_push (op);
2058 else if (op->op->type == operand::OP_PREDICATE)
2059 others.safe_push (kids[i]);
2060 else
2061 gcc_unreachable ();
2063 else if (kids[i]->type == dt_node::DT_MATCH
2064 || kids[i]->type == dt_node::DT_SIMPLIFY)
2065 others.safe_push (kids[i]);
2066 else if (kids[i]->type == dt_node::DT_TRUE)
2068 /* A DT_TRUE operand serves as a barrier - generate code now
2069 for what we have collected sofar. */
2070 gen_kids_1 (f, gimple, gimple_exprs, generic_exprs,
2071 fns, generic_fns, preds, others);
2072 /* And output the true operand itself. */
2073 kids[i]->gen (f, gimple);
2074 gimple_exprs.truncate (0);
2075 generic_exprs.truncate (0);
2076 fns.truncate (0);
2077 generic_fns.truncate (0);
2078 preds.truncate (0);
2079 others.truncate (0);
2081 else
2082 gcc_unreachable ();
2085 /* Generate code for the remains. */
2086 gen_kids_1 (f, gimple, gimple_exprs, generic_exprs,
2087 fns, generic_fns, preds, others);
2090 /* Generate matching code for the children of the decision tree node. */
2092 void
2093 dt_node::gen_kids_1 (FILE *f, bool gimple,
2094 vec<dt_operand *> gimple_exprs,
2095 vec<dt_operand *> generic_exprs,
2096 vec<dt_operand *> fns,
2097 vec<dt_operand *> generic_fns,
2098 vec<dt_operand *> preds,
2099 vec<dt_node *> others)
2101 char buf[128];
2102 char *kid_opname = buf;
2104 unsigned exprs_len = gimple_exprs.length ();
2105 unsigned gexprs_len = generic_exprs.length ();
2106 unsigned fns_len = fns.length ();
2107 unsigned gfns_len = generic_fns.length ();
2109 if (exprs_len || fns_len || gexprs_len || gfns_len)
2111 if (exprs_len)
2112 gimple_exprs[0]->get_name (kid_opname);
2113 else if (fns_len)
2114 fns[0]->get_name (kid_opname);
2115 else if (gfns_len)
2116 generic_fns[0]->get_name (kid_opname);
2117 else
2118 generic_exprs[0]->get_name (kid_opname);
2120 fprintf (f, "switch (TREE_CODE (%s))\n"
2121 "{\n", kid_opname);
2124 if (exprs_len || fns_len)
2126 fprintf (f, "case SSA_NAME:\n");
2127 fprintf (f, "if (do_valueize (valueize, %s) != NULL_TREE)\n", kid_opname);
2128 fprintf (f, "{\n");
2129 fprintf (f, "gimple def_stmt = SSA_NAME_DEF_STMT (%s);\n", kid_opname);
2131 if (exprs_len)
2133 fprintf (f, "if (is_gimple_assign (def_stmt))\n");
2134 fprintf (f, "switch (gimple_assign_rhs_code (def_stmt))\n"
2135 "{\n");
2136 for (unsigned i = 0; i < exprs_len; ++i)
2138 expr *e = as_a <expr *> (gimple_exprs[i]->op);
2139 id_base *op = e->operation;
2140 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2141 fprintf (f, "CASE_CONVERT:\n");
2142 else
2143 fprintf (f, "case %s:\n", op->id);
2144 fprintf (f, "{\n");
2145 gimple_exprs[i]->gen (f, true);
2146 fprintf (f, "break;\n"
2147 "}\n");
2149 fprintf (f, "default:;\n"
2150 "}\n");
2153 if (fns_len)
2155 if (exprs_len)
2156 fprintf (f, "else ");
2158 fprintf (f, "if (gimple_call_builtin_p (def_stmt, BUILT_IN_NORMAL))\n"
2159 "{\n"
2160 "tree fndecl = gimple_call_fndecl (def_stmt);\n"
2161 "switch (DECL_FUNCTION_CODE (fndecl))\n"
2162 "{\n");
2164 for (unsigned i = 0; i < fns_len; ++i)
2166 expr *e = as_a <expr *>(fns[i]->op);
2167 fprintf (f, "case %s:\n"
2168 "{\n", e->operation->id);
2169 fns[i]->gen (f, true);
2170 fprintf (f, "break;\n"
2171 "}\n");
2174 fprintf (f, "default:;\n"
2175 "}\n"
2176 "}\n");
2179 fprintf (f, "}\n"
2180 "break;\n");
2183 for (unsigned i = 0; i < generic_exprs.length (); ++i)
2185 expr *e = as_a <expr *>(generic_exprs[i]->op);
2186 id_base *op = e->operation;
2187 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2188 fprintf (f, "CASE_CONVERT:\n");
2189 else
2190 fprintf (f, "case %s:\n", op->id);
2191 fprintf (f, "{\n");
2192 generic_exprs[i]->gen (f, gimple);
2193 fprintf (f, "break;\n"
2194 "}\n");
2197 if (gfns_len)
2199 fprintf (f, "case CALL_EXPR:\n"
2200 "{\n"
2201 "tree fndecl = get_callee_fndecl (%s);\n"
2202 "if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)\n"
2203 "switch (DECL_FUNCTION_CODE (fndecl))\n"
2204 "{\n", kid_opname);
2206 for (unsigned j = 0; j < generic_fns.length (); ++j)
2208 expr *e = as_a <expr *>(generic_fns[j]->op);
2209 gcc_assert (e->operation->kind == id_base::FN);
2211 fprintf (f, "case %s:\n"
2212 "{\n", e->operation->id);
2213 generic_fns[j]->gen (f, false);
2214 fprintf (f, "break;\n"
2215 "}\n");
2218 fprintf (f, "default:;\n"
2219 "}\n"
2220 "break;\n"
2221 "}\n");
2224 /* Close switch (TREE_CODE ()). */
2225 if (exprs_len || fns_len || gexprs_len || gfns_len)
2226 fprintf (f, "default:;\n"
2227 "}\n");
2229 for (unsigned i = 0; i < preds.length (); ++i)
2231 expr *e = as_a <expr *> (preds[i]->op);
2232 predicate_id *p = as_a <predicate_id *> (e->operation);
2233 preds[i]->get_name (kid_opname);
2234 fprintf (f, "tree %s_pops[%d];\n", kid_opname, p->nargs);
2235 fprintf (f, "if (%s_%s (%s, %s_pops%s))\n",
2236 gimple ? "gimple" : "tree",
2237 p->id, kid_opname, kid_opname,
2238 gimple ? ", valueize" : "");
2239 fprintf (f, "{\n");
2240 for (int j = 0; j < p->nargs; ++j)
2242 char child_opname[20];
2243 preds[i]->gen_opname (child_opname, j);
2244 fprintf (f, "tree %s = %s_pops[%d];\n", child_opname, kid_opname, j);
2246 preds[i]->gen_kids (f, gimple);
2247 fprintf (f, "}\n");
2250 for (unsigned i = 0; i < others.length (); ++i)
2251 others[i]->gen (f, gimple);
2254 /* Generate matching code for the decision tree operand. */
2256 void
2257 dt_operand::gen (FILE *f, bool gimple)
2259 char opname[20];
2260 get_name (opname);
2262 unsigned n_braces = 0;
2264 if (type == DT_OPERAND)
2265 switch (op->type)
2267 case operand::OP_PREDICATE:
2268 n_braces = gen_predicate (f, opname, gimple);
2269 break;
2271 case operand::OP_EXPR:
2272 if (gimple)
2273 n_braces = gen_gimple_expr (f);
2274 else
2275 n_braces = gen_generic_expr (f, opname);
2276 break;
2278 default:
2279 gcc_unreachable ();
2281 else if (type == DT_TRUE)
2283 else if (type == DT_MATCH)
2284 n_braces = gen_match_op (f, opname);
2285 else
2286 gcc_unreachable ();
2288 gen_kids (f, gimple);
2290 for (unsigned i = 0; i < n_braces; ++i)
2291 fprintf (f, "}\n");
2296 /* Generate code for the '(if ...)', '(with ..)' and actual transform
2297 step of a '(simplify ...)' or '(match ...)'. This handles everything
2298 that is not part of the decision tree (simplify->match). */
2300 void
2301 dt_simplify::gen (FILE *f, bool gimple)
2303 fprintf (f, "{\n");
2304 output_line_directive (f, s->result_location);
2305 if (s->capture_max >= 0)
2306 fprintf (f, "tree captures[%u] ATTRIBUTE_UNUSED = {};\n",
2307 s->capture_max + 1);
2309 for (int i = 0; i <= s->capture_max; ++i)
2310 if (indexes[i])
2312 char opname[20];
2313 fprintf (f, "captures[%u] = %s;\n", i, indexes[i]->get_name (opname));
2316 unsigned n_braces = 0;
2317 if (s->ifexpr_vec != vNULL)
2319 for (unsigned i = 0; i < s->ifexpr_vec.length (); ++i)
2321 if_or_with &w = s->ifexpr_vec[i];
2322 if (w.is_with)
2324 fprintf (f, "{\n");
2325 output_line_directive (f, w.location);
2326 w.cexpr->gen_transform (f, NULL, true, 1, "type", NULL);
2327 n_braces++;
2329 else
2331 output_line_directive (f, w.location);
2332 fprintf (f, "if (");
2333 if (i == s->ifexpr_vec.length () - 1
2334 || s->ifexpr_vec[i+1].is_with)
2335 w.cexpr->gen_transform (f, NULL, true, 1, "type", NULL);
2336 else
2338 unsigned j = i;
2341 if (j != i)
2343 fprintf (f, "\n");
2344 output_line_directive (f, s->ifexpr_vec[j].location);
2345 fprintf (f, "&& ");
2347 fprintf (f, "(");
2348 s->ifexpr_vec[j].cexpr->gen_transform (f, NULL,
2349 true, 1, "type",
2350 NULL);
2351 fprintf (f, ")");
2352 ++j;
2354 while (j < s->ifexpr_vec.length ()
2355 && !s->ifexpr_vec[j].is_with);
2356 i = j - 1;
2358 fprintf (f, ")\n");
2361 fprintf (f, "{\n");
2362 n_braces++;
2365 /* Analyze captures and perform early-outs on the incoming arguments
2366 that cover cases we cannot handle. */
2367 capture_info cinfo (s);
2368 expr *e;
2369 if (!gimple
2370 && s->result
2371 && !((e = dyn_cast <expr *> (s->result))
2372 && is_a <predicate_id *> (e->operation)))
2374 for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
2375 if (cinfo.force_no_side_effects & (1 << i))
2376 fprintf (f, "if (TREE_SIDE_EFFECTS (op%d)) return NULL_TREE;\n", i);
2377 for (int i = 0; i <= s->capture_max; ++i)
2378 if (cinfo.info[i].cse_p)
2380 else if (cinfo.info[i].force_no_side_effects_p
2381 && (cinfo.info[i].toplevel_msk
2382 & cinfo.force_no_side_effects) == 0)
2383 fprintf (f, "if (TREE_SIDE_EFFECTS (captures[%d])) "
2384 "return NULL_TREE;\n", i);
2385 else if ((cinfo.info[i].toplevel_msk
2386 & cinfo.force_no_side_effects) != 0)
2387 /* Mark capture as having no side-effects if we had to verify
2388 that via forced toplevel operand checks. */
2389 cinfo.info[i].force_no_side_effects_p = true;
2392 fprintf (f, "if (dump_file && (dump_flags & TDF_DETAILS)) "
2393 "fprintf (dump_file, \"Applying pattern ");
2394 output_line_directive (f, s->result_location, true);
2395 fprintf (f, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
2397 operand *result = s->result;
2398 if (!result)
2400 /* If there is no result then this is a predicate implementation. */
2401 fprintf (f, "return true;\n");
2403 else if (gimple)
2405 /* For GIMPLE simply drop NON_LVALUE_EXPR (which only appears
2406 in outermost position). */
2407 if (result->type == operand::OP_EXPR
2408 && *as_a <expr *> (result)->operation == NON_LVALUE_EXPR)
2409 result = as_a <expr *> (result)->ops[0];
2410 if (result->type == operand::OP_EXPR)
2412 expr *e = as_a <expr *> (result);
2413 bool is_predicate = is_a <predicate_id *> (e->operation);
2414 if (!is_predicate)
2415 fprintf (f, "*res_code = %s;\n",
2416 *e->operation == CONVERT_EXPR
2417 ? "NOP_EXPR" : e->operation->id);
2418 for (unsigned j = 0; j < e->ops.length (); ++j)
2420 char dest[32];
2421 snprintf (dest, 32, " res_ops[%d]", j);
2422 const char *optype
2423 = get_operand_type (e->operation,
2424 "type", e->expr_type,
2425 j == 0
2426 ? NULL : "TREE_TYPE (res_ops[0])");
2427 /* We need to expand GENERIC conditions we captured from
2428 COND_EXPRs. */
2429 bool expand_generic_cond_exprs_p
2430 = (!is_predicate
2431 /* But avoid doing that if the GENERIC condition is
2432 valid - which it is in the first operand of COND_EXPRs
2433 and VEC_COND_EXRPs. */
2434 && ((!(*e->operation == COND_EXPR)
2435 && !(*e->operation == VEC_COND_EXPR))
2436 || j != 0));
2437 e->ops[j]->gen_transform (f, dest, true, 1, optype, &cinfo,
2438 indexes, expand_generic_cond_exprs_p);
2441 /* Re-fold the toplevel result. It's basically an embedded
2442 gimple_build w/o actually building the stmt. */
2443 if (!is_predicate)
2444 fprintf (f, "gimple_resimplify%d (seq, res_code, type, "
2445 "res_ops, valueize);\n", e->ops.length ());
2447 else if (result->type == operand::OP_CAPTURE
2448 || result->type == operand::OP_C_EXPR)
2450 result->gen_transform (f, "res_ops[0]", true, 1, "type",
2451 &cinfo, indexes, false);
2452 fprintf (f, "*res_code = TREE_CODE (res_ops[0]);\n");
2453 if (is_a <capture *> (result)
2454 && cinfo.info[as_a <capture *> (result)->where].cond_expr_cond_p)
2456 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
2457 with substituting a capture of that. */
2458 fprintf (f, "if (COMPARISON_CLASS_P (res_ops[0]))\n"
2459 " {\n"
2460 " tree tem = res_ops[0];\n"
2461 " res_ops[0] = TREE_OPERAND (tem, 0);\n"
2462 " res_ops[1] = TREE_OPERAND (tem, 1);\n"
2463 " }\n");
2466 else
2467 gcc_unreachable ();
2468 fprintf (f, "return true;\n");
2470 else /* GENERIC */
2472 bool is_predicate = false;
2473 if (result->type == operand::OP_EXPR)
2475 expr *e = as_a <expr *> (result);
2476 is_predicate = is_a <predicate_id *> (e->operation);
2477 /* Search for captures used multiple times in the result expression
2478 and dependent on TREE_SIDE_EFFECTS emit a SAVE_EXPR. */
2479 if (!is_predicate)
2480 for (int i = 0; i < s->capture_max + 1; ++i)
2482 if (!cinfo.info[i].force_no_side_effects_p
2483 && cinfo.info[i].result_use_count > 1)
2484 fprintf (f, " if (TREE_SIDE_EFFECTS (captures[%d]))\n"
2485 " captures[%d] = save_expr (captures[%d]);\n",
2486 i, i, i);
2488 for (unsigned j = 0; j < e->ops.length (); ++j)
2490 char dest[32];
2491 if (is_predicate)
2492 snprintf (dest, 32, "res_ops[%d]", j);
2493 else
2495 fprintf (f, " tree res_op%d;\n", j);
2496 snprintf (dest, 32, " res_op%d", j);
2498 const char *optype
2499 = get_operand_type (e->operation,
2500 "type", e->expr_type,
2501 j == 0
2502 ? NULL : "TREE_TYPE (res_op0)");
2503 e->ops[j]->gen_transform (f, dest, false, 1, optype,
2504 &cinfo, indexes);
2506 if (is_predicate)
2507 fprintf (f, "return true;\n");
2508 else
2510 fprintf (f, " tree res;\n");
2511 /* Re-fold the toplevel result. Use non_lvalue to
2512 build NON_LVALUE_EXPRs so they get properly
2513 ignored when in GIMPLE form. */
2514 if (*e->operation == NON_LVALUE_EXPR)
2515 fprintf (f, " res = non_lvalue_loc (loc, res_op0);\n");
2516 else
2518 if (e->operation->kind == id_base::CODE)
2519 fprintf (f, " res = fold_build%d_loc (loc, %s, type",
2520 e->ops.length (),
2521 *e->operation == CONVERT_EXPR
2522 ? "NOP_EXPR" : e->operation->id);
2523 else
2524 fprintf (f, " res = build_call_expr_loc "
2525 "(loc, builtin_decl_implicit (%s), %d",
2526 e->operation->id, e->ops.length());
2527 for (unsigned j = 0; j < e->ops.length (); ++j)
2528 fprintf (f, ", res_op%d", j);
2529 fprintf (f, ");\n");
2533 else if (result->type == operand::OP_CAPTURE
2534 || result->type == operand::OP_C_EXPR)
2537 fprintf (f, " tree res;\n");
2538 s->result->gen_transform (f, " res", false, 1, "type",
2539 &cinfo, indexes);
2541 else
2542 gcc_unreachable ();
2543 if (!is_predicate)
2545 /* Search for captures not used in the result expression and dependent
2546 on TREE_SIDE_EFFECTS emit omit_one_operand. */
2547 for (int i = 0; i < s->capture_max + 1; ++i)
2549 if (!cinfo.info[i].force_no_side_effects_p
2550 && !cinfo.info[i].expr_p
2551 && cinfo.info[i].result_use_count == 0)
2552 fprintf (f, " if (TREE_SIDE_EFFECTS (captures[%d]))\n"
2553 " res = build2_loc (loc, COMPOUND_EXPR, type,"
2554 " fold_ignored_result (captures[%d]), res);\n",
2555 i, i);
2557 fprintf (f, " return res;\n");
2561 for (unsigned i = 0; i < n_braces; ++i)
2562 fprintf (f, "}\n");
2564 fprintf (f, "}\n");
2567 /* Main entry to generate code for matching GIMPLE IL off the decision
2568 tree. */
2570 void
2571 decision_tree::gen_gimple (FILE *f)
2573 for (unsigned n = 1; n <= 3; ++n)
2575 fprintf (f, "\nstatic bool\n"
2576 "gimple_simplify (code_helper *res_code, tree *res_ops,\n"
2577 " gimple_seq *seq, tree (*valueize)(tree),\n"
2578 " code_helper code, tree type");
2579 for (unsigned i = 0; i < n; ++i)
2580 fprintf (f, ", tree op%d", i);
2581 fprintf (f, ")\n");
2582 fprintf (f, "{\n");
2584 fprintf (f, "switch (code.get_rep())\n"
2585 "{\n");
2586 for (unsigned i = 0; i < root->kids.length (); i++)
2588 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
2589 expr *e = static_cast<expr *>(dop->op);
2590 if (e->ops.length () != n)
2591 continue;
2593 if (*e->operation == CONVERT_EXPR
2594 || *e->operation == NOP_EXPR)
2595 fprintf (f, "CASE_CONVERT:\n");
2596 else
2597 fprintf (f, "case %s%s:\n",
2598 is_a <fn_id *> (e->operation) ? "-" : "",
2599 e->operation->id);
2600 fprintf (f, "{\n");
2601 dop->gen_kids (f, true);
2602 fprintf (f, "break;\n");
2603 fprintf (f, "}\n");
2605 fprintf (f, "default:;\n"
2606 "}\n");
2608 fprintf (f, "return false;\n");
2609 fprintf (f, "}\n");
2613 /* Main entry to generate code for matching GENERIC IL off the decision
2614 tree. */
2616 void
2617 decision_tree::gen_generic (FILE *f)
2619 for (unsigned n = 1; n <= 3; ++n)
2621 fprintf (f, "\ntree\n"
2622 "generic_simplify (location_t loc, enum tree_code code, "
2623 "tree type ATTRIBUTE_UNUSED");
2624 for (unsigned i = 0; i < n; ++i)
2625 fprintf (f, ", tree op%d", i);
2626 fprintf (f, ")\n");
2627 fprintf (f, "{\n");
2629 fprintf (f, "switch (code)\n"
2630 "{\n");
2631 for (unsigned i = 0; i < root->kids.length (); i++)
2633 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
2634 expr *e = static_cast<expr *>(dop->op);
2635 if (e->ops.length () != n
2636 /* Builtin simplifications are somewhat premature on
2637 GENERIC. The following drops patterns with outermost
2638 calls. It's easy to emit overloads for function code
2639 though if necessary. */
2640 || e->operation->kind != id_base::CODE)
2641 continue;
2643 operator_id *op_id = static_cast <operator_id *> (e->operation);
2644 if (op_id->code == NOP_EXPR || op_id->code == CONVERT_EXPR)
2645 fprintf (f, "CASE_CONVERT:\n");
2646 else
2647 fprintf (f, "case %s:\n", e->operation->id);
2648 fprintf (f, "{\n");
2649 dop->gen_kids (f, false);
2650 fprintf (f, "break;\n"
2651 "}\n");
2653 fprintf (f, "default:;\n"
2654 "}\n");
2656 fprintf (f, "return NULL_TREE;\n");
2657 fprintf (f, "}\n");
2661 /* Output code to implement the predicate P from the decision tree DT. */
2663 void
2664 write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple)
2666 fprintf (f, "\nbool\n"
2667 "%s%s (tree t%s%s)\n"
2668 "{\n", gimple ? "gimple_" : "tree_", p->id,
2669 p->nargs > 0 ? ", tree *res_ops" : "",
2670 gimple ? ", tree (*valueize)(tree)" : "");
2671 /* Conveniently make 'type' available. */
2672 fprintf (f, "tree type = TREE_TYPE (t);\n");
2674 if (!gimple)
2675 fprintf (f, "if (TREE_SIDE_EFFECTS (t)) return false;\n");
2676 dt.root->gen_kids (f, gimple);
2678 fprintf (f, "return false;\n"
2679 "}\n");
2682 /* Write the common header for the GIMPLE/GENERIC IL matching routines. */
2684 static void
2685 write_header (FILE *f, const char *head)
2687 fprintf (f, "/* Generated automatically by the program `genmatch' from\n");
2688 fprintf (f, " a IL pattern matching and simplification description. */\n");
2690 /* Include the header instead of writing it awkwardly quoted here. */
2691 fprintf (f, "\n#include \"%s\"\n", head);
2696 /* AST parsing. */
2698 class parser
2700 public:
2701 parser (cpp_reader *);
2703 private:
2704 const cpp_token *next ();
2705 const cpp_token *peek ();
2706 const cpp_token *peek_ident (const char * = NULL);
2707 const cpp_token *expect (enum cpp_ttype);
2708 void eat_token (enum cpp_ttype);
2709 const char *get_string ();
2710 const char *get_ident ();
2711 void eat_ident (const char *);
2712 const char *get_number ();
2714 id_base *parse_operation ();
2715 operand *parse_capture (operand *);
2716 operand *parse_expr ();
2717 c_expr *parse_c_expr (cpp_ttype);
2718 operand *parse_op ();
2720 void record_operlist (source_location, user_id *);
2722 void parse_pattern ();
2723 void push_simplify (vec<simplify *>&, operand *, source_location,
2724 operand *, source_location);
2725 void parse_simplify (source_location, vec<simplify *>&, predicate_id *,
2726 expr *);
2727 void parse_for (source_location);
2728 void parse_if (source_location);
2729 void parse_predicates (source_location);
2730 void parse_operator_list (source_location);
2732 cpp_reader *r;
2733 vec<if_or_with> active_ifs;
2734 vec<vec<user_id *> > active_fors;
2735 hash_set<user_id *> *oper_lists_set;
2736 vec<user_id *> oper_lists;
2738 cid_map_t *capture_ids;
2740 public:
2741 vec<simplify *> simplifiers;
2742 vec<predicate_id *> user_predicates;
2743 bool parsing_match_operand;
2746 /* Lexing helpers. */
2748 /* Read the next non-whitespace token from R. */
2750 const cpp_token *
2751 parser::next ()
2753 const cpp_token *token;
2756 token = cpp_get_token (r);
2758 while (token->type == CPP_PADDING
2759 && token->type != CPP_EOF);
2760 return token;
2763 /* Peek at the next non-whitespace token from R. */
2765 const cpp_token *
2766 parser::peek ()
2768 const cpp_token *token;
2769 unsigned i = 0;
2772 token = cpp_peek_token (r, i++);
2774 while (token->type == CPP_PADDING
2775 && token->type != CPP_EOF);
2776 /* If we peek at EOF this is a fatal error as it leaves the
2777 cpp_reader in unusable state. Assume we really wanted a
2778 token and thus this EOF is unexpected. */
2779 if (token->type == CPP_EOF)
2780 fatal_at (token, "unexpected end of file");
2781 return token;
2784 /* Peek at the next identifier token (or return NULL if the next
2785 token is not an identifier or equal to ID if supplied). */
2787 const cpp_token *
2788 parser::peek_ident (const char *id)
2790 const cpp_token *token = peek ();
2791 if (token->type != CPP_NAME)
2792 return 0;
2794 if (id == 0)
2795 return token;
2797 const char *t = (const char *) CPP_HASHNODE (token->val.node.node)->ident.str;
2798 if (strcmp (id, t) == 0)
2799 return token;
2801 return 0;
2804 /* Read the next token from R and assert it is of type TK. */
2806 const cpp_token *
2807 parser::expect (enum cpp_ttype tk)
2809 const cpp_token *token = next ();
2810 if (token->type != tk)
2811 fatal_at (token, "expected %s, got %s",
2812 cpp_type2name (tk, 0), cpp_type2name (token->type, 0));
2814 return token;
2817 /* Consume the next token from R and assert it is of type TK. */
2819 void
2820 parser::eat_token (enum cpp_ttype tk)
2822 expect (tk);
2825 /* Read the next token from R and assert it is of type CPP_STRING and
2826 return its value. */
2828 const char *
2829 parser::get_string ()
2831 const cpp_token *token = expect (CPP_STRING);
2832 return (const char *)token->val.str.text;
2835 /* Read the next token from R and assert it is of type CPP_NAME and
2836 return its value. */
2838 const char *
2839 parser::get_ident ()
2841 const cpp_token *token = expect (CPP_NAME);
2842 return (const char *)CPP_HASHNODE (token->val.node.node)->ident.str;
2845 /* Eat an identifier token with value S from R. */
2847 void
2848 parser::eat_ident (const char *s)
2850 const cpp_token *token = peek ();
2851 const char *t = get_ident ();
2852 if (strcmp (s, t) != 0)
2853 fatal_at (token, "expected '%s' got '%s'\n", s, t);
2856 /* Read the next token from R and assert it is of type CPP_NUMBER and
2857 return its value. */
2859 const char *
2860 parser::get_number ()
2862 const cpp_token *token = expect (CPP_NUMBER);
2863 return (const char *)token->val.str.text;
2867 /* Record an operator-list use for transparent for handling. */
2869 void
2870 parser::record_operlist (source_location loc, user_id *p)
2872 if (!oper_lists_set->add (p))
2874 if (!oper_lists.is_empty ()
2875 && oper_lists[0]->substitutes.length () != p->substitutes.length ())
2876 fatal_at (loc, "User-defined operator list does not have the "
2877 "same number of entries as others used in the pattern");
2878 oper_lists.safe_push (p);
2882 /* Parse the operator ID, special-casing convert?, convert1? and
2883 convert2? */
2885 id_base *
2886 parser::parse_operation ()
2888 const cpp_token *id_tok = peek ();
2889 const char *id = get_ident ();
2890 const cpp_token *token = peek ();
2891 if (strcmp (id, "convert0") == 0)
2892 fatal_at (id_tok, "use 'convert?' here");
2893 if (token->type == CPP_QUERY
2894 && !(token->flags & PREV_WHITE))
2896 if (strcmp (id, "convert") == 0)
2897 id = "convert0";
2898 else if (strcmp (id, "convert1") == 0)
2900 else if (strcmp (id, "convert2") == 0)
2902 else
2903 fatal_at (id_tok, "non-convert operator conditionalized");
2905 if (!parsing_match_operand)
2906 fatal_at (id_tok, "conditional convert can only be used in "
2907 "match expression");
2908 eat_token (CPP_QUERY);
2910 else if (strcmp (id, "convert1") == 0
2911 || strcmp (id, "convert2") == 0)
2912 fatal_at (id_tok, "expected '?' after conditional operator");
2913 id_base *op = get_operator (id);
2914 if (!op)
2915 fatal_at (id_tok, "unknown operator %s", id);
2917 user_id *p = dyn_cast<user_id *> (op);
2918 if (p && p->is_oper_list)
2919 record_operlist (id_tok->src_loc, p);
2920 return op;
2923 /* Parse a capture.
2924 capture = '@'<number> */
2926 struct operand *
2927 parser::parse_capture (operand *op)
2929 eat_token (CPP_ATSIGN);
2930 const cpp_token *token = peek ();
2931 const char *id = NULL;
2932 if (token->type == CPP_NUMBER)
2933 id = get_number ();
2934 else if (token->type == CPP_NAME)
2935 id = get_ident ();
2936 else
2937 fatal_at (token, "expected number or identifier");
2938 unsigned next_id = capture_ids->elements ();
2939 bool existed;
2940 unsigned &num = capture_ids->get_or_insert (id, &existed);
2941 if (!existed)
2942 num = next_id;
2943 return new capture (num, op);
2946 /* Parse an expression
2947 expr = '(' <operation>[capture][flag][type] <operand>... ')' */
2949 struct operand *
2950 parser::parse_expr ()
2952 expr *e = new expr (parse_operation ());
2953 const cpp_token *token = peek ();
2954 operand *op;
2955 bool is_commutative = false;
2956 const char *expr_type = NULL;
2958 if (token->type == CPP_COLON
2959 && !(token->flags & PREV_WHITE))
2961 eat_token (CPP_COLON);
2962 token = peek ();
2963 if (token->type == CPP_NAME
2964 && !(token->flags & PREV_WHITE))
2966 const char *s = get_ident ();
2967 if (s[0] == 'c' && !s[1])
2969 if (!parsing_match_operand)
2970 fatal_at (token,
2971 "flag 'c' can only be used in match expression");
2972 is_commutative = true;
2974 else if (s[1] != '\0')
2976 if (parsing_match_operand)
2977 fatal_at (token, "type can only be used in result expression");
2978 expr_type = s;
2980 else
2981 fatal_at (token, "flag %s not recognized", s);
2983 token = peek ();
2985 else
2986 fatal_at (token, "expected flag or type specifying identifier");
2989 if (token->type == CPP_ATSIGN
2990 && !(token->flags & PREV_WHITE))
2991 op = parse_capture (e);
2992 else
2993 op = e;
2996 const cpp_token *token = peek ();
2997 if (token->type == CPP_CLOSE_PAREN)
2999 if (e->operation->nargs != -1
3000 && e->operation->nargs != (int) e->ops.length ())
3001 fatal_at (token, "'%s' expects %u operands, not %u",
3002 e->operation->id, e->operation->nargs, e->ops.length ());
3003 if (is_commutative)
3005 if (e->ops.length () == 2)
3006 e->is_commutative = true;
3007 else
3008 fatal_at (token, "only binary operators or function with "
3009 "two arguments can be marked commutative");
3011 e->expr_type = expr_type;
3012 return op;
3014 e->append_op (parse_op ());
3016 while (1);
3019 /* Lex native C code delimited by START recording the preprocessing tokens
3020 for later processing.
3021 c_expr = ('{'|'(') <pp token>... ('}'|')') */
3023 c_expr *
3024 parser::parse_c_expr (cpp_ttype start)
3026 const cpp_token *token;
3027 cpp_ttype end;
3028 unsigned opencnt;
3029 vec<cpp_token> code = vNULL;
3030 unsigned nr_stmts = 0;
3031 eat_token (start);
3032 if (start == CPP_OPEN_PAREN)
3033 end = CPP_CLOSE_PAREN;
3034 else if (start == CPP_OPEN_BRACE)
3035 end = CPP_CLOSE_BRACE;
3036 else
3037 gcc_unreachable ();
3038 opencnt = 1;
3041 token = next ();
3043 /* Count brace pairs to find the end of the expr to match. */
3044 if (token->type == start)
3045 opencnt++;
3046 else if (token->type == end
3047 && --opencnt == 0)
3048 break;
3050 /* This is a lame way of counting the number of statements. */
3051 if (token->type == CPP_SEMICOLON)
3052 nr_stmts++;
3054 /* If this is possibly a user-defined identifier mark it used. */
3055 if (token->type == CPP_NAME)
3057 id_base *idb = get_operator ((const char *)CPP_HASHNODE
3058 (token->val.node.node)->ident.str);
3059 user_id *p;
3060 if (idb && (p = dyn_cast<user_id *> (idb)) && p->is_oper_list)
3061 record_operlist (token->src_loc, p);
3064 /* Record the token. */
3065 code.safe_push (*token);
3067 while (1);
3068 return new c_expr (r, code, nr_stmts, vNULL, capture_ids);
3071 /* Parse an operand which is either an expression, a predicate or
3072 a standalone capture.
3073 op = predicate | expr | c_expr | capture */
3075 struct operand *
3076 parser::parse_op ()
3078 const cpp_token *token = peek ();
3079 struct operand *op = NULL;
3080 if (token->type == CPP_OPEN_PAREN)
3082 eat_token (CPP_OPEN_PAREN);
3083 op = parse_expr ();
3084 eat_token (CPP_CLOSE_PAREN);
3086 else if (token->type == CPP_OPEN_BRACE)
3088 op = parse_c_expr (CPP_OPEN_BRACE);
3090 else
3092 /* Remaining ops are either empty or predicates */
3093 if (token->type == CPP_NAME)
3095 const char *id = get_ident ();
3096 id_base *opr = get_operator (id);
3097 if (!opr)
3098 fatal_at (token, "expected predicate name");
3099 if (operator_id *code = dyn_cast <operator_id *> (opr))
3101 if (code->nargs != 0)
3102 fatal_at (token, "using an operator with operands as predicate");
3103 /* Parse the zero-operand operator "predicates" as
3104 expression. */
3105 op = new expr (opr);
3107 else if (user_id *code = dyn_cast <user_id *> (opr))
3109 if (code->nargs != 0)
3110 fatal_at (token, "using an operator with operands as predicate");
3111 /* Parse the zero-operand operator "predicates" as
3112 expression. */
3113 op = new expr (opr);
3115 else if (predicate_id *p = dyn_cast <predicate_id *> (opr))
3116 op = new predicate (p);
3117 else
3118 fatal_at (token, "using an unsupported operator as predicate");
3119 if (!parsing_match_operand)
3120 fatal_at (token, "predicates are only allowed in match expression");
3121 token = peek ();
3122 if (token->flags & PREV_WHITE)
3123 return op;
3125 else if (token->type != CPP_COLON
3126 && token->type != CPP_ATSIGN)
3127 fatal_at (token, "expected expression or predicate");
3128 /* optionally followed by a capture and a predicate. */
3129 if (token->type == CPP_COLON)
3130 fatal_at (token, "not implemented: predicate on leaf operand");
3131 if (token->type == CPP_ATSIGN)
3132 op = parse_capture (op);
3135 return op;
3138 /* Create a new simplify from the current parsing state and MATCH,
3139 MATCH_LOC, RESULT and RESULT_LOC and push it to SIMPLIFIERS. */
3141 void
3142 parser::push_simplify (vec<simplify *>& simplifiers,
3143 operand *match, source_location match_loc,
3144 operand *result, source_location result_loc)
3146 /* Build and push a temporary for for operator list uses in expressions. */
3147 if (!oper_lists.is_empty ())
3148 active_fors.safe_push (oper_lists);
3150 simplifiers.safe_push
3151 (new simplify (match, match_loc, result, result_loc,
3152 active_ifs.copy (), active_fors.copy (), capture_ids));
3154 if (!oper_lists.is_empty ())
3155 active_fors.pop ();
3158 /* Parse
3159 simplify = 'simplify' <expr> <result-op>
3161 match = 'match' <ident> <expr> [<result-op>]
3162 with
3163 <result-op> = <op> | <if> | <with>
3164 <if> = '(' 'if' '(' <c-expr> ')' <result-op> ')'
3165 <with> = '(' 'with' '{' <c-expr> '}' <result-op> ')'
3166 and fill SIMPLIFIERS with the results. */
3168 void
3169 parser::parse_simplify (source_location match_location,
3170 vec<simplify *>& simplifiers, predicate_id *matcher,
3171 expr *result)
3173 /* Reset the capture map. */
3174 if (!capture_ids)
3175 capture_ids = new cid_map_t;
3176 /* Reset oper_lists and set. */
3177 hash_set <user_id *> olist;
3178 oper_lists_set = &olist;
3179 oper_lists = vNULL;
3181 const cpp_token *loc = peek ();
3182 parsing_match_operand = true;
3183 struct operand *match = parse_op ();
3184 parsing_match_operand = false;
3185 if (match->type == operand::OP_CAPTURE && !matcher)
3186 fatal_at (loc, "outermost expression cannot be captured");
3187 if (match->type == operand::OP_EXPR
3188 && is_a <predicate_id *> (as_a <expr *> (match)->operation))
3189 fatal_at (loc, "outermost expression cannot be a predicate");
3191 const cpp_token *token = peek ();
3193 /* If this if is immediately closed then it is part of a predicate
3194 definition. Push it. */
3195 if (token->type == CPP_CLOSE_PAREN)
3197 if (!matcher)
3198 fatal_at (token, "expected transform expression");
3199 push_simplify (simplifiers, match, match_location,
3200 result, token->src_loc);
3201 return;
3204 unsigned active_ifs_len = active_ifs.length ();
3205 while (1)
3207 if (token->type == CPP_OPEN_PAREN)
3209 source_location paren_loc = token->src_loc;
3210 eat_token (CPP_OPEN_PAREN);
3211 if (peek_ident ("if"))
3213 eat_ident ("if");
3214 active_ifs.safe_push (if_or_with (parse_c_expr (CPP_OPEN_PAREN),
3215 token->src_loc, false));
3216 /* If this if is immediately closed then it contains a
3217 manual matcher or is part of a predicate definition.
3218 Push it. */
3219 if (peek ()->type == CPP_CLOSE_PAREN)
3221 if (!matcher)
3222 fatal_at (token, "manual transform not implemented");
3223 push_simplify (simplifiers, match, match_location,
3224 result, paren_loc);
3227 else if (peek_ident ("with"))
3229 eat_ident ("with");
3230 /* Parse (with c-expr expr) as (if-with (true) expr). */
3231 c_expr *e = parse_c_expr (CPP_OPEN_BRACE);
3232 e->nr_stmts = 0;
3233 active_ifs.safe_push (if_or_with (e, token->src_loc, true));
3235 else
3237 operand *op = result;
3238 if (!matcher)
3239 op = parse_expr ();
3240 push_simplify (simplifiers, match, match_location,
3241 op, token->src_loc);
3242 eat_token (CPP_CLOSE_PAREN);
3243 /* A "default" result closes the enclosing scope. */
3244 if (active_ifs.length () > active_ifs_len)
3246 eat_token (CPP_CLOSE_PAREN);
3247 active_ifs.pop ();
3249 else
3250 return;
3253 else if (token->type == CPP_CLOSE_PAREN)
3255 /* Close a scope if requested. */
3256 if (active_ifs.length () > active_ifs_len)
3258 eat_token (CPP_CLOSE_PAREN);
3259 active_ifs.pop ();
3260 token = peek ();
3262 else
3263 return;
3265 else
3267 if (matcher)
3268 fatal_at (token, "expected match operand expression");
3269 push_simplify (simplifiers, match, match_location,
3270 matcher ? result : parse_op (), token->src_loc);
3271 /* A "default" result closes the enclosing scope. */
3272 if (active_ifs.length () > active_ifs_len)
3274 eat_token (CPP_CLOSE_PAREN);
3275 active_ifs.pop ();
3277 else
3278 return;
3280 token = peek ();
3284 /* Parsing of the outer control structures. */
3286 /* Parse a for expression
3287 for = '(' 'for' <subst>... <pattern> ')'
3288 subst = <ident> '(' <ident>... ')' */
3290 void
3291 parser::parse_for (source_location)
3293 auto_vec<const cpp_token *> user_id_tokens;
3294 vec<user_id *> user_ids = vNULL;
3295 const cpp_token *token;
3296 unsigned min_n_opers = 0, max_n_opers = 0;
3298 while (1)
3300 token = peek ();
3301 if (token->type != CPP_NAME)
3302 break;
3304 /* Insert the user defined operators into the operator hash. */
3305 const char *id = get_ident ();
3306 if (get_operator (id) != NULL)
3307 fatal_at (token, "operator already defined");
3308 user_id *op = new user_id (id);
3309 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
3310 *slot = op;
3311 user_ids.safe_push (op);
3312 user_id_tokens.safe_push (token);
3314 eat_token (CPP_OPEN_PAREN);
3316 int arity = -1;
3317 while ((token = peek_ident ()) != 0)
3319 const char *oper = get_ident ();
3320 id_base *idb = get_operator (oper);
3321 if (idb == NULL)
3322 fatal_at (token, "no such operator '%s'", oper);
3323 if (*idb == CONVERT0 || *idb == CONVERT1 || *idb == CONVERT2)
3324 fatal_at (token, "conditional operators cannot be used inside for");
3326 if (arity == -1)
3327 arity = idb->nargs;
3328 else if (idb->nargs == -1)
3330 else if (idb->nargs != arity)
3331 fatal_at (token, "operator '%s' with arity %d does not match "
3332 "others with arity %d", oper, idb->nargs, arity);
3334 user_id *p = dyn_cast<user_id *> (idb);
3335 if (p && p->is_oper_list)
3336 op->substitutes.safe_splice (p->substitutes);
3337 else
3338 op->substitutes.safe_push (idb);
3340 op->nargs = arity;
3341 token = expect (CPP_CLOSE_PAREN);
3343 unsigned nsubstitutes = op->substitutes.length ();
3344 if (nsubstitutes == 0)
3345 fatal_at (token, "A user-defined operator must have at least "
3346 "one substitution");
3347 if (max_n_opers == 0)
3349 min_n_opers = nsubstitutes;
3350 max_n_opers = nsubstitutes;
3352 else
3354 if (nsubstitutes % min_n_opers != 0
3355 && min_n_opers % nsubstitutes != 0)
3356 fatal_at (token, "All user-defined identifiers must have a "
3357 "multiple number of operator substitutions of the "
3358 "smallest number of substitutions");
3359 if (nsubstitutes < min_n_opers)
3360 min_n_opers = nsubstitutes;
3361 else if (nsubstitutes > max_n_opers)
3362 max_n_opers = nsubstitutes;
3366 unsigned n_ids = user_ids.length ();
3367 if (n_ids == 0)
3368 fatal_at (token, "for requires at least one user-defined identifier");
3370 token = peek ();
3371 if (token->type == CPP_CLOSE_PAREN)
3372 fatal_at (token, "no pattern defined in for");
3374 active_fors.safe_push (user_ids);
3375 while (1)
3377 token = peek ();
3378 if (token->type == CPP_CLOSE_PAREN)
3379 break;
3380 parse_pattern ();
3382 active_fors.pop ();
3384 /* Remove user-defined operators from the hash again. */
3385 for (unsigned i = 0; i < user_ids.length (); ++i)
3387 if (!user_ids[i]->used)
3388 warning_at (user_id_tokens[i],
3389 "operator %s defined but not used", user_ids[i]->id);
3390 operators->remove_elt (user_ids[i]);
3394 /* Parse an identifier associated with a list of operators.
3395 oprs = '(' 'define_operator_list' <ident> <ident>... ')' */
3397 void
3398 parser::parse_operator_list (source_location)
3400 const cpp_token *token = peek ();
3401 const char *id = get_ident ();
3403 if (get_operator (id) != 0)
3404 fatal_at (token, "operator %s already defined", id);
3406 user_id *op = new user_id (id, true);
3407 int arity = -1;
3409 while ((token = peek_ident ()) != 0)
3411 token = peek ();
3412 const char *oper = get_ident ();
3413 id_base *idb = get_operator (oper);
3415 if (idb == 0)
3416 fatal_at (token, "no such operator '%s'", oper);
3418 if (arity == -1)
3419 arity = idb->nargs;
3420 else if (idb->nargs == -1)
3422 else if (arity != idb->nargs)
3423 fatal_at (token, "operator '%s' with arity %d does not match "
3424 "others with arity %d", oper, idb->nargs, arity);
3426 /* We allow composition of multiple operator lists. */
3427 if (user_id *p = dyn_cast<user_id *> (idb))
3428 op->substitutes.safe_splice (p->substitutes);
3429 else
3430 op->substitutes.safe_push (idb);
3433 if (op->substitutes.length () == 0)
3434 fatal_at (token, "operator-list cannot be empty");
3436 op->nargs = arity;
3437 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
3438 *slot = op;
3441 /* Parse an outer if expression.
3442 if = '(' 'if' '(' <c-expr> ')' <pattern> ')' */
3444 void
3445 parser::parse_if (source_location loc)
3447 operand *ifexpr = parse_c_expr (CPP_OPEN_PAREN);
3449 const cpp_token *token = peek ();
3450 if (token->type == CPP_CLOSE_PAREN)
3451 fatal_at (token, "no pattern defined in if");
3453 active_ifs.safe_push (if_or_with (ifexpr, loc, false));
3454 while (1)
3456 const cpp_token *token = peek ();
3457 if (token->type == CPP_CLOSE_PAREN)
3458 break;
3460 parse_pattern ();
3462 active_ifs.pop ();
3465 /* Parse a list of predefined predicate identifiers.
3466 preds = '(' 'define_predicates' <ident>... ')' */
3468 void
3469 parser::parse_predicates (source_location)
3473 const cpp_token *token = peek ();
3474 if (token->type != CPP_NAME)
3475 break;
3477 add_predicate (get_ident ());
3479 while (1);
3482 /* Parse outer control structures.
3483 pattern = <preds>|<for>|<if>|<simplify>|<match> */
3485 void
3486 parser::parse_pattern ()
3488 /* All clauses start with '('. */
3489 eat_token (CPP_OPEN_PAREN);
3490 const cpp_token *token = peek ();
3491 const char *id = get_ident ();
3492 if (strcmp (id, "simplify") == 0)
3494 parse_simplify (token->src_loc, simplifiers, NULL, NULL);
3495 capture_ids = NULL;
3497 else if (strcmp (id, "match") == 0)
3499 bool with_args = false;
3500 if (peek ()->type == CPP_OPEN_PAREN)
3502 eat_token (CPP_OPEN_PAREN);
3503 with_args = true;
3505 const char *name = get_ident ();
3506 id_base *id = get_operator (name);
3507 predicate_id *p;
3508 if (!id)
3510 p = add_predicate (name);
3511 user_predicates.safe_push (p);
3513 else if ((p = dyn_cast <predicate_id *> (id)))
3515 else
3516 fatal_at (token, "cannot add a match to a non-predicate ID");
3517 /* Parse (match <id> <arg>... (match-expr)) here. */
3518 expr *e = NULL;
3519 if (with_args)
3521 capture_ids = new cid_map_t;
3522 e = new expr (p);
3523 while (peek ()->type == CPP_ATSIGN)
3524 e->append_op (parse_capture (NULL));
3525 eat_token (CPP_CLOSE_PAREN);
3527 if (p->nargs != -1
3528 && ((e && e->ops.length () != (unsigned)p->nargs)
3529 || (!e && p->nargs != 0)))
3530 fatal_at (token, "non-matching number of match operands");
3531 p->nargs = e ? e->ops.length () : 0;
3532 parse_simplify (token->src_loc, p->matchers, p, e);
3533 capture_ids = NULL;
3535 else if (strcmp (id, "for") == 0)
3536 parse_for (token->src_loc);
3537 else if (strcmp (id, "if") == 0)
3538 parse_if (token->src_loc);
3539 else if (strcmp (id, "define_predicates") == 0)
3541 if (active_ifs.length () > 0
3542 || active_fors.length () > 0)
3543 fatal_at (token, "define_predicates inside if or for is not supported");
3544 parse_predicates (token->src_loc);
3546 else if (strcmp (id, "define_operator_list") == 0)
3548 if (active_ifs.length () > 0
3549 || active_fors.length () > 0)
3550 fatal_at (token, "operator-list inside if or for is not supported");
3551 parse_operator_list (token->src_loc);
3553 else
3554 fatal_at (token, "expected %s'simplify', 'match', 'for' or 'if'",
3555 active_ifs.length () == 0 && active_fors.length () == 0
3556 ? "'define_predicates', " : "");
3558 eat_token (CPP_CLOSE_PAREN);
3561 /* Main entry of the parser. Repeatedly parse outer control structures. */
3563 parser::parser (cpp_reader *r_)
3565 r = r_;
3566 active_ifs = vNULL;
3567 active_fors = vNULL;
3568 simplifiers = vNULL;
3569 oper_lists_set = NULL;
3570 oper_lists = vNULL;
3571 capture_ids = NULL;
3572 user_predicates = vNULL;
3573 parsing_match_operand = false;
3575 const cpp_token *token = next ();
3576 while (token->type != CPP_EOF)
3578 _cpp_backup_tokens (r, 1);
3579 parse_pattern ();
3580 token = next ();
3585 /* Helper for the linemap code. */
3587 static size_t
3588 round_alloc_size (size_t s)
3590 return s;
3594 /* The genmatch generator progam. It reads from a pattern description
3595 and outputs GIMPLE or GENERIC IL matching and simplification routines. */
3598 main (int argc, char **argv)
3600 cpp_reader *r;
3602 progname = "genmatch";
3604 if (argc < 2)
3605 return 1;
3607 bool gimple = true;
3608 bool verbose = false;
3609 char *input = argv[argc-1];
3610 for (int i = 1; i < argc - 1; ++i)
3612 if (strcmp (argv[i], "--gimple") == 0)
3613 gimple = true;
3614 else if (strcmp (argv[i], "--generic") == 0)
3615 gimple = false;
3616 else if (strcmp (argv[i], "-v") == 0)
3617 verbose = true;
3618 else
3620 fprintf (stderr, "Usage: genmatch "
3621 "[--gimple] [--generic] [-v] input\n");
3622 return 1;
3626 line_table = XCNEW (struct line_maps);
3627 linemap_init (line_table, 0);
3628 line_table->reallocator = xrealloc;
3629 line_table->round_alloc_size = round_alloc_size;
3631 r = cpp_create_reader (CLK_GNUC99, NULL, line_table);
3632 cpp_callbacks *cb = cpp_get_callbacks (r);
3633 cb->error = error_cb;
3635 if (!cpp_read_main_file (r, input))
3636 return 1;
3637 cpp_define (r, gimple ? "GIMPLE=1": "GENERIC=1");
3638 cpp_define (r, gimple ? "GENERIC=0": "GIMPLE=0");
3640 /* Pre-seed operators. */
3641 operators = new hash_table<id_base> (1024);
3642 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
3643 add_operator (SYM, # SYM, # TYPE, NARGS);
3644 #define END_OF_BASE_TREE_CODES
3645 #include "tree.def"
3646 add_operator (CONVERT0, "CONVERT0", "tcc_unary", 1);
3647 add_operator (CONVERT1, "CONVERT1", "tcc_unary", 1);
3648 add_operator (CONVERT2, "CONVERT2", "tcc_unary", 1);
3649 #undef END_OF_BASE_TREE_CODES
3650 #undef DEFTREECODE
3652 /* Pre-seed builtin functions.
3653 ??? Cannot use N (name) as that is targetm.emultls.get_address
3654 for BUILT_IN_EMUTLS_GET_ADDRESS ... */
3655 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) \
3656 add_builtin (ENUM, # ENUM);
3657 #include "builtins.def"
3658 #undef DEF_BUILTIN
3660 /* Parse ahead! */
3661 parser p (r);
3663 if (gimple)
3664 write_header (stdout, "gimple-match-head.c");
3665 else
3666 write_header (stdout, "generic-match-head.c");
3668 /* Go over all predicates defined with patterns and perform
3669 lowering and code generation. */
3670 for (unsigned i = 0; i < p.user_predicates.length (); ++i)
3672 predicate_id *pred = p.user_predicates[i];
3673 lower (pred->matchers, gimple);
3675 if (verbose)
3676 for (unsigned i = 0; i < pred->matchers.length (); ++i)
3677 print_matches (pred->matchers[i]);
3679 decision_tree dt;
3680 for (unsigned i = 0; i < pred->matchers.length (); ++i)
3681 dt.insert (pred->matchers[i], i);
3683 if (verbose)
3684 dt.print (stderr);
3686 write_predicate (stdout, pred, dt, gimple);
3689 /* Lower the main simplifiers and generate code for them. */
3690 lower (p.simplifiers, gimple);
3692 if (verbose)
3693 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
3694 print_matches (p.simplifiers[i]);
3696 decision_tree dt;
3697 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
3698 dt.insert (p.simplifiers[i], i);
3700 if (verbose)
3701 dt.print (stderr);
3703 if (gimple)
3704 dt.gen_gimple (stdout);
3705 else
3706 dt.gen_generic (stdout);
3708 /* Finalize. */
3709 cpp_finish (r, NULL);
3710 cpp_destroy (r);
3712 delete operators;
3714 return 0;