ipa-utils.c (ipa_merge_profiles): Avoid ICE on mismatch in indirect edges.
[gcc.git] / gcc / genmatch.c
1 /* Generate pattern matching and transform code shared between
2 GENERIC and GIMPLE folding code from match-and-simplify description.
3
4 Copyright (C) 2014-2015 Free Software Foundation, Inc.
5 Contributed by Richard Biener <rguenther@suse.de>
6 and Prathamesh Kulkarni <bilbotheelffriend@gmail.com>
7
8 This file is part of GCC.
9
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.
14
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.
19
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/>. */
23
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"
37
38
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)
42 {
43 return NULL;
44 }
45 void ggc_free (void *)
46 {
47 }
48
49
50 /* libccp helpers. */
51
52 static struct line_maps *line_table;
53
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)
60 {
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)
70 {
71 char buf[128];
72 while (loc.line > 0)
73 {
74 if (!fgets (buf, 128, f))
75 goto notfound;
76 if (buf[strlen (buf) - 1] != '\n')
77 {
78 if (loc.line > 1)
79 loc.line++;
80 }
81 loc.line--;
82 }
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);
90 }
91
92 if (errtype == CPP_DL_FATAL)
93 exit (1);
94 return false;
95 }
96
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, ...)
102 {
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);
107 }
108
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, ...)
114 {
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);
119 }
120
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, ...)
126 {
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);
131 }
132
133 static void
134 output_line_directive (FILE *f, source_location location,
135 bool dumpfile = false)
136 {
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)
141 {
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);
149 }
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);
156 }
157
158
159 /* Pull in tree codes and builtin function codes from their
160 definition files. */
161
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
169 };
170 #undef DEFTREECODE
171
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
176 };
177 #undef DEF_BUILTIN
178
179
180 /* Base class for all identifiers the parser knows. */
181
182 struct id_base : typed_noop_remove<id_base>
183 {
184 enum id_kind { CODE, FN, PREDICATE, USER } kind;
185
186 id_base (id_kind, const char *, int = -1);
187
188 hashval_t hashval;
189 int nargs;
190 const char *id;
191
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 *);
197 };
198
199 inline hashval_t
200 id_base::hash (const value_type *op)
201 {
202 return op->hashval;
203 }
204
205 inline int
206 id_base::equal (const value_type *op1,
207 const compare_type *op2)
208 {
209 return (op1->hashval == op2->hashval
210 && strcmp (op1->id, op2->id) == 0);
211 }
212
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;
216
217 id_base::id_base (id_kind kind_, const char *id_, int nargs_)
218 {
219 kind = kind_;
220 id = id_;
221 nargs = nargs_;
222 hashval = htab_hash_string (id);
223 }
224
225 /* Identifier that maps to a tree code. */
226
227 struct operator_id : public id_base
228 {
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;
234 };
235
236 /* Identifier that maps to a builtin function code. */
237
238 struct fn_id : public id_base
239 {
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;
243 };
244
245 struct simplify;
246
247 /* Identifier that maps to a user-defined predicate. */
248
249 struct predicate_id : public id_base
250 {
251 predicate_id (const char *id_)
252 : id_base (id_base::PREDICATE, id_), matchers (vNULL) {}
253 vec<simplify *> matchers;
254 };
255
256 /* Identifier that maps to a operator defined by a 'for' directive. */
257
258 struct user_id : public id_base
259 {
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;
266 };
267
268 template<>
269 template<>
270 inline bool
271 is_a_helper <fn_id *>::test (id_base *id)
272 {
273 return id->kind == id_base::FN;
274 }
275
276 template<>
277 template<>
278 inline bool
279 is_a_helper <operator_id *>::test (id_base *id)
280 {
281 return id->kind == id_base::CODE;
282 }
283
284 template<>
285 template<>
286 inline bool
287 is_a_helper <predicate_id *>::test (id_base *id)
288 {
289 return id->kind == id_base::PREDICATE;
290 }
291
292 template<>
293 template<>
294 inline bool
295 is_a_helper <user_id *>::test (id_base *id)
296 {
297 return id->kind == id_base::USER;
298 }
299
300 /* Add a predicate identifier to the hash. */
301
302 static predicate_id *
303 add_predicate (const char *id)
304 {
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;
311 }
312
313 /* Add a tree code identifier to the hash. */
314
315 static void
316 add_operator (enum tree_code code, const char *id,
317 const char *tcc, unsigned nargs)
318 {
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;
335 }
336
337 /* Add a builtin identifier to the hash. */
338
339 static void
340 add_builtin (enum built_in_function code, const char *id)
341 {
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;
347 }
348
349 /* Helper for easy comparing ID with tree code CODE. */
350
351 static bool
352 operator==(id_base &id, enum tree_code code)
353 {
354 if (operator_id *oid = dyn_cast <operator_id *> (&id))
355 return oid->code == code;
356 return false;
357 }
358
359 /* Lookup the identifier ID. */
360
361 id_base *
362 get_operator (const char *id)
363 {
364 id_base tem (id_base::CODE, id);
365
366 id_base *op = operators->find_with_hash (&tem, tem.hashval);
367 if (op)
368 {
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;
373 }
374
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)
382 {
383 free (id2);
384 return op;
385 }
386
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)
393 {
394 free (id2);
395 return op;
396 }
397
398 return 0;
399 }
400
401
402 /* Helper for the capture-id map. */
403
404 struct capture_id_map_hasher : default_hashmap_traits
405 {
406 static inline hashval_t hash (const char *);
407 static inline bool equal_keys (const char *, const char *);
408 };
409
410 inline hashval_t
411 capture_id_map_hasher::hash (const char *id)
412 {
413 return htab_hash_string (id);
414 }
415
416 inline bool
417 capture_id_map_hasher::equal_keys (const char *id1, const char *id2)
418 {
419 return strcmp (id1, id2) == 0;
420 }
421
422 typedef hash_map<const char *, unsigned, capture_id_map_hasher> cid_map_t;
423
424
425 /* The AST produced by parsing of the pattern definitions. */
426
427 struct dt_operand;
428 struct capture_info;
429
430 /* The base class for operands. */
431
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 (); }
441 };
442
443 /* A predicate operand. Predicates are leafs in the AST. */
444
445 struct predicate : public operand
446 {
447 predicate (predicate_id *p_) : operand (OP_PREDICATE), p (p_) {}
448 predicate_id *p;
449 };
450
451 /* An operand that constitutes an expression. Expressions include
452 function calls and user-defined predicate invocations. */
453
454 struct expr : public operand
455 {
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);
474 };
475
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. */
479
480 struct c_expr : public operand
481 {
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_) {}
488 };
489
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);
505 };
506
507 /* A wrapper around another operand that captures its value. */
508
509 struct capture : public operand
510 {
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);
520 };
521
522 template<>
523 template<>
524 inline bool
525 is_a_helper <capture *>::test (operand *op)
526 {
527 return op->type == operand::OP_CAPTURE;
528 }
529
530 template<>
531 template<>
532 inline bool
533 is_a_helper <predicate *>::test (operand *op)
534 {
535 return op->type == operand::OP_PREDICATE;
536 }
537
538 template<>
539 template<>
540 inline bool
541 is_a_helper <c_expr *>::test (operand *op)
542 {
543 return op->type == operand::OP_C_EXPR;
544 }
545
546 template<>
547 template<>
548 inline bool
549 is_a_helper <expr *>::test (operand *op)
550 {
551 return op->type == operand::OP_EXPR;
552 }
553
554 /* Helper to distinguish 'if' from 'with' expressions. */
555
556 struct if_or_with
557 {
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;
563 };
564
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. */
569
570 struct simplify
571 {
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) {}
580
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;
598 };
599
600 /* Debugging routines for dumping the AST. */
601
602 DEBUG_FUNCTION void
603 print_operand (operand *o, FILE *f = stderr, bool flattened = false)
604 {
605 if (capture *c = dyn_cast<capture *> (o))
606 {
607 fprintf (f, "@%u", c->where);
608 if (c->what && flattened == false)
609 {
610 putc (':', f);
611 print_operand (c->what, f, flattened);
612 putc (' ', f);
613 }
614 }
615
616 else if (predicate *p = dyn_cast<predicate *> (o))
617 fprintf (f, "%s", p->p->id);
618
619 else if (is_a<c_expr *> (o))
620 fprintf (f, "c_expr");
621
622 else if (expr *e = dyn_cast<expr *> (o))
623 {
624 fprintf (f, "(%s", e->operation->id);
625
626 if (flattened == false)
627 {
628 putc (' ', f);
629 for (unsigned i = 0; i < e->ops.length (); ++i)
630 {
631 print_operand (e->ops[i], f, flattened);
632 putc (' ', f);
633 }
634 }
635 putc (')', f);
636 }
637
638 else
639 gcc_unreachable ();
640 }
641
642 DEBUG_FUNCTION void
643 print_matches (struct simplify *s, FILE *f = stderr)
644 {
645 fprintf (f, "for expression: ");
646 print_operand (s->match, f);
647 putc ('\n', f);
648 }
649
650
651 /* AST lowering. */
652
653 /* Lowering of commutative operators. */
654
655 static void
656 cartesian_product (const vec< vec<operand *> >& ops_vector,
657 vec< vec<operand *> >& result, vec<operand *>& v, unsigned n)
658 {
659 if (n == ops_vector.length ())
660 {
661 vec<operand *> xv = v.copy ();
662 result.safe_push (xv);
663 return;
664 }
665
666 for (unsigned i = 0; i < ops_vector[n].length (); ++i)
667 {
668 v[n] = ops_vector[n][i];
669 cartesian_product (ops_vector, result, v, n + 1);
670 }
671 }
672
673 /* Lower OP to two operands in case it is marked as commutative. */
674
675 static vec<operand *>
676 commutate (operand *op)
677 {
678 vec<operand *> ret = vNULL;
679
680 if (capture *c = dyn_cast <capture *> (op))
681 {
682 if (!c->what)
683 {
684 ret.safe_push (op);
685 return ret;
686 }
687 vec<operand *> v = commutate (c->what);
688 for (unsigned i = 0; i < v.length (); ++i)
689 {
690 capture *nc = new capture (c->where, v[i]);
691 ret.safe_push (nc);
692 }
693 return ret;
694 }
695
696 expr *e = dyn_cast <expr *> (op);
697 if (!e || e->ops.length () == 0)
698 {
699 ret.safe_push (op);
700 return ret;
701 }
702
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]));
706
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);
711
712
713 for (unsigned i = 0; i < result.length (); ++i)
714 {
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);
719 }
720
721 if (!e->is_commutative)
722 return ret;
723
724 for (unsigned i = 0; i < result.length (); ++i)
725 {
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);
731 }
732
733 return ret;
734 }
735
736 /* Lower operations marked as commutative in the AST of S and push
737 the resulting patterns to SIMPLIFIERS. */
738
739 static void
740 lower_commutative (simplify *s, vec<simplify *>& simplifiers)
741 {
742 vec<operand *> matchers = commutate (s->match);
743 for (unsigned i = 0; i < matchers.length (); ++i)
744 {
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);
749 }
750 }
751
752 /* Strip conditional conversios using operator OPER from O and its
753 children if STRIP, else replace them with an unconditional convert. */
754
755 operand *
756 lower_opt_convert (operand *o, enum tree_code oper, bool strip)
757 {
758 if (capture *c = dyn_cast<capture *> (o))
759 {
760 if (c->what)
761 return new capture (c->where, lower_opt_convert (c->what, oper, strip));
762 else
763 return c;
764 }
765
766 expr *e = dyn_cast<expr *> (o);
767 if (!e)
768 return o;
769
770 if (*e->operation == oper)
771 {
772 if (strip)
773 return lower_opt_convert (e->ops[0], oper, strip);
774
775 expr *ne = new expr (get_operator ("CONVERT_EXPR"));
776 ne->append_op (lower_opt_convert (e->ops[0], oper, strip));
777 return ne;
778 }
779
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));
783
784 return ne;
785 }
786
787 /* Determine whether O or its children uses the conditional conversion
788 operator OPER. */
789
790 static bool
791 has_opt_convert (operand *o, enum tree_code oper)
792 {
793 if (capture *c = dyn_cast<capture *> (o))
794 {
795 if (c->what)
796 return has_opt_convert (c->what, oper);
797 else
798 return false;
799 }
800
801 expr *e = dyn_cast<expr *> (o);
802 if (!e)
803 return false;
804
805 if (*e->operation == oper)
806 return true;
807
808 for (unsigned i = 0; i < e->ops.length (); ++i)
809 if (has_opt_convert (e->ops[i], oper))
810 return true;
811
812 return false;
813 }
814
815 /* Lower conditional convert operators in O, expanding it to a vector
816 if required. */
817
818 static vec<operand *>
819 lower_opt_convert (operand *o)
820 {
821 vec<operand *> v1 = vNULL, v2;
822
823 v1.safe_push (o);
824
825 enum tree_code opers[] = { CONVERT0, CONVERT1, CONVERT2 };
826
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. */
830
831 for (unsigned i = 0; i < 3; ++i)
832 {
833 v2 = vNULL;
834 for (unsigned j = 0; j < v1.length (); ++j)
835 if (has_opt_convert (v1[j], opers[i]))
836 {
837 v2.safe_push (lower_opt_convert (v1[j], opers[i], false));
838 v2.safe_push (lower_opt_convert (v1[j], opers[i], true));
839 }
840
841 if (v2 != vNULL)
842 {
843 v1 = vNULL;
844 for (unsigned j = 0; j < v2.length (); ++j)
845 v1.safe_push (v2[j]);
846 }
847 }
848
849 return v1;
850 }
851
852 /* Lower conditional convert operators in the AST of S and push
853 the resulting multiple patterns to SIMPLIFIERS. */
854
855 static void
856 lower_opt_convert (simplify *s, vec<simplify *>& simplifiers)
857 {
858 vec<operand *> matchers = lower_opt_convert (s->match);
859 for (unsigned i = 0; i < matchers.length (); ++i)
860 {
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);
865 }
866 }
867
868 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
869 GENERIC and a GIMPLE variant. */
870
871 static vec<operand *>
872 lower_cond (operand *o)
873 {
874 vec<operand *> ro = vNULL;
875
876 if (capture *c = dyn_cast<capture *> (o))
877 {
878 if (c->what)
879 {
880 vec<operand *> lop = vNULL;
881 lop = lower_cond (c->what);
882
883 for (unsigned i = 0; i < lop.length (); ++i)
884 ro.safe_push (new capture (c->where, lop[i]));
885 return ro;
886 }
887 }
888
889 expr *e = dyn_cast<expr *> (o);
890 if (!e || e->ops.length () == 0)
891 {
892 ro.safe_push (o);
893 return ro;
894 }
895
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]));
899
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);
904
905 for (unsigned i = 0; i < result.length (); ++i)
906 {
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)))
923 {
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]))
928 {
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);
935 }
936 else
937 {
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;
944 }
945 ro.safe_push (ne);
946 }
947 }
948
949 return ro;
950 }
951
952 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
953 GENERIC and a GIMPLE variant. */
954
955 static void
956 lower_cond (simplify *s, vec<simplify *>& simplifiers)
957 {
958 vec<operand *> matchers = lower_cond (s->match);
959 for (unsigned i = 0; i < matchers.length (); ++i)
960 {
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);
965 }
966 }
967
968 /* In AST operand O replace operator ID with operator WITH. */
969
970 operand *
971 replace_id (operand *o, user_id *id, id_base *with)
972 {
973 /* Deep-copy captures and expressions, replacing operations as
974 needed. */
975 if (capture *c = dyn_cast<capture *> (o))
976 {
977 if (!c->what)
978 return c;
979 return new capture (c->where, replace_id (c->what, id, with));
980 }
981 else if (expr *e = dyn_cast<expr *> (o))
982 {
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;
988 }
989
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))
993 {
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);
997 }
998
999 return o;
1000 }
1001
1002 /* Lower recorded fors for SIN and output to SIMPLIFIERS. */
1003
1004 static void
1005 lower_for (simplify *sin, vec<simplify *>& simplifiers)
1006 {
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);
1011
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)
1017 {
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 ();
1024
1025 unsigned worklist_end = worklist.length ();
1026 for (unsigned si = worklist_start; si < worklist_end; ++si)
1027 {
1028 simplify *s = worklist[si];
1029 for (unsigned j = 0; j < max_n_opers; ++j)
1030 {
1031 operand *match_op = s->match;
1032 operand *result_op = s->result;
1033 vec<if_or_with> ifexpr_vec = s->ifexpr_vec.copy ();
1034
1035 for (unsigned i = 0; i < n_ids; ++i)
1036 {
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);
1045 }
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);
1050 }
1051 }
1052 worklist_start = worklist_end;
1053 }
1054
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]);
1058 }
1059
1060 /* Lower the AST for everything in SIMPLIFIERS. */
1061
1062 static void
1063 lower (vec<simplify *>& simplifiers, bool gimple)
1064 {
1065 auto_vec<simplify *> out_simplifiers;
1066 for (unsigned i = 0; i < simplifiers.length (); ++i)
1067 lower_opt_convert (simplifiers[i], out_simplifiers);
1068
1069 simplifiers.truncate (0);
1070 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1071 lower_commutative (out_simplifiers[i], simplifiers);
1072
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);
1079
1080
1081 simplifiers.truncate (0);
1082 for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1083 lower_for (out_simplifiers[i], simplifiers);
1084 }
1085
1086
1087
1088
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. */
1092
1093 /* Decision tree base class, used for DT_TRUE and DT_NODE. */
1094
1095 struct dt_node
1096 {
1097 enum dt_type { DT_NODE, DT_OPERAND, DT_TRUE, DT_MATCH, DT_SIMPLIFY };
1098
1099 enum dt_type type;
1100 unsigned level;
1101 vec<dt_node *> kids;
1102
1103 dt_node (enum dt_type type_): type (type_), level (0), kids (vNULL) {}
1104
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 **);
1110
1111 virtual void gen (FILE *, bool) {}
1112
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 *>);
1117 };
1118
1119 /* Generic decision tree node used for DT_OPERAND and DT_MATCH. */
1120
1121 struct dt_operand : public dt_node
1122 {
1123 operand *op;
1124 dt_operand *match_dop;
1125 dt_operand *parent;
1126 unsigned pos;
1127
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_) {}
1132
1133 void gen (FILE *, bool);
1134 unsigned gen_predicate (FILE *, const char *, bool);
1135 unsigned gen_match_op (FILE *, const char *);
1136
1137 unsigned gen_gimple_expr (FILE *);
1138 unsigned gen_generic_expr (FILE *, const char *);
1139
1140 char *get_name (char *);
1141 void gen_opname (char *, unsigned);
1142 };
1143
1144 /* Leaf node of the decision tree, used for DT_SIMPLIFY. */
1145
1146 struct dt_simplify : public dt_node
1147 {
1148 simplify *s;
1149 unsigned pattern_no;
1150 dt_operand **indexes;
1151
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_) {}
1155
1156 void gen (FILE *f, bool);
1157 };
1158
1159 template<>
1160 template<>
1161 inline bool
1162 is_a_helper <dt_operand *>::test (dt_node *n)
1163 {
1164 return (n->type == dt_node::DT_OPERAND
1165 || n->type == dt_node::DT_MATCH);
1166 }
1167
1168 /* A container for the actual decision tree. */
1169
1170 struct decision_tree
1171 {
1172 dt_node *root;
1173
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);
1178
1179 decision_tree () { root = new dt_node (dt_node::DT_NODE); }
1180
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);
1186 };
1187
1188 /* Compare two AST operands O1 and O2 and return true if they are equal. */
1189
1190 bool
1191 cmp_operand (operand *o1, operand *o2)
1192 {
1193 if (!o1 || !o2 || o1->type != o2->type)
1194 return false;
1195
1196 if (o1->type == operand::OP_PREDICATE)
1197 {
1198 predicate *p1 = as_a<predicate *>(o1);
1199 predicate *p2 = as_a<predicate *>(o2);
1200 return p1->p == p2->p;
1201 }
1202 else if (o1->type == operand::OP_EXPR)
1203 {
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);
1208 }
1209 else
1210 return false;
1211 }
1212
1213 /* Compare two decision tree nodes N1 and N2 and return true if they
1214 are equal. */
1215
1216 bool
1217 decision_tree::cmp_node (dt_node *n1, dt_node *n2)
1218 {
1219 if (!n1 || !n2 || n1->type != n2->type)
1220 return false;
1221
1222 if (n1 == n2)
1223 return true;
1224
1225 if (n1->type == dt_node::DT_TRUE)
1226 return false;
1227
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;
1235 }
1236
1237 /* Search OPS for a decision tree node like P and return it if found. */
1238
1239 dt_node *
1240 decision_tree::find_node (vec<dt_node *>& ops, dt_node *p)
1241 {
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)
1248 {
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];
1256 }
1257 return NULL;
1258 }
1259
1260 /* Append N to the decision tree if it there is not already an existing
1261 identical child. */
1262
1263 dt_node *
1264 dt_node::append_node (dt_node *n)
1265 {
1266 dt_node *kid;
1267
1268 kid = decision_tree::find_node (kids, n);
1269 if (kid)
1270 return kid;
1271
1272 kids.safe_push (n);
1273 n->level = this->level + 1;
1274
1275 return n;
1276 }
1277
1278 /* Append OP to the decision tree. */
1279
1280 dt_node *
1281 dt_node::append_op (operand *op, dt_node *parent, unsigned pos)
1282 {
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);
1286 }
1287
1288 /* Append a DT_TRUE decision tree node. */
1289
1290 dt_node *
1291 dt_node::append_true_op (dt_node *parent, unsigned pos)
1292 {
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);
1296 }
1297
1298 /* Append a DT_MATCH decision tree node. */
1299
1300 dt_node *
1301 dt_node::append_match_op (dt_operand *match_dop, dt_node *parent, unsigned pos)
1302 {
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);
1306 }
1307
1308 /* Append S to the decision tree. */
1309
1310 dt_node *
1311 dt_node::append_simplify (simplify *s, unsigned pattern_no,
1312 dt_operand **indexes)
1313 {
1314 dt_simplify *n = new dt_simplify (s, pattern_no, indexes);
1315 return append_node (n);
1316 }
1317
1318 /* Insert O into the decision tree and return the decision tree node found
1319 or created. */
1320
1321 dt_node *
1322 decision_tree::insert_operand (dt_node *p, operand *o, dt_operand **indexes,
1323 unsigned pos, dt_node *parent)
1324 {
1325 dt_node *q, *elm = 0;
1326
1327 if (capture *c = dyn_cast<capture *> (o))
1328 {
1329 unsigned capt_index = c->where;
1330
1331 if (indexes[capt_index] == 0)
1332 {
1333 if (c->what)
1334 q = insert_operand (p, c->what, indexes, pos, parent);
1335 else
1336 {
1337 q = elm = p->append_true_op (parent, pos);
1338 goto at_assert_elm;
1339 }
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)
1344 ;
1345
1346 if (!c->what)
1347 {
1348 unsigned cc_index = c->where;
1349 dt_operand *match_op = indexes[cc_index];
1350
1351 dt_operand temp (dt_node::DT_TRUE, 0, 0);
1352 elm = decision_tree::find_node (p->kids, &temp);
1353
1354 if (elm == 0)
1355 {
1356 dt_operand temp (dt_node::DT_MATCH, 0, match_op);
1357 elm = decision_tree::find_node (p->kids, &temp);
1358 }
1359 }
1360 else
1361 {
1362 dt_operand temp (dt_node::DT_OPERAND, c->what, 0);
1363 elm = decision_tree::find_node (p->kids, &temp);
1364 }
1365
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;
1372 }
1373 else
1374 {
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;
1380 }
1381 }
1382 p = p->append_op (o, parent, pos);
1383 q = p;
1384
1385 if (expr *e = dyn_cast <expr *>(o))
1386 {
1387 for (unsigned i = 0; i < e->ops.length (); ++i)
1388 q = decision_tree::insert_operand (q, e->ops[i], indexes, i, p);
1389 }
1390
1391 return q;
1392 }
1393
1394 /* Insert S into the decision tree. */
1395
1396 void
1397 decision_tree::insert (struct simplify *s, unsigned pattern_no)
1398 {
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);
1402 }
1403
1404 /* Debug functions to dump the decision tree. */
1405
1406 DEBUG_FUNCTION void
1407 decision_tree::print_node (dt_node *p, FILE *f, unsigned indent)
1408 {
1409 if (p->type == dt_node::DT_NODE)
1410 fprintf (f, "root");
1411 else
1412 {
1413 fprintf (f, "|");
1414 for (unsigned i = 0; i < indent; i++)
1415 fprintf (f, "-");
1416
1417 if (p->type == dt_node::DT_OPERAND)
1418 {
1419 dt_operand *dop = static_cast<dt_operand *>(p);
1420 print_operand (dop->op, f, true);
1421 }
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)
1427 {
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, " } ");
1433 }
1434 }
1435
1436 fprintf (stderr, " (%p), %u, %u\n", (void *) p, p->level, p->kids.length ());
1437
1438 for (unsigned i = 0; i < p->kids.length (); ++i)
1439 decision_tree::print_node (p->kids[i], f, indent + 2);
1440 }
1441
1442 DEBUG_FUNCTION void
1443 decision_tree::print (FILE *f)
1444 {
1445 return decision_tree::print_node (root, f);
1446 }
1447
1448
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. */
1455
1456 struct capture_info
1457 {
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 *);
1462
1463 struct cinfo
1464 {
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;
1471 };
1472
1473 auto_vec<cinfo> info;
1474 unsigned long force_no_side_effects;
1475 };
1476
1477 /* Analyze captures in S. */
1478
1479 capture_info::capture_info (simplify *s)
1480 {
1481 expr *e;
1482 if (!s->result
1483 || ((e = dyn_cast <expr *> (s->result))
1484 && is_a <predicate_id *> (e->operation)))
1485 {
1486 force_no_side_effects = -1;
1487 return;
1488 }
1489
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));
1501
1502 walk_result (s->result, false);
1503
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));
1507 }
1508
1509 /* Analyze captures in the match expression piece O. */
1510
1511 void
1512 capture_info::walk_match (operand *o, unsigned toplevel_arg,
1513 bool conditional_p, bool cond_expr_cond_p)
1514 {
1515 if (capture *c = dyn_cast <capture *> (o))
1516 {
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))
1523 {
1524 info[c->where].expr_p = true;
1525 walk_match (c->what, toplevel_arg, conditional_p, false);
1526 }
1527 }
1528 else if (expr *e = dyn_cast <expr *> (o))
1529 {
1530 for (unsigned i = 0; i < e->ops.length (); ++i)
1531 {
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);
1544 }
1545 }
1546 else if (is_a <predicate *> (o))
1547 {
1548 /* Mark non-captured leafs toplevel arg for checking. */
1549 force_no_side_effects |= 1 << toplevel_arg;
1550 }
1551 else
1552 gcc_unreachable ();
1553 }
1554
1555 /* Analyze captures in the result expression piece O. */
1556
1557 void
1558 capture_info::walk_result (operand *o, bool conditional_p)
1559 {
1560 if (capture *c = dyn_cast <capture *> (o))
1561 {
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))
1574 {
1575 info[c->where].cse_p = true;
1576 walk_result (c->what, true);
1577 }
1578 }
1579 else if (expr *e = dyn_cast <expr *> (o))
1580 {
1581 for (unsigned i = 0; i < e->ops.length (); ++i)
1582 {
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);
1590 }
1591 }
1592 else if (c_expr *e = dyn_cast <c_expr *> (o))
1593 walk_c_expr (e);
1594 else
1595 gcc_unreachable ();
1596 }
1597
1598 /* Look for captures in the C expr E. */
1599
1600 void
1601 capture_info::walk_c_expr (c_expr *e)
1602 {
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)
1606 {
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))
1622 {
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;
1629 }
1630 }
1631 }
1632
1633
1634 /* Code generation off the decision tree and the refered AST nodes. */
1635
1636 bool
1637 is_conversion (id_base *op)
1638 {
1639 return (*op == CONVERT_EXPR
1640 || *op == NOP_EXPR
1641 || *op == FLOAT_EXPR
1642 || *op == FIX_TRUNC_EXPR
1643 || *op == VIEW_CONVERT_EXPR);
1644 }
1645
1646 /* Get the type to be used for generating operands of OP from the
1647 various sources. */
1648
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)
1653 {
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
1666 {
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;
1675 }
1676 }
1677
1678 /* Generate transform code for an expression. */
1679
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)
1684 {
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. */
1690 ;
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)
1697 {
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;
1701 }
1702 else if (is_a <operator_id *> (operation)
1703 && !strcmp (as_a <operator_id *> (operation)->tcc, "tcc_comparison"))
1704 {
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;
1709 }
1710 else
1711 {
1712 /* Other operations are of the same type as their first operand. */
1713 sprintf (optype, "TREE_TYPE (ops%d[0])", depth);
1714 type = optype;
1715 }
1716 if (!type)
1717 fatal ("two conversions in a row");
1718
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)
1724 {
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));
1734 }
1735
1736 const char *opr;
1737 if (*operation == CONVERT_EXPR)
1738 opr = "NOP_EXPR";
1739 else
1740 opr = operation->id;
1741
1742 if (gimple)
1743 {
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");
1760 }
1761 else
1762 {
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");
1772 }
1773 fprintf (f, " %s = res;\n", dest);
1774 fprintf (f, "}\n");
1775 }
1776
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. */
1780
1781 void
1782 c_expr::gen_transform (FILE *f, const char *dest,
1783 bool, int, const char *, capture_info *,
1784 dt_operand **, bool)
1785 {
1786 if (dest && nr_stmts == 1)
1787 fprintf (f, "%s = ", dest);
1788
1789 unsigned stmt_nr = 1;
1790 for (unsigned i = 0; i < code.length (); ++i)
1791 {
1792 const cpp_token *token = &code[i];
1793
1794 /* Replace captures for code-gen. */
1795 if (token->type == CPP_ATSIGN)
1796 {
1797 const cpp_token *n = &code[i+1];
1798 if ((n->type == CPP_NUMBER
1799 || n->type == CPP_NAME)
1800 && !(n->flags & PREV_WHITE))
1801 {
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;
1812 }
1813 }
1814
1815 if (token->flags & PREV_WHITE)
1816 fputc (' ', f);
1817
1818 if (token->type == CPP_NAME)
1819 {
1820 const char *id = (const char *) NODE_NAME (token->val.node.node);
1821 unsigned j;
1822 for (j = 0; j < ids.length (); ++j)
1823 {
1824 if (strcmp (id, ids[j].id) == 0)
1825 {
1826 fprintf (f, "%s", ids[j].oper);
1827 break;
1828 }
1829 }
1830 if (j < ids.length ())
1831 continue;
1832 }
1833
1834 /* Output the token as string. */
1835 char *tk = (char *)cpp_token_as_text (r, token);
1836 fputs (tk, f);
1837
1838 if (token->type == CPP_SEMICOLON)
1839 {
1840 stmt_nr++;
1841 if (dest && stmt_nr == nr_stmts)
1842 fprintf (f, "\n %s = ", dest);
1843 else
1844 fputc ('\n', f);
1845 }
1846 }
1847 }
1848
1849 /* Generate transform code for a capture. */
1850
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)
1855 {
1856 if (what && is_a<expr *> (what))
1857 {
1858 if (indexes[where] == 0)
1859 {
1860 char buf[20];
1861 sprintf (buf, "captures[%u]", where);
1862 what->gen_transform (f, buf, gimple, depth, in_type, cinfo, NULL);
1863 }
1864 }
1865
1866 fprintf (f, "%s = captures[%u];\n", dest, where);
1867
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);
1881 }
1882
1883 /* Return the name of the operand representing the decision tree node.
1884 Use NAME as space to generate it. */
1885
1886 char *
1887 dt_operand::get_name (char *name)
1888 {
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;
1898 }
1899
1900 /* Fill NAME with the operand name at position POS. */
1901
1902 void
1903 dt_operand::gen_opname (char *name, unsigned pos)
1904 {
1905 if (!parent)
1906 sprintf (name, "op%u", pos);
1907 else
1908 sprintf (name, "o%u%u", level, pos);
1909 }
1910
1911 /* Generate matching code for the decision tree operand which is
1912 a predicate. */
1913
1914 unsigned
1915 dt_operand::gen_predicate (FILE *f, const char *opname, bool gimple)
1916 {
1917 predicate *p = as_a <predicate *> (op);
1918
1919 if (p->p->matchers.exists ())
1920 {
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);
1927 }
1928 else
1929 fprintf (f, "if (%s (%s))\n", p->p->id, opname);
1930 fprintf (f, "{\n");
1931 return 1;
1932 }
1933
1934 /* Generate matching code for the decision tree operand which is
1935 a capture-match. */
1936
1937 unsigned
1938 dt_operand::gen_match_op (FILE *f, const char *opname)
1939 {
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;
1946 }
1947
1948 /* Generate GIMPLE matching code for the decision tree operand. */
1949
1950 unsigned
1951 dt_operand::gen_gimple_expr (FILE *f)
1952 {
1953 expr *e = static_cast<expr *> (op);
1954 id_base *id = e->operation;
1955 unsigned n_ops = e->ops.length ();
1956
1957 for (unsigned i = 0; i < n_ops; ++i)
1958 {
1959 char child_opname[20];
1960 gen_opname (child_opname, i);
1961
1962 if (id->kind == id_base::CODE)
1963 {
1964 if (e->is_generic
1965 || *id == REALPART_EXPR || *id == IMAGPART_EXPR
1966 || *id == BIT_FIELD_REF || *id == VIEW_CONVERT_EXPR)
1967 {
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;
1979 }
1980 else
1981 fprintf (f, "tree %s = gimple_assign_rhs%u (def_stmt);\n",
1982 child_opname, i + 1);
1983 }
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");
1990 }
1991
1992 return n_ops;
1993 }
1994
1995 /* Generate GENERIC matching code for the decision tree operand. */
1996
1997 unsigned
1998 dt_operand::gen_generic_expr (FILE *f, const char *opname)
1999 {
2000 expr *e = static_cast<expr *> (op);
2001 unsigned n_ops = e->ops.length ();
2002
2003 for (unsigned i = 0; i < n_ops; ++i)
2004 {
2005 char child_opname[20];
2006 gen_opname (child_opname, i);
2007
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);
2014 }
2015
2016 return 0;
2017 }
2018
2019 /* Generate matching code for the children of the decision tree node. */
2020
2021 void
2022 dt_node::gen_kids (FILE *f, bool gimple)
2023 {
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;
2030
2031 for (unsigned i = 0; i < kids.length (); ++i)
2032 {
2033 if (kids[i]->type == dt_node::DT_OPERAND)
2034 {
2035 dt_operand *op = as_a<dt_operand *> (kids[i]);
2036 if (expr *e = dyn_cast <expr *> (op->op))
2037 {
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)
2042 {
2043 if (gimple)
2044 fns.safe_push (op);
2045 else
2046 generic_fns.safe_push (op);
2047 }
2048 else if (e->operation->kind == id_base::PREDICATE)
2049 preds.safe_push (op);
2050 else
2051 {
2052 if (gimple)
2053 gimple_exprs.safe_push (op);
2054 else
2055 generic_exprs.safe_push (op);
2056 }
2057 }
2058 else if (op->op->type == operand::OP_PREDICATE)
2059 others.safe_push (kids[i]);
2060 else
2061 gcc_unreachable ();
2062 }
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)
2067 {
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);
2080 }
2081 else
2082 gcc_unreachable ();
2083 }
2084
2085 /* Generate code for the remains. */
2086 gen_kids_1 (f, gimple, gimple_exprs, generic_exprs,
2087 fns, generic_fns, preds, others);
2088 }
2089
2090 /* Generate matching code for the children of the decision tree node. */
2091
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)
2100 {
2101 char buf[128];
2102 char *kid_opname = buf;
2103
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 ();
2108
2109 if (exprs_len || fns_len || gexprs_len || gfns_len)
2110 {
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);
2119
2120 fprintf (f, "switch (TREE_CODE (%s))\n"
2121 "{\n", kid_opname);
2122 }
2123
2124 if (exprs_len || fns_len)
2125 {
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);
2130
2131 if (exprs_len)
2132 {
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)
2137 {
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");
2148 }
2149 fprintf (f, "default:;\n"
2150 "}\n");
2151 }
2152
2153 if (fns_len)
2154 {
2155 if (exprs_len)
2156 fprintf (f, "else ");
2157
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");
2163
2164 for (unsigned i = 0; i < fns_len; ++i)
2165 {
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");
2172 }
2173
2174 fprintf (f, "default:;\n"
2175 "}\n"
2176 "}\n");
2177 }
2178
2179 fprintf (f, "}\n"
2180 "break;\n");
2181 }
2182
2183 for (unsigned i = 0; i < generic_exprs.length (); ++i)
2184 {
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");
2195 }
2196
2197 if (gfns_len)
2198 {
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);
2205
2206 for (unsigned j = 0; j < generic_fns.length (); ++j)
2207 {
2208 expr *e = as_a <expr *>(generic_fns[j]->op);
2209 gcc_assert (e->operation->kind == id_base::FN);
2210
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");
2216 }
2217
2218 fprintf (f, "default:;\n"
2219 "}\n"
2220 "break;\n"
2221 "}\n");
2222 }
2223
2224 /* Close switch (TREE_CODE ()). */
2225 if (exprs_len || fns_len || gexprs_len || gfns_len)
2226 fprintf (f, "default:;\n"
2227 "}\n");
2228
2229 for (unsigned i = 0; i < preds.length (); ++i)
2230 {
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)
2241 {
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);
2245 }
2246 preds[i]->gen_kids (f, gimple);
2247 fprintf (f, "}\n");
2248 }
2249
2250 for (unsigned i = 0; i < others.length (); ++i)
2251 others[i]->gen (f, gimple);
2252 }
2253
2254 /* Generate matching code for the decision tree operand. */
2255
2256 void
2257 dt_operand::gen (FILE *f, bool gimple)
2258 {
2259 char opname[20];
2260 get_name (opname);
2261
2262 unsigned n_braces = 0;
2263
2264 if (type == DT_OPERAND)
2265 switch (op->type)
2266 {
2267 case operand::OP_PREDICATE:
2268 n_braces = gen_predicate (f, opname, gimple);
2269 break;
2270
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;
2277
2278 default:
2279 gcc_unreachable ();
2280 }
2281 else if (type == DT_TRUE)
2282 ;
2283 else if (type == DT_MATCH)
2284 n_braces = gen_match_op (f, opname);
2285 else
2286 gcc_unreachable ();
2287
2288 gen_kids (f, gimple);
2289
2290 for (unsigned i = 0; i < n_braces; ++i)
2291 fprintf (f, "}\n");
2292 }
2293
2294
2295
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). */
2299
2300 void
2301 dt_simplify::gen (FILE *f, bool gimple)
2302 {
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);
2308
2309 for (int i = 0; i <= s->capture_max; ++i)
2310 if (indexes[i])
2311 {
2312 char opname[20];
2313 fprintf (f, "captures[%u] = %s;\n", i, indexes[i]->get_name (opname));
2314 }
2315
2316 unsigned n_braces = 0;
2317 if (s->ifexpr_vec != vNULL)
2318 {
2319 for (unsigned i = 0; i < s->ifexpr_vec.length (); ++i)
2320 {
2321 if_or_with &w = s->ifexpr_vec[i];
2322 if (w.is_with)
2323 {
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++;
2328 }
2329 else
2330 {
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
2337 {
2338 unsigned j = i;
2339 do
2340 {
2341 if (j != i)
2342 {
2343 fprintf (f, "\n");
2344 output_line_directive (f, s->ifexpr_vec[j].location);
2345 fprintf (f, "&& ");
2346 }
2347 fprintf (f, "(");
2348 s->ifexpr_vec[j].cexpr->gen_transform (f, NULL,
2349 true, 1, "type",
2350 NULL);
2351 fprintf (f, ")");
2352 ++j;
2353 }
2354 while (j < s->ifexpr_vec.length ()
2355 && !s->ifexpr_vec[j].is_with);
2356 i = j - 1;
2357 }
2358 fprintf (f, ")\n");
2359 }
2360 }
2361 fprintf (f, "{\n");
2362 n_braces++;
2363 }
2364
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)))
2373 {
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)
2379 ;
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;
2390 }
2391
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");
2396
2397 operand *result = s->result;
2398 if (!result)
2399 {
2400 /* If there is no result then this is a predicate implementation. */
2401 fprintf (f, "return true;\n");
2402 }
2403 else if (gimple)
2404 {
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)
2411 {
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)
2419 {
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);
2439 }
2440
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 ());
2446 }
2447 else if (result->type == operand::OP_CAPTURE
2448 || result->type == operand::OP_C_EXPR)
2449 {
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)
2455 {
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");
2464 }
2465 }
2466 else
2467 gcc_unreachable ();
2468 fprintf (f, "return true;\n");
2469 }
2470 else /* GENERIC */
2471 {
2472 bool is_predicate = false;
2473 if (result->type == operand::OP_EXPR)
2474 {
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)
2481 {
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);
2487 }
2488 for (unsigned j = 0; j < e->ops.length (); ++j)
2489 {
2490 char dest[32];
2491 if (is_predicate)
2492 snprintf (dest, 32, "res_ops[%d]", j);
2493 else
2494 {
2495 fprintf (f, " tree res_op%d;\n", j);
2496 snprintf (dest, 32, " res_op%d", j);
2497 }
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);
2505 }
2506 if (is_predicate)
2507 fprintf (f, "return true;\n");
2508 else
2509 {
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
2517 {
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");
2530 }
2531 }
2532 }
2533 else if (result->type == operand::OP_CAPTURE
2534 || result->type == operand::OP_C_EXPR)
2535
2536 {
2537 fprintf (f, " tree res;\n");
2538 s->result->gen_transform (f, " res", false, 1, "type",
2539 &cinfo, indexes);
2540 }
2541 else
2542 gcc_unreachable ();
2543 if (!is_predicate)
2544 {
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)
2548 {
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);
2556 }
2557 fprintf (f, " return res;\n");
2558 }
2559 }
2560
2561 for (unsigned i = 0; i < n_braces; ++i)
2562 fprintf (f, "}\n");
2563
2564 fprintf (f, "}\n");
2565 }
2566
2567 /* Main entry to generate code for matching GIMPLE IL off the decision
2568 tree. */
2569
2570 void
2571 decision_tree::gen_gimple (FILE *f)
2572 {
2573 for (unsigned n = 1; n <= 3; ++n)
2574 {
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");
2583
2584 fprintf (f, "switch (code.get_rep())\n"
2585 "{\n");
2586 for (unsigned i = 0; i < root->kids.length (); i++)
2587 {
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;
2592
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");
2604 }
2605 fprintf (f, "default:;\n"
2606 "}\n");
2607
2608 fprintf (f, "return false;\n");
2609 fprintf (f, "}\n");
2610 }
2611 }
2612
2613 /* Main entry to generate code for matching GENERIC IL off the decision
2614 tree. */
2615
2616 void
2617 decision_tree::gen_generic (FILE *f)
2618 {
2619 for (unsigned n = 1; n <= 3; ++n)
2620 {
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");
2628
2629 fprintf (f, "switch (code)\n"
2630 "{\n");
2631 for (unsigned i = 0; i < root->kids.length (); i++)
2632 {
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;
2642
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");
2652 }
2653 fprintf (f, "default:;\n"
2654 "}\n");
2655
2656 fprintf (f, "return NULL_TREE;\n");
2657 fprintf (f, "}\n");
2658 }
2659 }
2660
2661 /* Output code to implement the predicate P from the decision tree DT. */
2662
2663 void
2664 write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple)
2665 {
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");
2673
2674 if (!gimple)
2675 fprintf (f, "if (TREE_SIDE_EFFECTS (t)) return false;\n");
2676 dt.root->gen_kids (f, gimple);
2677
2678 fprintf (f, "return false;\n"
2679 "}\n");
2680 }
2681
2682 /* Write the common header for the GIMPLE/GENERIC IL matching routines. */
2683
2684 static void
2685 write_header (FILE *f, const char *head)
2686 {
2687 fprintf (f, "/* Generated automatically by the program `genmatch' from\n");
2688 fprintf (f, " a IL pattern matching and simplification description. */\n");
2689
2690 /* Include the header instead of writing it awkwardly quoted here. */
2691 fprintf (f, "\n#include \"%s\"\n", head);
2692 }
2693
2694
2695
2696 /* AST parsing. */
2697
2698 class parser
2699 {
2700 public:
2701 parser (cpp_reader *);
2702
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 ();
2713
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 ();
2719
2720 void record_operlist (source_location, user_id *);
2721
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);
2731
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;
2737
2738 cid_map_t *capture_ids;
2739
2740 public:
2741 vec<simplify *> simplifiers;
2742 vec<predicate_id *> user_predicates;
2743 bool parsing_match_operand;
2744 };
2745
2746 /* Lexing helpers. */
2747
2748 /* Read the next non-whitespace token from R. */
2749
2750 const cpp_token *
2751 parser::next ()
2752 {
2753 const cpp_token *token;
2754 do
2755 {
2756 token = cpp_get_token (r);
2757 }
2758 while (token->type == CPP_PADDING
2759 && token->type != CPP_EOF);
2760 return token;
2761 }
2762
2763 /* Peek at the next non-whitespace token from R. */
2764
2765 const cpp_token *
2766 parser::peek ()
2767 {
2768 const cpp_token *token;
2769 unsigned i = 0;
2770 do
2771 {
2772 token = cpp_peek_token (r, i++);
2773 }
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;
2782 }
2783
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). */
2786
2787 const cpp_token *
2788 parser::peek_ident (const char *id)
2789 {
2790 const cpp_token *token = peek ();
2791 if (token->type != CPP_NAME)
2792 return 0;
2793
2794 if (id == 0)
2795 return token;
2796
2797 const char *t = (const char *) CPP_HASHNODE (token->val.node.node)->ident.str;
2798 if (strcmp (id, t) == 0)
2799 return token;
2800
2801 return 0;
2802 }
2803
2804 /* Read the next token from R and assert it is of type TK. */
2805
2806 const cpp_token *
2807 parser::expect (enum cpp_ttype tk)
2808 {
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));
2813
2814 return token;
2815 }
2816
2817 /* Consume the next token from R and assert it is of type TK. */
2818
2819 void
2820 parser::eat_token (enum cpp_ttype tk)
2821 {
2822 expect (tk);
2823 }
2824
2825 /* Read the next token from R and assert it is of type CPP_STRING and
2826 return its value. */
2827
2828 const char *
2829 parser::get_string ()
2830 {
2831 const cpp_token *token = expect (CPP_STRING);
2832 return (const char *)token->val.str.text;
2833 }
2834
2835 /* Read the next token from R and assert it is of type CPP_NAME and
2836 return its value. */
2837
2838 const char *
2839 parser::get_ident ()
2840 {
2841 const cpp_token *token = expect (CPP_NAME);
2842 return (const char *)CPP_HASHNODE (token->val.node.node)->ident.str;
2843 }
2844
2845 /* Eat an identifier token with value S from R. */
2846
2847 void
2848 parser::eat_ident (const char *s)
2849 {
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);
2854 }
2855
2856 /* Read the next token from R and assert it is of type CPP_NUMBER and
2857 return its value. */
2858
2859 const char *
2860 parser::get_number ()
2861 {
2862 const cpp_token *token = expect (CPP_NUMBER);
2863 return (const char *)token->val.str.text;
2864 }
2865
2866
2867 /* Record an operator-list use for transparent for handling. */
2868
2869 void
2870 parser::record_operlist (source_location loc, user_id *p)
2871 {
2872 if (!oper_lists_set->add (p))
2873 {
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);
2879 }
2880 }
2881
2882 /* Parse the operator ID, special-casing convert?, convert1? and
2883 convert2? */
2884
2885 id_base *
2886 parser::parse_operation ()
2887 {
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))
2895 {
2896 if (strcmp (id, "convert") == 0)
2897 id = "convert0";
2898 else if (strcmp (id, "convert1") == 0)
2899 ;
2900 else if (strcmp (id, "convert2") == 0)
2901 ;
2902 else
2903 fatal_at (id_tok, "non-convert operator conditionalized");
2904
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);
2909 }
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);
2916
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;
2921 }
2922
2923 /* Parse a capture.
2924 capture = '@'<number> */
2925
2926 struct operand *
2927 parser::parse_capture (operand *op)
2928 {
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);
2944 }
2945
2946 /* Parse an expression
2947 expr = '(' <operation>[capture][flag][type] <operand>... ')' */
2948
2949 struct operand *
2950 parser::parse_expr ()
2951 {
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;
2957
2958 if (token->type == CPP_COLON
2959 && !(token->flags & PREV_WHITE))
2960 {
2961 eat_token (CPP_COLON);
2962 token = peek ();
2963 if (token->type == CPP_NAME
2964 && !(token->flags & PREV_WHITE))
2965 {
2966 const char *s = get_ident ();
2967 if (s[0] == 'c' && !s[1])
2968 {
2969 if (!parsing_match_operand)
2970 fatal_at (token,
2971 "flag 'c' can only be used in match expression");
2972 is_commutative = true;
2973 }
2974 else if (s[1] != '\0')
2975 {
2976 if (parsing_match_operand)
2977 fatal_at (token, "type can only be used in result expression");
2978 expr_type = s;
2979 }
2980 else
2981 fatal_at (token, "flag %s not recognized", s);
2982
2983 token = peek ();
2984 }
2985 else
2986 fatal_at (token, "expected flag or type specifying identifier");
2987 }
2988
2989 if (token->type == CPP_ATSIGN
2990 && !(token->flags & PREV_WHITE))
2991 op = parse_capture (e);
2992 else
2993 op = e;
2994 do
2995 {
2996 const cpp_token *token = peek ();
2997 if (token->type == CPP_CLOSE_PAREN)
2998 {
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)
3004 {
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");
3010 }
3011 e->expr_type = expr_type;
3012 return op;
3013 }
3014 e->append_op (parse_op ());
3015 }
3016 while (1);
3017 }
3018
3019 /* Lex native C code delimited by START recording the preprocessing tokens
3020 for later processing.
3021 c_expr = ('{'|'(') <pp token>... ('}'|')') */
3022
3023 c_expr *
3024 parser::parse_c_expr (cpp_ttype start)
3025 {
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;
3039 do
3040 {
3041 token = next ();
3042
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;
3049
3050 /* This is a lame way of counting the number of statements. */
3051 if (token->type == CPP_SEMICOLON)
3052 nr_stmts++;
3053
3054 /* If this is possibly a user-defined identifier mark it used. */
3055 if (token->type == CPP_NAME)
3056 {
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);
3062 }
3063
3064 /* Record the token. */
3065 code.safe_push (*token);
3066 }
3067 while (1);
3068 return new c_expr (r, code, nr_stmts, vNULL, capture_ids);
3069 }
3070
3071 /* Parse an operand which is either an expression, a predicate or
3072 a standalone capture.
3073 op = predicate | expr | c_expr | capture */
3074
3075 struct operand *
3076 parser::parse_op ()
3077 {
3078 const cpp_token *token = peek ();
3079 struct operand *op = NULL;
3080 if (token->type == CPP_OPEN_PAREN)
3081 {
3082 eat_token (CPP_OPEN_PAREN);
3083 op = parse_expr ();
3084 eat_token (CPP_CLOSE_PAREN);
3085 }
3086 else if (token->type == CPP_OPEN_BRACE)
3087 {
3088 op = parse_c_expr (CPP_OPEN_BRACE);
3089 }
3090 else
3091 {
3092 /* Remaining ops are either empty or predicates */
3093 if (token->type == CPP_NAME)
3094 {
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))
3100 {
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);
3106 }
3107 else if (user_id *code = dyn_cast <user_id *> (opr))
3108 {
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);
3114 }
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;
3124 }
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);
3133 }
3134
3135 return op;
3136 }
3137
3138 /* Create a new simplify from the current parsing state and MATCH,
3139 MATCH_LOC, RESULT and RESULT_LOC and push it to SIMPLIFIERS. */
3140
3141 void
3142 parser::push_simplify (vec<simplify *>& simplifiers,
3143 operand *match, source_location match_loc,
3144 operand *result, source_location result_loc)
3145 {
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);
3149
3150 simplifiers.safe_push
3151 (new simplify (match, match_loc, result, result_loc,
3152 active_ifs.copy (), active_fors.copy (), capture_ids));
3153
3154 if (!oper_lists.is_empty ())
3155 active_fors.pop ();
3156 }
3157
3158 /* Parse
3159 simplify = 'simplify' <expr> <result-op>
3160 or
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. */
3167
3168 void
3169 parser::parse_simplify (source_location match_location,
3170 vec<simplify *>& simplifiers, predicate_id *matcher,
3171 expr *result)
3172 {
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;
3180
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");
3190
3191 const cpp_token *token = peek ();
3192
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)
3196 {
3197 if (!matcher)
3198 fatal_at (token, "expected transform expression");
3199 push_simplify (simplifiers, match, match_location,
3200 result, token->src_loc);
3201 return;
3202 }
3203
3204 unsigned active_ifs_len = active_ifs.length ();
3205 while (1)
3206 {
3207 if (token->type == CPP_OPEN_PAREN)
3208 {
3209 source_location paren_loc = token->src_loc;
3210 eat_token (CPP_OPEN_PAREN);
3211 if (peek_ident ("if"))
3212 {
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)
3220 {
3221 if (!matcher)
3222 fatal_at (token, "manual transform not implemented");
3223 push_simplify (simplifiers, match, match_location,
3224 result, paren_loc);
3225 }
3226 }
3227 else if (peek_ident ("with"))
3228 {
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));
3234 }
3235 else
3236 {
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)
3245 {
3246 eat_token (CPP_CLOSE_PAREN);
3247 active_ifs.pop ();
3248 }
3249 else
3250 return;
3251 }
3252 }
3253 else if (token->type == CPP_CLOSE_PAREN)
3254 {
3255 /* Close a scope if requested. */
3256 if (active_ifs.length () > active_ifs_len)
3257 {
3258 eat_token (CPP_CLOSE_PAREN);
3259 active_ifs.pop ();
3260 token = peek ();
3261 }
3262 else
3263 return;
3264 }
3265 else
3266 {
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)
3273 {
3274 eat_token (CPP_CLOSE_PAREN);
3275 active_ifs.pop ();
3276 }
3277 else
3278 return;
3279 }
3280 token = peek ();
3281 }
3282 }
3283
3284 /* Parsing of the outer control structures. */
3285
3286 /* Parse a for expression
3287 for = '(' 'for' <subst>... <pattern> ')'
3288 subst = <ident> '(' <ident>... ')' */
3289
3290 void
3291 parser::parse_for (source_location)
3292 {
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;
3297
3298 while (1)
3299 {
3300 token = peek ();
3301 if (token->type != CPP_NAME)
3302 break;
3303
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);
3313
3314 eat_token (CPP_OPEN_PAREN);
3315
3316 int arity = -1;
3317 while ((token = peek_ident ()) != 0)
3318 {
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");
3325
3326 if (arity == -1)
3327 arity = idb->nargs;
3328 else if (idb->nargs == -1)
3329 ;
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);
3333
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);
3339 }
3340 op->nargs = arity;
3341 token = expect (CPP_CLOSE_PAREN);
3342
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)
3348 {
3349 min_n_opers = nsubstitutes;
3350 max_n_opers = nsubstitutes;
3351 }
3352 else
3353 {
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;
3363 }
3364 }
3365
3366 unsigned n_ids = user_ids.length ();
3367 if (n_ids == 0)
3368 fatal_at (token, "for requires at least one user-defined identifier");
3369
3370 token = peek ();
3371 if (token->type == CPP_CLOSE_PAREN)
3372 fatal_at (token, "no pattern defined in for");
3373
3374 active_fors.safe_push (user_ids);
3375 while (1)
3376 {
3377 token = peek ();
3378 if (token->type == CPP_CLOSE_PAREN)
3379 break;
3380 parse_pattern ();
3381 }
3382 active_fors.pop ();
3383
3384 /* Remove user-defined operators from the hash again. */
3385 for (unsigned i = 0; i < user_ids.length (); ++i)
3386 {
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]);
3391 }
3392 }
3393
3394 /* Parse an identifier associated with a list of operators.
3395 oprs = '(' 'define_operator_list' <ident> <ident>... ')' */
3396
3397 void
3398 parser::parse_operator_list (source_location)
3399 {
3400 const cpp_token *token = peek ();
3401 const char *id = get_ident ();
3402
3403 if (get_operator (id) != 0)
3404 fatal_at (token, "operator %s already defined", id);
3405
3406 user_id *op = new user_id (id, true);
3407 int arity = -1;
3408
3409 while ((token = peek_ident ()) != 0)
3410 {
3411 token = peek ();
3412 const char *oper = get_ident ();
3413 id_base *idb = get_operator (oper);
3414
3415 if (idb == 0)
3416 fatal_at (token, "no such operator '%s'", oper);
3417
3418 if (arity == -1)
3419 arity = idb->nargs;
3420 else if (idb->nargs == -1)
3421 ;
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);
3425
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);
3431 }
3432
3433 if (op->substitutes.length () == 0)
3434 fatal_at (token, "operator-list cannot be empty");
3435
3436 op->nargs = arity;
3437 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
3438 *slot = op;
3439 }
3440
3441 /* Parse an outer if expression.
3442 if = '(' 'if' '(' <c-expr> ')' <pattern> ')' */
3443
3444 void
3445 parser::parse_if (source_location loc)
3446 {
3447 operand *ifexpr = parse_c_expr (CPP_OPEN_PAREN);
3448
3449 const cpp_token *token = peek ();
3450 if (token->type == CPP_CLOSE_PAREN)
3451 fatal_at (token, "no pattern defined in if");
3452
3453 active_ifs.safe_push (if_or_with (ifexpr, loc, false));
3454 while (1)
3455 {
3456 const cpp_token *token = peek ();
3457 if (token->type == CPP_CLOSE_PAREN)
3458 break;
3459
3460 parse_pattern ();
3461 }
3462 active_ifs.pop ();
3463 }
3464
3465 /* Parse a list of predefined predicate identifiers.
3466 preds = '(' 'define_predicates' <ident>... ')' */
3467
3468 void
3469 parser::parse_predicates (source_location)
3470 {
3471 do
3472 {
3473 const cpp_token *token = peek ();
3474 if (token->type != CPP_NAME)
3475 break;
3476
3477 add_predicate (get_ident ());
3478 }
3479 while (1);
3480 }
3481
3482 /* Parse outer control structures.
3483 pattern = <preds>|<for>|<if>|<simplify>|<match> */
3484
3485 void
3486 parser::parse_pattern ()
3487 {
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)
3493 {
3494 parse_simplify (token->src_loc, simplifiers, NULL, NULL);
3495 capture_ids = NULL;
3496 }
3497 else if (strcmp (id, "match") == 0)
3498 {
3499 bool with_args = false;
3500 if (peek ()->type == CPP_OPEN_PAREN)
3501 {
3502 eat_token (CPP_OPEN_PAREN);
3503 with_args = true;
3504 }
3505 const char *name = get_ident ();
3506 id_base *id = get_operator (name);
3507 predicate_id *p;
3508 if (!id)
3509 {
3510 p = add_predicate (name);
3511 user_predicates.safe_push (p);
3512 }
3513 else if ((p = dyn_cast <predicate_id *> (id)))
3514 ;
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)
3520 {
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);
3526 }
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;
3534 }
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)
3540 {
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);
3545 }
3546 else if (strcmp (id, "define_operator_list") == 0)
3547 {
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);
3552 }
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', " : "");
3557
3558 eat_token (CPP_CLOSE_PAREN);
3559 }
3560
3561 /* Main entry of the parser. Repeatedly parse outer control structures. */
3562
3563 parser::parser (cpp_reader *r_)
3564 {
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;
3574
3575 const cpp_token *token = next ();
3576 while (token->type != CPP_EOF)
3577 {
3578 _cpp_backup_tokens (r, 1);
3579 parse_pattern ();
3580 token = next ();
3581 }
3582 }
3583
3584
3585 /* Helper for the linemap code. */
3586
3587 static size_t
3588 round_alloc_size (size_t s)
3589 {
3590 return s;
3591 }
3592
3593
3594 /* The genmatch generator progam. It reads from a pattern description
3595 and outputs GIMPLE or GENERIC IL matching and simplification routines. */
3596
3597 int
3598 main (int argc, char **argv)
3599 {
3600 cpp_reader *r;
3601
3602 progname = "genmatch";
3603
3604 if (argc < 2)
3605 return 1;
3606
3607 bool gimple = true;
3608 bool verbose = false;
3609 char *input = argv[argc-1];
3610 for (int i = 1; i < argc - 1; ++i)
3611 {
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
3619 {
3620 fprintf (stderr, "Usage: genmatch "
3621 "[--gimple] [--generic] [-v] input\n");
3622 return 1;
3623 }
3624 }
3625
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;
3630
3631 r = cpp_create_reader (CLK_GNUC99, NULL, line_table);
3632 cpp_callbacks *cb = cpp_get_callbacks (r);
3633 cb->error = error_cb;
3634
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");
3639
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
3651
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
3659
3660 /* Parse ahead! */
3661 parser p (r);
3662
3663 if (gimple)
3664 write_header (stdout, "gimple-match-head.c");
3665 else
3666 write_header (stdout, "generic-match-head.c");
3667
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)
3671 {
3672 predicate_id *pred = p.user_predicates[i];
3673 lower (pred->matchers, gimple);
3674
3675 if (verbose)
3676 for (unsigned i = 0; i < pred->matchers.length (); ++i)
3677 print_matches (pred->matchers[i]);
3678
3679 decision_tree dt;
3680 for (unsigned i = 0; i < pred->matchers.length (); ++i)
3681 dt.insert (pred->matchers[i], i);
3682
3683 if (verbose)
3684 dt.print (stderr);
3685
3686 write_predicate (stdout, pred, dt, gimple);
3687 }
3688
3689 /* Lower the main simplifiers and generate code for them. */
3690 lower (p.simplifiers, gimple);
3691
3692 if (verbose)
3693 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
3694 print_matches (p.simplifiers[i]);
3695
3696 decision_tree dt;
3697 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
3698 dt.insert (p.simplifiers[i], i);
3699
3700 if (verbose)
3701 dt.print (stderr);
3702
3703 if (gimple)
3704 dt.gen_gimple (stdout);
3705 else
3706 dt.gen_generic (stdout);
3707
3708 /* Finalize. */
3709 cpp_finish (r, NULL);
3710 cpp_destroy (r);
3711
3712 delete operators;
3713
3714 return 0;
3715 }