decl.c (gnat_to_gnu_entity): For a derived untagged type that renames discriminants...
[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 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 "vec.h"
35 #include "is-a.h"
36
37
38 /* Stubs for GGC referenced through instantiations triggered by hash-map. */
39 void *ggc_internal_cleared_alloc (size_t, void (*)(void *),
40 size_t, size_t
41 CXX_MEM_STAT_INFO)
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, 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 error: ", loc.file, loc.line, loc.column);
65 vfprintf (stderr, msg, *ap);
66 fprintf (stderr, "\n");
67 FILE *f = fopen (loc.file, "r");
68 if (f)
69 {
70 char buf[128];
71 while (loc.line > 0)
72 {
73 if (!fgets (buf, 128, f))
74 goto notfound;
75 if (buf[strlen (buf) - 1] != '\n')
76 {
77 if (loc.line > 1)
78 loc.line++;
79 }
80 loc.line--;
81 }
82 fprintf (stderr, "%s", buf);
83 for (int i = 0; i < loc.column - 1; ++i)
84 fputc (' ', stderr);
85 fputc ('^', stderr);
86 fputc ('\n', stderr);
87 notfound:
88 fclose (f);
89 }
90 exit (1);
91 }
92
93 static void
94 #if GCC_VERSION >= 4001
95 __attribute__((format (printf, 2, 3)))
96 #endif
97 fatal_at (const cpp_token *tk, const char *msg, ...)
98 {
99 va_list ap;
100 va_start (ap, msg);
101 error_cb (NULL, CPP_DL_FATAL, 0, tk->src_loc, 0, msg, &ap);
102 va_end (ap);
103 }
104
105 static void
106 output_line_directive (FILE *f, source_location location,
107 bool dumpfile = false)
108 {
109 const line_map *map;
110 linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
111 expanded_location loc = linemap_expand_location (line_table, map, location);
112 if (dumpfile)
113 {
114 /* When writing to a dumpfile only dump the filename. */
115 const char *file = strrchr (loc.file, DIR_SEPARATOR);
116 if (!file)
117 file = loc.file;
118 else
119 ++file;
120 fprintf (f, "%s:%d", file, loc.line);
121 }
122 else
123 /* Other gen programs really output line directives here, at least for
124 development it's right now more convenient to have line information
125 from the generated file. Still keep the directives as comment for now
126 to easily back-point to the meta-description. */
127 fprintf (f, "/* #line %d \"%s\" */\n", loc.line, loc.file);
128 }
129
130
131 /* Pull in tree codes and builtin function codes from their
132 definition files. */
133
134 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM,
135 enum tree_code {
136 #include "tree.def"
137 CONVERT0,
138 CONVERT1,
139 CONVERT2,
140 MAX_TREE_CODES
141 };
142 #undef DEFTREECODE
143
144 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
145 enum built_in_function {
146 #include "builtins.def"
147 END_BUILTINS
148 };
149 #undef DEF_BUILTIN
150
151
152 /* Base class for all identifiers the parser knows. */
153
154 struct id_base : typed_noop_remove<id_base>
155 {
156 enum id_kind { CODE, FN, PREDICATE, USER } kind;
157
158 id_base (id_kind, const char *, int = -1);
159
160 hashval_t hashval;
161 int nargs;
162 const char *id;
163
164 /* hash_table support. */
165 typedef id_base value_type;
166 typedef id_base compare_type;
167 static inline hashval_t hash (const value_type *);
168 static inline int equal (const value_type *, const compare_type *);
169 };
170
171 inline hashval_t
172 id_base::hash (const value_type *op)
173 {
174 return op->hashval;
175 }
176
177 inline int
178 id_base::equal (const value_type *op1,
179 const compare_type *op2)
180 {
181 return (op1->hashval == op2->hashval
182 && strcmp (op1->id, op2->id) == 0);
183 }
184
185 /* Hashtable of known pattern operators. This is pre-seeded from
186 all known tree codes and all known builtin function ids. */
187 static hash_table<id_base> *operators;
188
189 id_base::id_base (id_kind kind_, const char *id_, int nargs_)
190 {
191 kind = kind_;
192 id = id_;
193 nargs = nargs_;
194 hashval = htab_hash_string (id);
195 }
196
197 /* Identifier that maps to a tree code. */
198
199 struct operator_id : public id_base
200 {
201 operator_id (enum tree_code code_, const char *id_, unsigned nargs_,
202 const char *tcc_)
203 : id_base (id_base::CODE, id_, nargs_), code (code_), tcc (tcc_) {}
204 enum tree_code code;
205 const char *tcc;
206 };
207
208 /* Identifier that maps to a builtin function code. */
209
210 struct fn_id : public id_base
211 {
212 fn_id (enum built_in_function fn_, const char *id_)
213 : id_base (id_base::FN, id_), fn (fn_) {}
214 enum built_in_function fn;
215 };
216
217 struct simplify;
218
219 /* Identifier that maps to a user-defined predicate. */
220
221 struct predicate_id : public id_base
222 {
223 predicate_id (const char *id_)
224 : id_base (id_base::PREDICATE, id_), matchers (vNULL) {}
225 vec<simplify *> matchers;
226 };
227
228 /* Identifier that maps to a operator defined by a 'for' directive. */
229
230 struct user_id : public id_base
231 {
232 user_id (const char *id_)
233 : id_base (id_base::USER, id_), substitutes (vNULL) {}
234 vec<id_base *> substitutes;
235 };
236
237 template<>
238 template<>
239 inline bool
240 is_a_helper <fn_id *>::test (id_base *id)
241 {
242 return id->kind == id_base::FN;
243 }
244
245 template<>
246 template<>
247 inline bool
248 is_a_helper <operator_id *>::test (id_base *id)
249 {
250 return id->kind == id_base::CODE;
251 }
252
253 template<>
254 template<>
255 inline bool
256 is_a_helper <predicate_id *>::test (id_base *id)
257 {
258 return id->kind == id_base::PREDICATE;
259 }
260
261 template<>
262 template<>
263 inline bool
264 is_a_helper <user_id *>::test (id_base *id)
265 {
266 return id->kind == id_base::USER;
267 }
268
269 /* Add a predicate identifier to the hash. */
270
271 static predicate_id *
272 add_predicate (const char *id)
273 {
274 predicate_id *p = new predicate_id (id);
275 id_base **slot = operators->find_slot_with_hash (p, p->hashval, INSERT);
276 if (*slot)
277 fatal ("duplicate id definition");
278 *slot = p;
279 return p;
280 }
281
282 /* Add a tree code identifier to the hash. */
283
284 static void
285 add_operator (enum tree_code code, const char *id,
286 const char *tcc, unsigned nargs)
287 {
288 if (strcmp (tcc, "tcc_unary") != 0
289 && strcmp (tcc, "tcc_binary") != 0
290 && strcmp (tcc, "tcc_comparison") != 0
291 && strcmp (tcc, "tcc_expression") != 0
292 /* For {REAL,IMAG}PART_EXPR and VIEW_CONVERT_EXPR. */
293 && strcmp (tcc, "tcc_reference") != 0
294 /* To have INTEGER_CST and friends as "predicate operators". */
295 && strcmp (tcc, "tcc_constant") != 0)
296 return;
297 operator_id *op = new operator_id (code, id, nargs, tcc);
298 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
299 if (*slot)
300 fatal ("duplicate id definition");
301 *slot = op;
302 }
303
304 /* Add a builtin identifier to the hash. */
305
306 static void
307 add_builtin (enum built_in_function code, const char *id)
308 {
309 fn_id *fn = new fn_id (code, id);
310 id_base **slot = operators->find_slot_with_hash (fn, fn->hashval, INSERT);
311 if (*slot)
312 fatal ("duplicate id definition");
313 *slot = fn;
314 }
315
316 /* Helper for easy comparing ID with tree code CODE. */
317
318 static bool
319 operator==(id_base &id, enum tree_code code)
320 {
321 if (operator_id *oid = dyn_cast <operator_id *> (&id))
322 return oid->code == code;
323 return false;
324 }
325
326 /* Lookup the identifier ID. */
327
328 id_base *
329 get_operator (const char *id)
330 {
331 id_base tem (id_base::CODE, id);
332
333 id_base *op = operators->find_with_hash (&tem, tem.hashval);
334 if (op)
335 return op;
336
337 /* Try all-uppercase. */
338 char *id2 = xstrdup (id);
339 for (unsigned i = 0; i < strlen (id2); ++i)
340 id2[i] = TOUPPER (id2[i]);
341 new (&tem) id_base (id_base::CODE, id2);
342 op = operators->find_with_hash (&tem, tem.hashval);
343 if (op)
344 {
345 free (id2);
346 return op;
347 }
348
349 /* Try _EXPR appended. */
350 id2 = (char *)xrealloc (id2, strlen (id2) + sizeof ("_EXPR") + 1);
351 strcat (id2, "_EXPR");
352 new (&tem) id_base (id_base::CODE, id2);
353 op = operators->find_with_hash (&tem, tem.hashval);
354 if (op)
355 {
356 free (id2);
357 return op;
358 }
359
360 return 0;
361 }
362
363
364 /* Helper for the capture-id map. */
365
366 struct capture_id_map_hasher : default_hashmap_traits
367 {
368 static inline hashval_t hash (const char *);
369 static inline bool equal_keys (const char *, const char *);
370 };
371
372 inline hashval_t
373 capture_id_map_hasher::hash (const char *id)
374 {
375 return htab_hash_string (id);
376 }
377
378 inline bool
379 capture_id_map_hasher::equal_keys (const char *id1, const char *id2)
380 {
381 return strcmp (id1, id2) == 0;
382 }
383
384 typedef hash_map<const char *, unsigned, capture_id_map_hasher> cid_map_t;
385
386
387 /* The AST produced by parsing of the pattern definitions. */
388
389 struct dt_operand;
390
391 /* The base class for operands. */
392
393 struct operand {
394 enum op_type { OP_PREDICATE, OP_EXPR, OP_CAPTURE, OP_C_EXPR };
395 operand (enum op_type type_) : type (type_) {}
396 enum op_type type;
397 virtual void gen_transform (FILE *, const char *, bool, int,
398 const char *, dt_operand ** = 0)
399 { gcc_unreachable (); }
400 };
401
402 /* A predicate operand. Predicates are leafs in the AST. */
403
404 struct predicate : public operand
405 {
406 predicate (predicate_id *p_) : operand (OP_PREDICATE), p (p_) {}
407 predicate_id *p;
408 };
409
410 /* An operand that constitutes an expression. Expressions include
411 function calls and user-defined predicate invocations. */
412
413 struct expr : public operand
414 {
415 expr (id_base *operation_, bool is_commutative_ = false)
416 : operand (OP_EXPR), operation (operation_),
417 ops (vNULL), expr_type (NULL), is_commutative (is_commutative_) {}
418 void append_op (operand *op) { ops.safe_push (op); }
419 /* The operator and its operands. */
420 id_base *operation;
421 vec<operand *> ops;
422 /* An explicitely specified type - used exclusively for conversions. */
423 const char *expr_type;
424 /* Whether the operation is to be applied commutatively. This is
425 later lowered to two separate patterns. */
426 bool is_commutative;
427 virtual void gen_transform (FILE *f, const char *, bool, int,
428 const char *, dt_operand ** = 0);
429 };
430
431 /* An operator that is represented by native C code. This is always
432 a leaf operand in the AST. This class is also used to represent
433 the code to be generated for 'if' and 'with' expressions. */
434
435 struct c_expr : public operand
436 {
437 /* A mapping of an identifier and its replacement. Used to apply
438 'for' lowering. */
439 struct id_tab {
440 const char *id;
441 const char *oper;
442 id_tab (const char *id_, const char *oper_): id (id_), oper (oper_) {}
443 };
444
445 c_expr (cpp_reader *r_, vec<cpp_token> code_, unsigned nr_stmts_,
446 vec<id_tab> ids_, cid_map_t *capture_ids_)
447 : operand (OP_C_EXPR), r (r_), code (code_), capture_ids (capture_ids_),
448 nr_stmts (nr_stmts_), ids (ids_) {}
449 /* cpplib tokens and state to transform this back to source. */
450 cpp_reader *r;
451 vec<cpp_token> code;
452 cid_map_t *capture_ids;
453 /* The number of statements parsed (well, the number of ';'s). */
454 unsigned nr_stmts;
455 /* The identifier replacement vector. */
456 vec<id_tab> ids;
457 virtual void gen_transform (FILE *f, const char *, bool, int,
458 const char *, dt_operand **);
459 };
460
461 /* A wrapper around another operand that captures its value. */
462
463 struct capture : public operand
464 {
465 capture (unsigned where_, operand *what_)
466 : operand (OP_CAPTURE), where (where_), what (what_) {}
467 /* Identifier index for the value. */
468 unsigned where;
469 /* The captured value. */
470 operand *what;
471 virtual void gen_transform (FILE *f, const char *, bool, int,
472 const char *, dt_operand ** = 0);
473 };
474
475 template<>
476 template<>
477 inline bool
478 is_a_helper <capture *>::test (operand *op)
479 {
480 return op->type == operand::OP_CAPTURE;
481 }
482
483 template<>
484 template<>
485 inline bool
486 is_a_helper <predicate *>::test (operand *op)
487 {
488 return op->type == operand::OP_PREDICATE;
489 }
490
491 template<>
492 template<>
493 inline bool
494 is_a_helper <c_expr *>::test (operand *op)
495 {
496 return op->type == operand::OP_C_EXPR;
497 }
498
499 template<>
500 template<>
501 inline bool
502 is_a_helper <expr *>::test (operand *op)
503 {
504 return op->type == operand::OP_EXPR;
505 }
506
507 /* Helper to distinguish 'if' from 'with' expressions. */
508
509 struct if_or_with
510 {
511 if_or_with (operand *cexpr_, source_location location_, bool is_with_)
512 : location (location_), cexpr (cexpr_), is_with (is_with_) {}
513 source_location location;
514 operand *cexpr;
515 bool is_with;
516 };
517
518 /* The main class of a pattern and its transform. This is used to
519 represent both (simplify ...) and (match ...) kinds. The AST
520 duplicates all outer 'if' and 'for' expressions here so each
521 simplify can exist in isolation. */
522
523 struct simplify
524 {
525 simplify (operand *match_, source_location match_location_,
526 struct operand *result_, source_location result_location_,
527 vec<if_or_with> ifexpr_vec_, vec<vec<user_id *> > for_vec_,
528 cid_map_t *capture_ids_)
529 : match (match_), match_location (match_location_),
530 result (result_), result_location (result_location_),
531 ifexpr_vec (ifexpr_vec_), for_vec (for_vec_),
532 capture_ids (capture_ids_), capture_max (capture_ids_->elements () - 1) {}
533
534 /* The expression that is matched against the GENERIC or GIMPLE IL. */
535 operand *match;
536 source_location match_location;
537 /* For a (simplify ...) the expression produced when the pattern applies.
538 For a (match ...) either NULL if it is a simple predicate or the
539 single expression specifying the matched operands. */
540 struct operand *result;
541 source_location result_location;
542 /* Collected 'if' expressions that need to evaluate to true to make
543 the pattern apply. */
544 vec<if_or_with> ifexpr_vec;
545 /* Collected 'for' expression operators that have to be replaced
546 in the lowering phase. */
547 vec<vec<user_id *> > for_vec;
548 /* A map of capture identifiers to indexes. */
549 cid_map_t *capture_ids;
550 int capture_max;
551 };
552
553 /* Debugging routines for dumping the AST. */
554
555 DEBUG_FUNCTION void
556 print_operand (operand *o, FILE *f = stderr, bool flattened = false)
557 {
558 if (capture *c = dyn_cast<capture *> (o))
559 {
560 fprintf (f, "@%u", c->where);
561 if (c->what && flattened == false)
562 {
563 putc (':', f);
564 print_operand (c->what, f, flattened);
565 putc (' ', f);
566 }
567 }
568
569 else if (predicate *p = dyn_cast<predicate *> (o))
570 fprintf (f, "%s", p->p->id);
571
572 else if (is_a<c_expr *> (o))
573 fprintf (f, "c_expr");
574
575 else if (expr *e = dyn_cast<expr *> (o))
576 {
577 fprintf (f, "(%s", e->operation->id);
578
579 if (flattened == false)
580 {
581 putc (' ', f);
582 for (unsigned i = 0; i < e->ops.length (); ++i)
583 {
584 print_operand (e->ops[i], f, flattened);
585 putc (' ', f);
586 }
587 }
588 putc (')', f);
589 }
590
591 else
592 gcc_unreachable ();
593 }
594
595 DEBUG_FUNCTION void
596 print_matches (struct simplify *s, FILE *f = stderr)
597 {
598 fprintf (f, "for expression: ");
599 print_operand (s->match, f);
600 putc ('\n', f);
601 }
602
603
604 /* AST lowering. */
605
606 /* Lowering of commutative operators. */
607
608 static void
609 cartesian_product (const vec< vec<operand *> >& ops_vector,
610 vec< vec<operand *> >& result, vec<operand *>& v, unsigned n)
611 {
612 if (n == ops_vector.length ())
613 {
614 vec<operand *> xv = v.copy ();
615 result.safe_push (xv);
616 return;
617 }
618
619 for (unsigned i = 0; i < ops_vector[n].length (); ++i)
620 {
621 v[n] = ops_vector[n][i];
622 cartesian_product (ops_vector, result, v, n + 1);
623 }
624 }
625
626 /* Lower OP to two operands in case it is marked as commutative. */
627
628 static vec<operand *>
629 commutate (operand *op)
630 {
631 vec<operand *> ret = vNULL;
632
633 if (capture *c = dyn_cast <capture *> (op))
634 {
635 if (!c->what)
636 {
637 ret.safe_push (op);
638 return ret;
639 }
640 vec<operand *> v = commutate (c->what);
641 for (unsigned i = 0; i < v.length (); ++i)
642 {
643 capture *nc = new capture (c->where, v[i]);
644 ret.safe_push (nc);
645 }
646 return ret;
647 }
648
649 expr *e = dyn_cast <expr *> (op);
650 if (!e || e->ops.length () == 0)
651 {
652 ret.safe_push (op);
653 return ret;
654 }
655
656 vec< vec<operand *> > ops_vector = vNULL;
657 for (unsigned i = 0; i < e->ops.length (); ++i)
658 ops_vector.safe_push (commutate (e->ops[i]));
659
660 auto_vec< vec<operand *> > result;
661 auto_vec<operand *> v (e->ops.length ());
662 v.quick_grow_cleared (e->ops.length ());
663 cartesian_product (ops_vector, result, v, 0);
664
665
666 for (unsigned i = 0; i < result.length (); ++i)
667 {
668 expr *ne = new expr (e->operation);
669 for (unsigned j = 0; j < result[i].length (); ++j)
670 ne->append_op (result[i][j]);
671 ret.safe_push (ne);
672 }
673
674 if (!e->is_commutative)
675 return ret;
676
677 for (unsigned i = 0; i < result.length (); ++i)
678 {
679 expr *ne = new expr (e->operation);
680 // result[i].length () is 2 since e->operation is binary
681 for (unsigned j = result[i].length (); j; --j)
682 ne->append_op (result[i][j-1]);
683 ret.safe_push (ne);
684 }
685
686 return ret;
687 }
688
689 /* Lower operations marked as commutative in the AST of S and push
690 the resulting patterns to SIMPLIFIERS. */
691
692 static void
693 lower_commutative (simplify *s, vec<simplify *>& simplifiers)
694 {
695 vec<operand *> matchers = commutate (s->match);
696 for (unsigned i = 0; i < matchers.length (); ++i)
697 {
698 simplify *ns = new simplify (matchers[i], s->match_location,
699 s->result, s->result_location, s->ifexpr_vec,
700 s->for_vec, s->capture_ids);
701 simplifiers.safe_push (ns);
702 }
703 }
704
705 /* Strip conditional conversios using operator OPER from O and its
706 children if STRIP, else replace them with an unconditional convert. */
707
708 operand *
709 lower_opt_convert (operand *o, enum tree_code oper, bool strip)
710 {
711 if (capture *c = dyn_cast<capture *> (o))
712 {
713 if (c->what)
714 return new capture (c->where, lower_opt_convert (c->what, oper, strip));
715 else
716 return c;
717 }
718
719 expr *e = dyn_cast<expr *> (o);
720 if (!e)
721 return o;
722
723 if (*e->operation == oper)
724 {
725 if (strip)
726 return lower_opt_convert (e->ops[0], oper, strip);
727
728 expr *ne = new expr (get_operator ("CONVERT_EXPR"));
729 ne->append_op (lower_opt_convert (e->ops[0], oper, strip));
730 return ne;
731 }
732
733 expr *ne = new expr (e->operation, e->is_commutative);
734 for (unsigned i = 0; i < e->ops.length (); ++i)
735 ne->append_op (lower_opt_convert (e->ops[i], oper, strip));
736
737 return ne;
738 }
739
740 /* Determine whether O or its children uses the conditional conversion
741 operator OPER. */
742
743 static bool
744 has_opt_convert (operand *o, enum tree_code oper)
745 {
746 if (capture *c = dyn_cast<capture *> (o))
747 {
748 if (c->what)
749 return has_opt_convert (c->what, oper);
750 else
751 return false;
752 }
753
754 expr *e = dyn_cast<expr *> (o);
755 if (!e)
756 return false;
757
758 if (*e->operation == oper)
759 return true;
760
761 for (unsigned i = 0; i < e->ops.length (); ++i)
762 if (has_opt_convert (e->ops[i], oper))
763 return true;
764
765 return false;
766 }
767
768 /* Lower conditional convert operators in O, expanding it to a vector
769 if required. */
770
771 static vec<operand *>
772 lower_opt_convert (operand *o)
773 {
774 vec<operand *> v1 = vNULL, v2;
775
776 v1.safe_push (o);
777
778 enum tree_code opers[] = { CONVERT0, CONVERT1, CONVERT2 };
779
780 /* Conditional converts are lowered to a pattern with the
781 conversion and one without. The three different conditional
782 convert codes are lowered separately. */
783
784 for (unsigned i = 0; i < 3; ++i)
785 {
786 v2 = vNULL;
787 for (unsigned j = 0; j < v1.length (); ++j)
788 if (has_opt_convert (v1[j], opers[i]))
789 {
790 v2.safe_push (lower_opt_convert (v1[j], opers[i], false));
791 v2.safe_push (lower_opt_convert (v1[j], opers[i], true));
792 }
793
794 if (v2 != vNULL)
795 {
796 v1 = vNULL;
797 for (unsigned j = 0; j < v2.length (); ++j)
798 v1.safe_push (v2[j]);
799 }
800 }
801
802 return v1;
803 }
804
805 /* Lower conditional convert operators in the AST of S and push
806 the resulting multiple patterns to SIMPLIFIERS. */
807
808 static void
809 lower_opt_convert (simplify *s, vec<simplify *>& simplifiers)
810 {
811 vec<operand *> matchers = lower_opt_convert (s->match);
812 for (unsigned i = 0; i < matchers.length (); ++i)
813 {
814 simplify *ns = new simplify (matchers[i], s->match_location,
815 s->result, s->result_location, s->ifexpr_vec,
816 s->for_vec, s->capture_ids);
817 simplifiers.safe_push (ns);
818 }
819 }
820
821 /* In AST operand O replace operator ID with operator WITH. */
822
823 operand *
824 replace_id (operand *o, user_id *id, id_base *with)
825 {
826 /* Deep-copy captures and expressions, replacing operations as
827 needed. */
828 if (capture *c = dyn_cast<capture *> (o))
829 {
830 if (!c->what)
831 return c;
832 return new capture (c->where, replace_id (c->what, id, with));
833 }
834 else if (expr *e = dyn_cast<expr *> (o))
835 {
836 expr *ne = new expr (e->operation == id ? with : e->operation,
837 e->is_commutative);
838 for (unsigned i = 0; i < e->ops.length (); ++i)
839 ne->append_op (replace_id (e->ops[i], id, with));
840 return ne;
841 }
842
843 /* For c_expr we simply record a string replacement table which is
844 applied at code-generation time. */
845 if (c_expr *ce = dyn_cast<c_expr *> (o))
846 {
847 vec<c_expr::id_tab> ids = ce->ids.copy ();
848 ids.safe_push (c_expr::id_tab (id->id, with->id));
849 return new c_expr (ce->r, ce->code, ce->nr_stmts, ids, ce->capture_ids);
850 }
851
852 return o;
853 }
854
855 /* Lower recorded fors for SIN and output to SIMPLIFIERS. */
856
857 static void
858 lower_for (simplify *sin, vec<simplify *>& simplifiers)
859 {
860 vec<vec<user_id *> >& for_vec = sin->for_vec;
861 unsigned worklist_start = 0;
862 auto_vec<simplify *> worklist;
863 worklist.safe_push (sin);
864
865 /* Lower each recorded for separately, operating on the
866 set of simplifiers created by the previous one.
867 Lower inner-to-outer so inner for substitutes can refer
868 to operators replaced by outer fors. */
869 for (int fi = for_vec.length () - 1; fi >= 0; --fi)
870 {
871 vec<user_id *>& ids = for_vec[fi];
872 unsigned n_ids = ids.length ();
873 unsigned max_n_opers = 0;
874 for (unsigned i = 0; i < n_ids; ++i)
875 if (ids[i]->substitutes.length () > max_n_opers)
876 max_n_opers = ids[i]->substitutes.length ();
877
878 unsigned worklist_end = worklist.length ();
879 for (unsigned si = worklist_start; si < worklist_end; ++si)
880 {
881 simplify *s = worklist[si];
882 for (unsigned j = 0; j < max_n_opers; ++j)
883 {
884 operand *match_op = s->match;
885 operand *result_op = s->result;
886 vec<if_or_with> ifexpr_vec = s->ifexpr_vec.copy ();
887
888 for (unsigned i = 0; i < n_ids; ++i)
889 {
890 user_id *id = ids[i];
891 id_base *oper = id->substitutes[j % id->substitutes.length ()];
892 match_op = replace_id (match_op, id, oper);
893 if (result_op)
894 result_op = replace_id (result_op, id, oper);
895 for (unsigned k = 0; k < s->ifexpr_vec.length (); ++k)
896 ifexpr_vec[k].cexpr = replace_id (ifexpr_vec[k].cexpr,
897 id, oper);
898 }
899 simplify *ns = new simplify (match_op, s->match_location,
900 result_op, s->result_location,
901 ifexpr_vec, vNULL, s->capture_ids);
902 worklist.safe_push (ns);
903 }
904 }
905 worklist_start = worklist_end;
906 }
907
908 /* Copy out the result from the last for lowering. */
909 for (unsigned i = worklist_start; i < worklist.length (); ++i)
910 simplifiers.safe_push (worklist[i]);
911 }
912
913 /* Lower the AST for everything in SIMPLIFIERS. */
914
915 static void
916 lower (vec<simplify *>& simplifiers)
917 {
918 auto_vec<simplify *> out_simplifiers0;
919 for (unsigned i = 0; i < simplifiers.length (); ++i)
920 lower_opt_convert (simplifiers[i], out_simplifiers0);
921
922 auto_vec<simplify *> out_simplifiers1;
923 for (unsigned i = 0; i < out_simplifiers0.length (); ++i)
924 lower_commutative (out_simplifiers0[i], out_simplifiers1);
925
926 simplifiers.truncate (0);
927 for (unsigned i = 0; i < out_simplifiers1.length (); ++i)
928 lower_for (out_simplifiers1[i], simplifiers);
929 }
930
931
932
933
934 /* The decision tree built for generating GIMPLE and GENERIC pattern
935 matching code. It represents the 'match' expression of all
936 simplifies and has those as its leafs. */
937
938 /* Decision tree base class, used for DT_TRUE and DT_NODE. */
939
940 struct dt_node
941 {
942 enum dt_type { DT_NODE, DT_OPERAND, DT_TRUE, DT_MATCH, DT_SIMPLIFY };
943
944 enum dt_type type;
945 unsigned level;
946 vec<dt_node *> kids;
947
948 dt_node (enum dt_type type_): type (type_), level (0), kids (vNULL) {}
949
950 dt_node *append_node (dt_node *);
951 dt_node *append_op (operand *, dt_node *parent = 0, unsigned pos = 0);
952 dt_node *append_true_op (dt_node *parent = 0, unsigned pos = 0);
953 dt_node *append_match_op (dt_operand *, dt_node *parent = 0, unsigned pos = 0);
954 dt_node *append_simplify (simplify *, unsigned, dt_operand **);
955
956 virtual void gen (FILE *, bool) {}
957
958 void gen_kids (FILE *, bool);
959 };
960
961 /* Generic decision tree node used for DT_OPERAND and DT_MATCH. */
962
963 struct dt_operand : public dt_node
964 {
965 operand *op;
966 dt_operand *match_dop;
967 dt_operand *parent;
968 unsigned pos;
969
970 dt_operand (enum dt_type type, operand *op_, dt_operand *match_dop_,
971 dt_operand *parent_ = 0, unsigned pos_ = 0)
972 : dt_node (type), op (op_), match_dop (match_dop_),
973 parent (parent_), pos (pos_) {}
974
975 void gen (FILE *, bool);
976 unsigned gen_predicate (FILE *, const char *, bool);
977 unsigned gen_match_op (FILE *, const char *);
978
979 unsigned gen_gimple_expr (FILE *);
980 unsigned gen_generic_expr (FILE *, const char *);
981
982 char *get_name (char *);
983 void gen_opname (char *, unsigned);
984 };
985
986 /* Leaf node of the decision tree, used for DT_SIMPLIFY. */
987
988 struct dt_simplify : public dt_node
989 {
990 simplify *s;
991 unsigned pattern_no;
992 dt_operand **indexes;
993
994 dt_simplify (simplify *s_, unsigned pattern_no_, dt_operand **indexes_)
995 : dt_node (DT_SIMPLIFY), s (s_), pattern_no (pattern_no_),
996 indexes (indexes_) {}
997
998 void gen (FILE *f, bool);
999 };
1000
1001 template<>
1002 template<>
1003 inline bool
1004 is_a_helper <dt_operand *>::test (dt_node *n)
1005 {
1006 return (n->type == dt_node::DT_OPERAND
1007 || n->type == dt_node::DT_MATCH);
1008 }
1009
1010 /* A container for the actual decision tree. */
1011
1012 struct decision_tree
1013 {
1014 dt_node *root;
1015
1016 void insert (struct simplify *, unsigned);
1017 void gen_gimple (FILE *f = stderr);
1018 void gen_generic (FILE *f = stderr);
1019 void print (FILE *f = stderr);
1020
1021 decision_tree () { root = new dt_node (dt_node::DT_NODE); }
1022
1023 static dt_node *insert_operand (dt_node *, operand *, dt_operand **indexes,
1024 unsigned pos = 0, dt_node *parent = 0);
1025 static dt_node *find_node (vec<dt_node *>&, dt_node *);
1026 static bool cmp_node (dt_node *, dt_node *);
1027 static void print_node (dt_node *, FILE *f = stderr, unsigned = 0);
1028 };
1029
1030 /* Compare two AST operands O1 and O2 and return true if they are equal. */
1031
1032 bool
1033 cmp_operand (operand *o1, operand *o2)
1034 {
1035 if (!o1 || !o2 || o1->type != o2->type)
1036 return false;
1037
1038 if (o1->type == operand::OP_PREDICATE)
1039 {
1040 predicate *p1 = as_a<predicate *>(o1);
1041 predicate *p2 = as_a<predicate *>(o2);
1042 return p1->p == p2->p;
1043 }
1044 else if (o1->type == operand::OP_EXPR)
1045 {
1046 expr *e1 = static_cast<expr *>(o1);
1047 expr *e2 = static_cast<expr *>(o2);
1048 return e1->operation == e2->operation;
1049 }
1050 else
1051 return false;
1052 }
1053
1054 /* Compare two decision tree nodes N1 and N2 and return true if they
1055 are equal. */
1056
1057 bool
1058 decision_tree::cmp_node (dt_node *n1, dt_node *n2)
1059 {
1060 if (!n1 || !n2 || n1->type != n2->type)
1061 return false;
1062
1063 if (n1 == n2 || n1->type == dt_node::DT_TRUE)
1064 return true;
1065
1066 if (n1->type == dt_node::DT_OPERAND)
1067 return cmp_operand ((as_a<dt_operand *> (n1))->op,
1068 (as_a<dt_operand *> (n2))->op);
1069 else if (n1->type == dt_node::DT_MATCH)
1070 return ((as_a<dt_operand *> (n1))->match_dop
1071 == (as_a<dt_operand *> (n2))->match_dop);
1072 return false;
1073 }
1074
1075 /* Search OPS for a decision tree node like P and return it if found. */
1076
1077 dt_node *
1078 decision_tree::find_node (vec<dt_node *>& ops, dt_node *p)
1079 {
1080 for (unsigned i = 0; i < ops.length (); ++i)
1081 if (decision_tree::cmp_node (ops[i], p))
1082 return ops[i];
1083
1084 return NULL;
1085 }
1086
1087 /* Append N to the decision tree if it there is not already an existing
1088 identical child. */
1089
1090 dt_node *
1091 dt_node::append_node (dt_node *n)
1092 {
1093 dt_node *kid;
1094
1095 kid = decision_tree::find_node (kids, n);
1096 if (kid)
1097 return kid;
1098
1099 kids.safe_push (n);
1100 n->level = this->level + 1;
1101
1102 unsigned len = kids.length ();
1103
1104 if (len > 1 && kids[len - 2]->type == dt_node::DT_TRUE)
1105 {
1106 dt_node *p = kids[len - 2];
1107 kids[len - 2] = kids[len - 1];
1108 kids[len - 1] = p;
1109 }
1110
1111 return n;
1112 }
1113
1114 /* Append OP to the decision tree. */
1115
1116 dt_node *
1117 dt_node::append_op (operand *op, dt_node *parent, unsigned pos)
1118 {
1119 dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1120 dt_operand *n = new dt_operand (DT_OPERAND, op, 0, parent_, pos);
1121 return append_node (n);
1122 }
1123
1124 /* Append a DT_TRUE decision tree node. */
1125
1126 dt_node *
1127 dt_node::append_true_op (dt_node *parent, unsigned pos)
1128 {
1129 dt_operand *parent_ = as_a<dt_operand *> (parent);
1130 dt_operand *n = new dt_operand (DT_TRUE, 0, 0, parent_, pos);
1131 return append_node (n);
1132 }
1133
1134 /* Append a DT_MATCH decision tree node. */
1135
1136 dt_node *
1137 dt_node::append_match_op (dt_operand *match_dop, dt_node *parent, unsigned pos)
1138 {
1139 dt_operand *parent_ = as_a<dt_operand *> (parent);
1140 dt_operand *n = new dt_operand (DT_MATCH, 0, match_dop, parent_, pos);
1141 return append_node (n);
1142 }
1143
1144 /* Append S to the decision tree. */
1145
1146 dt_node *
1147 dt_node::append_simplify (simplify *s, unsigned pattern_no,
1148 dt_operand **indexes)
1149 {
1150 dt_simplify *n = new dt_simplify (s, pattern_no, indexes);
1151 return append_node (n);
1152 }
1153
1154 /* Insert O into the decision tree and return the decision tree node found
1155 or created. */
1156
1157 dt_node *
1158 decision_tree::insert_operand (dt_node *p, operand *o, dt_operand **indexes,
1159 unsigned pos, dt_node *parent)
1160 {
1161 dt_node *q, *elm = 0;
1162
1163 if (capture *c = dyn_cast<capture *> (o))
1164 {
1165 unsigned capt_index = c->where;
1166
1167 if (indexes[capt_index] == 0)
1168 {
1169 if (c->what)
1170 q = insert_operand (p, c->what, indexes, pos, parent);
1171 else
1172 {
1173 q = elm = p->append_true_op (parent, pos);
1174 goto at_assert_elm;
1175 }
1176 // get to the last capture
1177 for (operand *what = c->what;
1178 what && is_a<capture *> (what);
1179 c = as_a<capture *> (what), what = c->what)
1180 ;
1181
1182 if (!c->what)
1183 {
1184 unsigned cc_index = c->where;
1185 dt_operand *match_op = indexes[cc_index];
1186
1187 dt_operand temp (dt_node::DT_TRUE, 0, 0);
1188 elm = decision_tree::find_node (p->kids, &temp);
1189
1190 if (elm == 0)
1191 {
1192 dt_operand temp (dt_node::DT_MATCH, 0, match_op);
1193 elm = decision_tree::find_node (p->kids, &temp);
1194 }
1195 }
1196 else
1197 {
1198 dt_operand temp (dt_node::DT_OPERAND, c->what, 0);
1199 elm = decision_tree::find_node (p->kids, &temp);
1200 }
1201
1202 at_assert_elm:
1203 gcc_assert (elm->type == dt_node::DT_TRUE
1204 || elm->type == dt_node::DT_OPERAND
1205 || elm->type == dt_node::DT_MATCH);
1206 indexes[capt_index] = static_cast<dt_operand *> (elm);
1207 return q;
1208 }
1209 else
1210 {
1211 p = p->append_match_op (indexes[capt_index], parent, pos);
1212 if (c->what)
1213 return insert_operand (p, c->what, indexes, 0, p);
1214 else
1215 return p;
1216 }
1217 }
1218 p = p->append_op (o, parent, pos);
1219 q = p;
1220
1221 if (expr *e = dyn_cast <expr *>(o))
1222 {
1223 for (unsigned i = 0; i < e->ops.length (); ++i)
1224 q = decision_tree::insert_operand (q, e->ops[i], indexes, i, p);
1225 }
1226
1227 return q;
1228 }
1229
1230 /* Insert S into the decision tree. */
1231
1232 void
1233 decision_tree::insert (struct simplify *s, unsigned pattern_no)
1234 {
1235 if (s->match->type != operand::OP_EXPR)
1236 return;
1237
1238 dt_operand **indexes = XCNEWVEC (dt_operand *, s->capture_max + 1);
1239 dt_node *p = decision_tree::insert_operand (root, s->match, indexes);
1240 p->append_simplify (s, pattern_no, indexes);
1241 }
1242
1243 /* Debug functions to dump the decision tree. */
1244
1245 DEBUG_FUNCTION void
1246 decision_tree::print_node (dt_node *p, FILE *f, unsigned indent)
1247 {
1248 if (p->type == dt_node::DT_NODE)
1249 fprintf (f, "root");
1250 else
1251 {
1252 fprintf (f, "|");
1253 for (unsigned i = 0; i < indent; i++)
1254 fprintf (f, "-");
1255
1256 if (p->type == dt_node::DT_OPERAND)
1257 {
1258 dt_operand *dop = static_cast<dt_operand *>(p);
1259 print_operand (dop->op, f, true);
1260 }
1261 else if (p->type == dt_node::DT_TRUE)
1262 fprintf (f, "true");
1263 else if (p->type == dt_node::DT_MATCH)
1264 fprintf (f, "match (%p)", (void *)((as_a<dt_operand *>(p))->match_dop));
1265 else if (p->type == dt_node::DT_SIMPLIFY)
1266 {
1267 dt_simplify *s = static_cast<dt_simplify *> (p);
1268 fprintf (f, "simplify_%u { ", s->pattern_no);
1269 for (int i = 0; i <= s->s->capture_max; ++i)
1270 fprintf (f, "%p, ", (void *) s->indexes[i]);
1271 fprintf (f, " } ");
1272 }
1273 }
1274
1275 fprintf (stderr, " (%p), %u, %u\n", (void *) p, p->level, p->kids.length ());
1276
1277 for (unsigned i = 0; i < p->kids.length (); ++i)
1278 decision_tree::print_node (p->kids[i], f, indent + 2);
1279 }
1280
1281 DEBUG_FUNCTION void
1282 decision_tree::print (FILE *f)
1283 {
1284 return decision_tree::print_node (root, f);
1285 }
1286
1287
1288
1289 /* Code generation off the decision tree and the refered AST nodes. */
1290
1291 bool
1292 is_conversion (id_base *op)
1293 {
1294 return (*op == CONVERT_EXPR
1295 || *op == NOP_EXPR
1296 || *op == FLOAT_EXPR
1297 || *op == FIX_TRUNC_EXPR
1298 || *op == VIEW_CONVERT_EXPR);
1299 }
1300
1301 /* Get the type to be used for generating operands of OP from the
1302 various sources. */
1303
1304 static const char *
1305 get_operand_type (id_base *op, const char *in_type,
1306 const char *expr_type,
1307 const char *other_oprnd_type)
1308 {
1309 /* Generally operands whose type does not match the type of the
1310 expression generated need to know their types but match and
1311 thus can fall back to 'other_oprnd_type'. */
1312 if (is_conversion (op))
1313 return other_oprnd_type;
1314 else if (*op == REALPART_EXPR
1315 || *op == IMAGPART_EXPR)
1316 return other_oprnd_type;
1317 else if (is_a <operator_id *> (op)
1318 && strcmp (as_a <operator_id *> (op)->tcc, "tcc_comparison") == 0)
1319 return other_oprnd_type;
1320 else
1321 {
1322 /* Otherwise all types should match - choose one in order of
1323 preference. */
1324 if (expr_type)
1325 return expr_type;
1326 else if (in_type)
1327 return in_type;
1328 else
1329 return other_oprnd_type;
1330 }
1331 }
1332
1333 /* Generate transform code for an expression. */
1334
1335 void
1336 expr::gen_transform (FILE *f, const char *dest, bool gimple, int depth,
1337 const char *in_type, dt_operand **indexes)
1338 {
1339 bool conversion_p = is_conversion (operation);
1340 const char *type = expr_type;
1341 char optype[64];
1342 if (type)
1343 /* If there was a type specification in the pattern use it. */
1344 ;
1345 else if (conversion_p)
1346 /* For conversions we need to build the expression using the
1347 outer type passed in. */
1348 type = in_type;
1349 else if (*operation == REALPART_EXPR
1350 || *operation == IMAGPART_EXPR)
1351 {
1352 /* __real and __imag use the component type of its operand. */
1353 sprintf (optype, "TREE_TYPE (TREE_TYPE (ops%d[0]))", depth);
1354 type = optype;
1355 }
1356 else if (is_a <operator_id *> (operation)
1357 && !strcmp (as_a <operator_id *> (operation)->tcc, "tcc_comparison"))
1358 {
1359 /* comparisons use boolean_type_node (or what gets in), but
1360 their operands need to figure out the types themselves. */
1361 sprintf (optype, "boolean_type_node");
1362 type = optype;
1363 }
1364 else
1365 {
1366 /* Other operations are of the same type as their first operand. */
1367 sprintf (optype, "TREE_TYPE (ops%d[0])", depth);
1368 type = optype;
1369 }
1370 if (!type)
1371 fatal ("two conversions in a row");
1372
1373 fprintf (f, "{\n");
1374 fprintf (f, " tree ops%d[%u], res;\n", depth, ops.length ());
1375 char op0type[64];
1376 snprintf (op0type, 64, "TREE_TYPE (ops%d[0])", depth);
1377 for (unsigned i = 0; i < ops.length (); ++i)
1378 {
1379 char dest[32];
1380 snprintf (dest, 32, " ops%d[%u]", depth, i);
1381 const char *optype
1382 = get_operand_type (operation, in_type, expr_type,
1383 i == 0 ? NULL : op0type);
1384 ops[i]->gen_transform (f, dest, gimple, depth + 1, optype, indexes);
1385 }
1386
1387 const char *opr;
1388 if (*operation == CONVERT_EXPR)
1389 opr = "NOP_EXPR";
1390 else
1391 opr = operation->id;
1392
1393 if (gimple)
1394 {
1395 /* ??? Have another helper that is like gimple_build but may
1396 fail if seq == NULL. */
1397 fprintf (f, " if (!seq)\n"
1398 " {\n"
1399 " res = gimple_simplify (%s, %s", opr, type);
1400 for (unsigned i = 0; i < ops.length (); ++i)
1401 fprintf (f, ", ops%d[%u]", depth, i);
1402 fprintf (f, ", seq, valueize);\n");
1403 fprintf (f, " if (!res) return false;\n");
1404 fprintf (f, " }\n");
1405 fprintf (f, " else\n");
1406 fprintf (f, " res = gimple_build (seq, UNKNOWN_LOCATION, %s, %s",
1407 opr, type);
1408 for (unsigned i = 0; i < ops.length (); ++i)
1409 fprintf (f, ", ops%d[%u]", depth, i);
1410 fprintf (f, ", valueize);\n");
1411 }
1412 else
1413 {
1414 if (operation->kind == id_base::CODE)
1415 fprintf (f, " res = fold_build%d_loc (loc, %s, %s",
1416 ops.length(), opr, type);
1417 else
1418 fprintf (f, " res = build_call_expr_loc (loc, "
1419 "builtin_decl_implicit (%s), %d", opr, ops.length());
1420 for (unsigned i = 0; i < ops.length (); ++i)
1421 fprintf (f, ", ops%d[%u]", depth, i);
1422 fprintf (f, ");\n");
1423 }
1424 fprintf (f, " %s = res;\n", dest);
1425 fprintf (f, "}\n");
1426 }
1427
1428 /* Generate code for a c_expr which is either the expression inside
1429 an if statement or a sequence of statements which computes a
1430 result to be stored to DEST. */
1431
1432 void
1433 c_expr::gen_transform (FILE *f, const char *dest,
1434 bool, int, const char *, dt_operand **)
1435 {
1436 if (dest && nr_stmts == 1)
1437 fprintf (f, "%s = ", dest);
1438
1439 unsigned stmt_nr = 1;
1440 for (unsigned i = 0; i < code.length (); ++i)
1441 {
1442 const cpp_token *token = &code[i];
1443
1444 /* Replace captures for code-gen. */
1445 if (token->type == CPP_ATSIGN)
1446 {
1447 const cpp_token *n = &code[i+1];
1448 if ((n->type == CPP_NUMBER
1449 || n->type == CPP_NAME)
1450 && !(n->flags & PREV_WHITE))
1451 {
1452 if (token->flags & PREV_WHITE)
1453 fputc (' ', f);
1454 const char *id;
1455 if (n->type == CPP_NUMBER)
1456 id = (const char *)n->val.str.text;
1457 else
1458 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
1459 fprintf (f, "captures[%u]", *capture_ids->get(id));
1460 ++i;
1461 continue;
1462 }
1463 }
1464
1465 if (token->flags & PREV_WHITE)
1466 fputc (' ', f);
1467
1468 if (token->type == CPP_NAME)
1469 {
1470 const char *id = (const char *) NODE_NAME (token->val.node.node);
1471 unsigned j;
1472 for (j = 0; j < ids.length (); ++j)
1473 {
1474 if (strcmp (id, ids[j].id) == 0)
1475 {
1476 fprintf (f, "%s", ids[j].oper);
1477 break;
1478 }
1479 }
1480 if (j < ids.length ())
1481 continue;
1482 }
1483
1484 /* Output the token as string. */
1485 char *tk = (char *)cpp_token_as_text (r, token);
1486 fputs (tk, f);
1487
1488 if (token->type == CPP_SEMICOLON)
1489 {
1490 stmt_nr++;
1491 if (dest && stmt_nr == nr_stmts)
1492 fprintf (f, "\n %s = ", dest);
1493 else
1494 fputc ('\n', f);
1495 }
1496 }
1497 }
1498
1499 /* Generate transform code for a capture. */
1500
1501 void
1502 capture::gen_transform (FILE *f, const char *dest, bool gimple, int depth,
1503 const char *in_type, dt_operand **indexes)
1504 {
1505 if (what && is_a<expr *> (what))
1506 {
1507 if (indexes[where] == 0)
1508 {
1509 char buf[20];
1510 sprintf (buf, "captures[%u]", where);
1511 what->gen_transform (f, buf, gimple, depth, in_type, NULL);
1512 }
1513 }
1514
1515 fprintf (f, "%s = captures[%u];\n", dest, where);
1516 }
1517
1518 /* Return the name of the operand representing the decision tree node.
1519 Use NAME as space to generate it. */
1520
1521 char *
1522 dt_operand::get_name (char *name)
1523 {
1524 if (!parent)
1525 sprintf (name, "t");
1526 else if (parent->level == 1)
1527 sprintf (name, "op%u", pos);
1528 else if (parent->type == dt_node::DT_MATCH)
1529 return parent->get_name (name);
1530 else
1531 sprintf (name, "o%u%u", parent->level, pos);
1532 return name;
1533 }
1534
1535 /* Fill NAME with the operand name at position POS. */
1536
1537 void
1538 dt_operand::gen_opname (char *name, unsigned pos)
1539 {
1540 if (!parent)
1541 sprintf (name, "op%u", pos);
1542 else
1543 sprintf (name, "o%u%u", level, pos);
1544 }
1545
1546 /* Generate matching code for the decision tree operand which is
1547 a predicate. */
1548
1549 unsigned
1550 dt_operand::gen_predicate (FILE *f, const char *opname, bool gimple)
1551 {
1552 predicate *p = as_a <predicate *> (op);
1553
1554 if (p->p->matchers.exists ())
1555 {
1556 /* If this is a predicate generated from a pattern mangle its
1557 name and pass on the valueize hook. */
1558 if (gimple)
1559 fprintf (f, "if (gimple_%s (%s, valueize))\n", p->p->id, opname);
1560 else
1561 fprintf (f, "if (tree_%s (%s))\n", p->p->id, opname);
1562 }
1563 else
1564 fprintf (f, "if (%s (%s))\n", p->p->id, opname);
1565 fprintf (f, "{\n");
1566 return 1;
1567 }
1568
1569 /* Generate matching code for the decision tree operand which is
1570 a capture-match. */
1571
1572 unsigned
1573 dt_operand::gen_match_op (FILE *f, const char *opname)
1574 {
1575 char match_opname[20];
1576 match_dop->get_name (match_opname);
1577 fprintf (f, "if (%s == %s || operand_equal_p (%s, %s, 0))\n",
1578 opname, match_opname, opname, match_opname);
1579 fprintf (f, "{\n");
1580 return 1;
1581 }
1582
1583 /* Generate GIMPLE matching code for the decision tree operand. */
1584
1585 unsigned
1586 dt_operand::gen_gimple_expr (FILE *f)
1587 {
1588 expr *e = static_cast<expr *> (op);
1589 id_base *id = e->operation;
1590 unsigned n_ops = e->ops.length ();
1591
1592 for (unsigned i = 0; i < n_ops; ++i)
1593 {
1594 char child_opname[20];
1595 gen_opname (child_opname, i);
1596
1597 if (id->kind == id_base::CODE)
1598 {
1599 if (*id == REALPART_EXPR || *id == IMAGPART_EXPR
1600 || *id == BIT_FIELD_REF || *id == VIEW_CONVERT_EXPR)
1601 {
1602 /* ??? If this is a memory operation we can't (and should not)
1603 match this. The only sensible operand types are
1604 SSA names and invariants. */
1605 fprintf (f, "tree %s = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), %i);\n",
1606 child_opname, i);
1607 fprintf (f, "if ((TREE_CODE (%s) == SSA_NAME\n"
1608 "|| is_gimple_min_invariant (%s))\n"
1609 "&& (%s = do_valueize (valueize, %s)))\n"
1610 "{\n", child_opname, child_opname, child_opname,
1611 child_opname);
1612 continue;
1613 }
1614 else
1615 fprintf (f, "tree %s = gimple_assign_rhs%u (def_stmt);\n",
1616 child_opname, i + 1);
1617 }
1618 else
1619 fprintf (f, "tree %s = gimple_call_arg (def_stmt, %u);\n",
1620 child_opname, i);
1621 fprintf (f, "if ((%s = do_valueize (valueize, %s)) != 0)\n",
1622 child_opname, child_opname);
1623 fprintf (f, "{\n");
1624 }
1625
1626 return n_ops;
1627 }
1628
1629 /* Generate GENERIC matching code for the decision tree operand. */
1630
1631 unsigned
1632 dt_operand::gen_generic_expr (FILE *f, const char *opname)
1633 {
1634 expr *e = static_cast<expr *> (op);
1635 unsigned n_ops = e->ops.length ();
1636
1637 for (unsigned i = 0; i < n_ops; ++i)
1638 {
1639 char child_opname[20];
1640 gen_opname (child_opname, i);
1641
1642 if (e->operation->kind == id_base::CODE)
1643 fprintf (f, "tree %s = TREE_OPERAND (%s, %u);\n",
1644 child_opname, opname, i);
1645 else
1646 fprintf (f, "tree %s = CALL_EXPR_ARG (%s, %u);\n",
1647 child_opname, opname, i);
1648 }
1649
1650 return 0;
1651 }
1652
1653 /* Generate matching code for the children of the decision tree node. */
1654
1655 void
1656 dt_node::gen_kids (FILE *f, bool gimple)
1657 {
1658 auto_vec<dt_operand *> gimple_exprs;
1659 auto_vec<dt_operand *> generic_exprs;
1660 auto_vec<dt_operand *> fns;
1661 auto_vec<dt_operand *> generic_fns;
1662 auto_vec<dt_operand *> preds;
1663 auto_vec<dt_node *> others;
1664 dt_node *true_operand = NULL;
1665
1666 for (unsigned i = 0; i < kids.length (); ++i)
1667 {
1668 if (kids[i]->type == dt_node::DT_OPERAND)
1669 {
1670 dt_operand *op = as_a<dt_operand *> (kids[i]);
1671 if (expr *e = dyn_cast <expr *> (op->op))
1672 {
1673 if (e->ops.length () == 0)
1674 generic_exprs.safe_push (op);
1675 else if (e->operation->kind == id_base::FN)
1676 {
1677 if (gimple)
1678 fns.safe_push (op);
1679 else
1680 generic_fns.safe_push (op);
1681 }
1682 else if (e->operation->kind == id_base::PREDICATE)
1683 preds.safe_push (op);
1684 else
1685 {
1686 if (gimple)
1687 gimple_exprs.safe_push (op);
1688 else
1689 generic_exprs.safe_push (op);
1690 }
1691 }
1692 else if (op->op->type == operand::OP_PREDICATE)
1693 others.safe_push (kids[i]);
1694 else
1695 gcc_unreachable ();
1696 }
1697 else if (kids[i]->type == dt_node::DT_MATCH
1698 || kids[i]->type == dt_node::DT_SIMPLIFY)
1699 others.safe_push (kids[i]);
1700 else if (kids[i]->type == dt_node::DT_TRUE)
1701 true_operand = kids[i];
1702 else
1703 gcc_unreachable ();
1704 }
1705
1706 char buf[128];
1707 char *kid_opname = buf;
1708
1709 unsigned exprs_len = gimple_exprs.length ();
1710 unsigned gexprs_len = generic_exprs.length ();
1711 unsigned fns_len = fns.length ();
1712 unsigned gfns_len = generic_fns.length ();
1713
1714 if (exprs_len || fns_len || gexprs_len || gfns_len)
1715 {
1716 if (exprs_len)
1717 gimple_exprs[0]->get_name (kid_opname);
1718 else if (fns_len)
1719 fns[0]->get_name (kid_opname);
1720 else if (gfns_len)
1721 generic_fns[0]->get_name (kid_opname);
1722 else
1723 generic_exprs[0]->get_name (kid_opname);
1724
1725 fprintf (f, "switch (TREE_CODE (%s))\n"
1726 "{\n", kid_opname);
1727 }
1728
1729 if (exprs_len || fns_len)
1730 {
1731 fprintf (f, "case SSA_NAME:\n");
1732 fprintf (f, "{\n");
1733 fprintf (f, "gimple def_stmt = SSA_NAME_DEF_STMT (%s);\n", kid_opname);
1734
1735 if (exprs_len)
1736 {
1737 fprintf (f, "if (is_gimple_assign (def_stmt))\n");
1738 fprintf (f, "switch (gimple_assign_rhs_code (def_stmt))\n"
1739 "{\n");
1740 for (unsigned i = 0; i < exprs_len; ++i)
1741 {
1742 expr *e = as_a <expr *> (gimple_exprs[i]->op);
1743 id_base *op = e->operation;
1744 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
1745 fprintf (f, "CASE_CONVERT:\n");
1746 else
1747 fprintf (f, "case %s:\n", op->id);
1748 fprintf (f, "{\n");
1749 gimple_exprs[i]->gen (f, true);
1750 fprintf (f, "break;\n"
1751 "}\n");
1752 }
1753 fprintf (f, "default:;\n"
1754 "}\n");
1755 }
1756
1757 if (fns_len)
1758 {
1759 if (exprs_len)
1760 fprintf (f, "else ");
1761
1762 fprintf (f, "if (gimple_call_builtin_p (def_stmt, BUILT_IN_NORMAL))\n"
1763 "{\n"
1764 "tree fndecl = gimple_call_fndecl (def_stmt);\n"
1765 "switch (DECL_FUNCTION_CODE (fndecl))\n"
1766 "{\n");
1767
1768 for (unsigned i = 0; i < fns_len; ++i)
1769 {
1770 expr *e = as_a <expr *>(fns[i]->op);
1771 fprintf (f, "case %s:\n"
1772 "{\n", e->operation->id);
1773 fns[i]->gen (f, true);
1774 fprintf (f, "break;\n"
1775 "}\n");
1776 }
1777
1778 fprintf (f, "default:;\n"
1779 "}\n"
1780 "}\n");
1781 }
1782
1783 fprintf (f, "break;\n"
1784 "}\n");
1785 }
1786
1787 for (unsigned i = 0; i < generic_exprs.length (); ++i)
1788 {
1789 expr *e = as_a <expr *>(generic_exprs[i]->op);
1790 id_base *op = e->operation;
1791 if (*op == CONVERT_EXPR || *op == NOP_EXPR)
1792 fprintf (f, "CASE_CONVERT:\n");
1793 else
1794 fprintf (f, "case %s:\n", op->id);
1795 fprintf (f, "{\n");
1796 generic_exprs[i]->gen (f, gimple);
1797 fprintf (f, "break;\n"
1798 "}\n");
1799 }
1800
1801 if (gfns_len)
1802 {
1803 fprintf (f, "case CALL_EXPR:\n"
1804 "{\n"
1805 "tree fndecl = get_callee_fndecl (%s);\n"
1806 "if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)\n"
1807 "switch (DECL_FUNCTION_CODE (fndecl))\n"
1808 "{\n", kid_opname);
1809
1810 for (unsigned j = 0; j < generic_fns.length (); ++j)
1811 {
1812 expr *e = as_a <expr *>(generic_fns[j]->op);
1813 gcc_assert (e->operation->kind == id_base::FN);
1814
1815 fprintf (f, "case %s:\n"
1816 "{\n", e->operation->id);
1817 generic_fns[j]->gen (f, false);
1818 fprintf (f, "break;\n"
1819 "}\n");
1820 }
1821
1822 fprintf (f, "default:;\n"
1823 "}\n"
1824 "break;\n"
1825 "}\n");
1826 }
1827
1828 /* Close switch (TREE_CODE ()). */
1829 if (exprs_len || fns_len || gexprs_len || gfns_len)
1830 fprintf (f, "default:;\n"
1831 "}\n");
1832
1833 for (unsigned i = 0; i < preds.length (); ++i)
1834 {
1835 expr *e = as_a <expr *> (preds[i]->op);
1836 predicate_id *p = as_a <predicate_id *> (e->operation);
1837 preds[i]->get_name (kid_opname);
1838 fprintf (f, "tree %s_pops[%d];\n", kid_opname, p->nargs);
1839 fprintf (f, "if (%s_%s (%s, %s_pops%s))\n",
1840 gimple ? "gimple" : "tree",
1841 p->id, kid_opname, kid_opname,
1842 gimple ? ", valueize" : "");
1843 fprintf (f, "{\n");
1844 for (int j = 0; j < p->nargs; ++j)
1845 {
1846 char child_opname[20];
1847 preds[i]->gen_opname (child_opname, j);
1848 fprintf (f, "tree %s = %s_pops[%d];\n", child_opname, kid_opname, j);
1849 }
1850 preds[i]->gen_kids (f, gimple);
1851 fprintf (f, "}\n");
1852 }
1853
1854 for (unsigned i = 0; i < others.length (); ++i)
1855 others[i]->gen (f, gimple);
1856
1857 if (true_operand)
1858 true_operand->gen (f, gimple);
1859 }
1860
1861 /* Generate matching code for the decision tree operand. */
1862
1863 void
1864 dt_operand::gen (FILE *f, bool gimple)
1865 {
1866 char opname[20];
1867 get_name (opname);
1868
1869 unsigned n_braces = 0;
1870
1871 if (type == DT_OPERAND)
1872 switch (op->type)
1873 {
1874 case operand::OP_PREDICATE:
1875 n_braces = gen_predicate (f, opname, gimple);
1876 break;
1877
1878 case operand::OP_EXPR:
1879 if (gimple)
1880 n_braces = gen_gimple_expr (f);
1881 else
1882 n_braces = gen_generic_expr (f, opname);
1883 break;
1884
1885 default:
1886 gcc_unreachable ();
1887 }
1888 else if (type == DT_TRUE)
1889 ;
1890 else if (type == DT_MATCH)
1891 n_braces = gen_match_op (f, opname);
1892 else
1893 gcc_unreachable ();
1894
1895 gen_kids (f, gimple);
1896
1897 for (unsigned i = 0; i < n_braces; ++i)
1898 fprintf (f, "}\n");
1899 }
1900
1901
1902 /* For GENERIC we have to take care of wrapping multiple-used
1903 expressions with side-effects in save_expr and preserve side-effects
1904 of expressions with omit_one_operand. Analyze captures in
1905 match, result and with expressions and perform early-outs
1906 on the outermost match expression operands for cases we cannot
1907 handle. */
1908
1909 struct capture_info
1910 {
1911 capture_info (simplify *s);
1912 void walk_match (operand *o, unsigned toplevel_arg, bool);
1913 void walk_result (operand *o, bool);
1914 void walk_c_expr (c_expr *);
1915
1916 struct cinfo
1917 {
1918 bool expr_p;
1919 bool cse_p;
1920 bool force_no_side_effects_p;
1921 unsigned long toplevel_msk;
1922 int result_use_count;
1923 };
1924
1925 auto_vec<cinfo> info;
1926 unsigned long force_no_side_effects;
1927 };
1928
1929 /* Analyze captures in S. */
1930
1931 capture_info::capture_info (simplify *s)
1932 {
1933 expr *e;
1934 if (!s->result
1935 || ((e = dyn_cast <expr *> (s->result))
1936 && is_a <predicate_id *> (e->operation)))
1937 {
1938 force_no_side_effects = -1;
1939 return;
1940 }
1941
1942 force_no_side_effects = 0;
1943 info.safe_grow_cleared (s->capture_max + 1);
1944 e = as_a <expr *> (s->match);
1945 for (unsigned i = 0; i < e->ops.length (); ++i)
1946 walk_match (e->ops[i], i, false);
1947
1948 walk_result (s->result, false);
1949
1950 for (unsigned i = 0; i < s->ifexpr_vec.length (); ++i)
1951 if (s->ifexpr_vec[i].is_with)
1952 walk_c_expr (as_a <c_expr *>(s->ifexpr_vec[i].cexpr));
1953 }
1954
1955 /* Analyze captures in the match expression piece O. */
1956
1957 void
1958 capture_info::walk_match (operand *o, unsigned toplevel_arg, bool conditional_p)
1959 {
1960 if (capture *c = dyn_cast <capture *> (o))
1961 {
1962 info[c->where].toplevel_msk |= 1 << toplevel_arg;
1963 info[c->where].force_no_side_effects_p |= conditional_p;
1964 /* Mark expr (non-leaf) captures and recurse. */
1965 if (c->what
1966 && is_a <expr *> (c->what))
1967 {
1968 info[c->where].expr_p = true;
1969 walk_match (c->what, toplevel_arg, conditional_p);
1970 }
1971 }
1972 else if (expr *e = dyn_cast <expr *> (o))
1973 {
1974 for (unsigned i = 0; i < e->ops.length (); ++i)
1975 {
1976 bool cond_p = conditional_p;
1977 if (i == 0
1978 && *e->operation == COND_EXPR)
1979 cond_p = true;
1980 else if (*e->operation == TRUTH_ANDIF_EXPR
1981 || *e->operation == TRUTH_ORIF_EXPR)
1982 cond_p = true;
1983 walk_match (e->ops[i], toplevel_arg, cond_p);
1984 }
1985 }
1986 else if (is_a <predicate *> (o))
1987 {
1988 /* Mark non-captured leafs toplevel arg for checking. */
1989 force_no_side_effects |= 1 << toplevel_arg;
1990 }
1991 else
1992 gcc_unreachable ();
1993 }
1994
1995 /* Analyze captures in the result expression piece O. */
1996
1997 void
1998 capture_info::walk_result (operand *o, bool conditional_p)
1999 {
2000 if (capture *c = dyn_cast <capture *> (o))
2001 {
2002 info[c->where].result_use_count++;
2003 /* If we substitute an expression capture we don't know
2004 which captures this will end up using (well, we don't
2005 compute that). Force the uses to be side-effect free
2006 which means forcing the toplevels that reach the
2007 expression side-effect free. */
2008 if (info[c->where].expr_p)
2009 force_no_side_effects |= info[c->where].toplevel_msk;
2010 /* Mark CSE capture capture uses as forced to have
2011 no side-effects. */
2012 if (c->what
2013 && is_a <expr *> (c->what))
2014 {
2015 info[c->where].cse_p = true;
2016 walk_result (c->what, true);
2017 }
2018 }
2019 else if (expr *e = dyn_cast <expr *> (o))
2020 {
2021 for (unsigned i = 0; i < e->ops.length (); ++i)
2022 {
2023 bool cond_p = conditional_p;
2024 if (i == 0
2025 && *e->operation == COND_EXPR)
2026 cond_p = true;
2027 else if (*e->operation == TRUTH_ANDIF_EXPR
2028 || *e->operation == TRUTH_ORIF_EXPR)
2029 cond_p = true;
2030 walk_result (e->ops[i], cond_p);
2031 }
2032 }
2033 else if (c_expr *e = dyn_cast <c_expr *> (o))
2034 walk_c_expr (e);
2035 else
2036 gcc_unreachable ();
2037 }
2038
2039 /* Look for captures in the C expr E. */
2040
2041 void
2042 capture_info::walk_c_expr (c_expr *e)
2043 {
2044 /* Give up for C exprs mentioning captures not inside TREE_TYPE (). */
2045 unsigned p_depth = 0;
2046 for (unsigned i = 0; i < e->code.length (); ++i)
2047 {
2048 const cpp_token *t = &e->code[i];
2049 const cpp_token *n = i < e->code.length () - 1 ? &e->code[i+1] : NULL;
2050 if (t->type == CPP_NAME
2051 && strcmp ((const char *)CPP_HASHNODE
2052 (t->val.node.node)->ident.str, "TREE_TYPE") == 0
2053 && n->type == CPP_OPEN_PAREN)
2054 p_depth++;
2055 else if (t->type == CPP_CLOSE_PAREN
2056 && p_depth > 0)
2057 p_depth--;
2058 else if (p_depth == 0
2059 && t->type == CPP_ATSIGN
2060 && (n->type == CPP_NUMBER
2061 || n->type == CPP_NAME)
2062 && !(n->flags & PREV_WHITE))
2063 {
2064 const char *id;
2065 if (n->type == CPP_NUMBER)
2066 id = (const char *)n->val.str.text;
2067 else
2068 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
2069 info[*e->capture_ids->get(id)].force_no_side_effects_p = true;
2070 }
2071 }
2072 }
2073
2074
2075 /* Generate code for the '(if ...)', '(with ..)' and actual transform
2076 step of a '(simplify ...)' or '(match ...)'. This handles everything
2077 that is not part of the decision tree (simplify->match). */
2078
2079 void
2080 dt_simplify::gen (FILE *f, bool gimple)
2081 {
2082 fprintf (f, "{\n");
2083 output_line_directive (f, s->result_location);
2084 if (s->capture_max >= 0)
2085 fprintf (f, "tree captures[%u] ATTRIBUTE_UNUSED = {};\n",
2086 s->capture_max + 1);
2087
2088 for (int i = 0; i <= s->capture_max; ++i)
2089 if (indexes[i])
2090 {
2091 char opname[20];
2092 fprintf (f, "captures[%u] = %s;\n", i, indexes[i]->get_name (opname));
2093 }
2094
2095 unsigned n_braces = 0;
2096 if (s->ifexpr_vec != vNULL)
2097 {
2098 for (unsigned i = 0; i < s->ifexpr_vec.length (); ++i)
2099 {
2100 if_or_with &w = s->ifexpr_vec[i];
2101 if (w.is_with)
2102 {
2103 fprintf (f, "{\n");
2104 output_line_directive (f, w.location);
2105 w.cexpr->gen_transform (f, NULL, true, 1, "type");
2106 n_braces++;
2107 }
2108 else
2109 {
2110 output_line_directive (f, w.location);
2111 fprintf (f, "if (");
2112 if (i == s->ifexpr_vec.length () - 1
2113 || s->ifexpr_vec[i+1].is_with)
2114 w.cexpr->gen_transform (f, NULL, true, 1, "type");
2115 else
2116 {
2117 unsigned j = i;
2118 do
2119 {
2120 if (j != i)
2121 {
2122 fprintf (f, "\n");
2123 output_line_directive (f, s->ifexpr_vec[j].location);
2124 fprintf (f, "&& ");
2125 }
2126 fprintf (f, "(");
2127 s->ifexpr_vec[j].cexpr->gen_transform (f, NULL,
2128 true, 1, "type");
2129 fprintf (f, ")");
2130 ++j;
2131 }
2132 while (j < s->ifexpr_vec.length ()
2133 && !s->ifexpr_vec[j].is_with);
2134 i = j - 1;
2135 }
2136 fprintf (f, ")\n");
2137 }
2138 }
2139 fprintf (f, "{\n");
2140 n_braces++;
2141 }
2142
2143 /* Analyze captures and perform early-outs on the incoming arguments
2144 that cover cases we cannot handle. */
2145 capture_info cinfo (s);
2146 expr *e;
2147 if (!gimple
2148 && s->result
2149 && !((e = dyn_cast <expr *> (s->result))
2150 && is_a <predicate_id *> (e->operation)))
2151 {
2152 for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
2153 if (cinfo.force_no_side_effects & (1 << i))
2154 fprintf (f, "if (TREE_SIDE_EFFECTS (op%d)) return NULL_TREE;\n", i);
2155 for (int i = 0; i <= s->capture_max; ++i)
2156 if (cinfo.info[i].cse_p)
2157 ;
2158 else if (cinfo.info[i].force_no_side_effects_p
2159 && (cinfo.info[i].toplevel_msk
2160 & cinfo.force_no_side_effects) == 0)
2161 fprintf (f, "if (TREE_SIDE_EFFECTS (captures[%d])) "
2162 "return NULL_TREE;\n", i);
2163 else if ((cinfo.info[i].toplevel_msk
2164 & cinfo.force_no_side_effects) != 0)
2165 /* Mark capture as having no side-effects if we had to verify
2166 that via forced toplevel operand checks. */
2167 cinfo.info[i].force_no_side_effects_p = true;
2168 }
2169
2170 fprintf (f, "if (dump_file && (dump_flags & TDF_DETAILS)) "
2171 "fprintf (dump_file, \"Applying pattern ");
2172 output_line_directive (f, s->result_location, true);
2173 fprintf (f, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
2174
2175 operand *result = s->result;
2176 if (!result)
2177 {
2178 /* If there is no result then this is a predicate implementation. */
2179 fprintf (f, "return true;\n");
2180 }
2181 else if (gimple)
2182 {
2183 /* For GIMPLE simply drop NON_LVALUE_EXPR (which only appears
2184 in outermost position). */
2185 if (result->type == operand::OP_EXPR
2186 && *as_a <expr *> (result)->operation == NON_LVALUE_EXPR)
2187 result = as_a <expr *> (result)->ops[0];
2188 if (result->type == operand::OP_EXPR)
2189 {
2190 expr *e = as_a <expr *> (result);
2191 bool is_predicate = is_a <predicate_id *> (e->operation);
2192 if (!is_predicate)
2193 fprintf (f, "*res_code = %s;\n",
2194 *e->operation == CONVERT_EXPR
2195 ? "NOP_EXPR" : e->operation->id);
2196 for (unsigned j = 0; j < e->ops.length (); ++j)
2197 {
2198 char dest[32];
2199 snprintf (dest, 32, " res_ops[%d]", j);
2200 const char *optype
2201 = get_operand_type (e->operation,
2202 "type", e->expr_type,
2203 j == 0
2204 ? NULL : "TREE_TYPE (res_ops[0])");
2205 e->ops[j]->gen_transform (f, dest, true, 1, optype, indexes);
2206 }
2207
2208 /* Re-fold the toplevel result. It's basically an embedded
2209 gimple_build w/o actually building the stmt. */
2210 if (!is_predicate)
2211 fprintf (f, "gimple_resimplify%d (seq, res_code, type, "
2212 "res_ops, valueize);\n", e->ops.length ());
2213 }
2214 else if (result->type == operand::OP_CAPTURE
2215 || result->type == operand::OP_C_EXPR)
2216 {
2217 result->gen_transform (f, "res_ops[0]", true, 1, "type", indexes);
2218 fprintf (f, "*res_code = TREE_CODE (res_ops[0]);\n");
2219 }
2220 else
2221 gcc_unreachable ();
2222 fprintf (f, "return true;\n");
2223 }
2224 else /* GENERIC */
2225 {
2226 bool is_predicate = false;
2227 if (result->type == operand::OP_EXPR)
2228 {
2229 expr *e = as_a <expr *> (result);
2230 is_predicate = is_a <predicate_id *> (e->operation);
2231 /* Search for captures used multiple times in the result expression
2232 and dependent on TREE_SIDE_EFFECTS emit a SAVE_EXPR. */
2233 if (!is_predicate)
2234 for (int i = 0; i < s->capture_max + 1; ++i)
2235 {
2236 if (!cinfo.info[i].force_no_side_effects_p
2237 && cinfo.info[i].result_use_count > 1)
2238 fprintf (f, " if (TREE_SIDE_EFFECTS (captures[%d]))\n"
2239 " captures[%d] = save_expr (captures[%d]);\n",
2240 i, i, i);
2241 }
2242 for (unsigned j = 0; j < e->ops.length (); ++j)
2243 {
2244 char dest[32];
2245 if (is_predicate)
2246 snprintf (dest, 32, "res_ops[%d]", j);
2247 else
2248 {
2249 fprintf (f, " tree res_op%d;\n", j);
2250 snprintf (dest, 32, " res_op%d", j);
2251 }
2252 const char *optype
2253 = get_operand_type (e->operation,
2254 "type", e->expr_type,
2255 j == 0
2256 ? NULL : "TREE_TYPE (res_op0)");
2257 e->ops[j]->gen_transform (f, dest, false, 1, optype, indexes);
2258 }
2259 if (is_predicate)
2260 fprintf (f, "return true;\n");
2261 else
2262 {
2263 fprintf (f, " tree res;\n");
2264 /* Re-fold the toplevel result. Use non_lvalue to
2265 build NON_LVALUE_EXPRs so they get properly
2266 ignored when in GIMPLE form. */
2267 if (*e->operation == NON_LVALUE_EXPR)
2268 fprintf (f, " res = non_lvalue_loc (loc, res_op0);\n");
2269 else
2270 {
2271 if (e->operation->kind == id_base::CODE)
2272 fprintf (f, " res = fold_build%d_loc (loc, %s, type",
2273 e->ops.length (),
2274 *e->operation == CONVERT_EXPR
2275 ? "NOP_EXPR" : e->operation->id);
2276 else
2277 fprintf (f, " res = build_call_expr_loc "
2278 "(loc, builtin_decl_implicit (%s), %d",
2279 e->operation->id, e->ops.length());
2280 for (unsigned j = 0; j < e->ops.length (); ++j)
2281 fprintf (f, ", res_op%d", j);
2282 fprintf (f, ");\n");
2283 }
2284 }
2285 }
2286 else if (result->type == operand::OP_CAPTURE
2287 || result->type == operand::OP_C_EXPR)
2288
2289 {
2290 fprintf (f, " tree res;\n");
2291 s->result->gen_transform (f, " res", false, 1, "type", indexes);
2292 }
2293 else
2294 gcc_unreachable ();
2295 if (!is_predicate)
2296 {
2297 /* Search for captures not used in the result expression and dependent
2298 on TREE_SIDE_EFFECTS emit omit_one_operand. */
2299 for (int i = 0; i < s->capture_max + 1; ++i)
2300 {
2301 if (!cinfo.info[i].force_no_side_effects_p
2302 && !cinfo.info[i].expr_p
2303 && cinfo.info[i].result_use_count == 0)
2304 fprintf (f, " if (TREE_SIDE_EFFECTS (captures[%d]))\n"
2305 " res = build2_loc (loc, COMPOUND_EXPR, type,"
2306 " fold_ignored_result (captures[%d]), res);\n",
2307 i, i);
2308 }
2309 fprintf (f, " return res;\n");
2310 }
2311 }
2312
2313 for (unsigned i = 0; i < n_braces; ++i)
2314 fprintf (f, "}\n");
2315
2316 fprintf (f, "}\n");
2317 }
2318
2319 /* Main entry to generate code for matching GIMPLE IL off the decision
2320 tree. */
2321
2322 void
2323 decision_tree::gen_gimple (FILE *f)
2324 {
2325 for (unsigned n = 1; n <= 3; ++n)
2326 {
2327 fprintf (f, "\nstatic bool\n"
2328 "gimple_simplify (code_helper *res_code, tree *res_ops,\n"
2329 " gimple_seq *seq, tree (*valueize)(tree),\n"
2330 " code_helper code, tree type");
2331 for (unsigned i = 0; i < n; ++i)
2332 fprintf (f, ", tree op%d", i);
2333 fprintf (f, ")\n");
2334 fprintf (f, "{\n");
2335
2336 fprintf (f, "switch (code.get_rep())\n"
2337 "{\n");
2338 for (unsigned i = 0; i < root->kids.length (); i++)
2339 {
2340 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
2341 expr *e = static_cast<expr *>(dop->op);
2342 if (e->ops.length () != n)
2343 continue;
2344
2345 if (*e->operation == CONVERT_EXPR
2346 || *e->operation == NOP_EXPR)
2347 fprintf (f, "CASE_CONVERT:\n");
2348 else
2349 fprintf (f, "case %s%s:\n",
2350 is_a <fn_id *> (e->operation) ? "-" : "",
2351 e->operation->id);
2352 fprintf (f, "{\n");
2353 dop->gen_kids (f, true);
2354 fprintf (f, "break;\n");
2355 fprintf (f, "}\n");
2356 }
2357 fprintf (f, "default:;\n"
2358 "}\n");
2359
2360 fprintf (f, "return false;\n");
2361 fprintf (f, "}\n");
2362 }
2363 }
2364
2365 /* Main entry to generate code for matching GENERIC IL off the decision
2366 tree. */
2367
2368 void
2369 decision_tree::gen_generic (FILE *f)
2370 {
2371 for (unsigned n = 1; n <= 3; ++n)
2372 {
2373 fprintf (f, "\ntree\n"
2374 "generic_simplify (location_t loc, enum tree_code code, "
2375 "tree type ATTRIBUTE_UNUSED");
2376 for (unsigned i = 0; i < n; ++i)
2377 fprintf (f, ", tree op%d", i);
2378 fprintf (f, ")\n");
2379 fprintf (f, "{\n");
2380
2381 fprintf (f, "switch (code)\n"
2382 "{\n");
2383 for (unsigned i = 0; i < root->kids.length (); i++)
2384 {
2385 dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
2386 expr *e = static_cast<expr *>(dop->op);
2387 if (e->ops.length () != n
2388 /* Builtin simplifications are somewhat premature on
2389 GENERIC. The following drops patterns with outermost
2390 calls. It's easy to emit overloads for function code
2391 though if necessary. */
2392 || e->operation->kind != id_base::CODE)
2393 continue;
2394
2395 operator_id *op_id = static_cast <operator_id *> (e->operation);
2396 if (op_id->code == NOP_EXPR || op_id->code == CONVERT_EXPR)
2397 fprintf (f, "CASE_CONVERT:\n");
2398 else
2399 fprintf (f, "case %s:\n", e->operation->id);
2400 fprintf (f, "{\n");
2401 dop->gen_kids (f, false);
2402 fprintf (f, "break;\n"
2403 "}\n");
2404 }
2405 fprintf (f, "default:;\n"
2406 "}\n");
2407
2408 fprintf (f, "return NULL_TREE;\n");
2409 fprintf (f, "}\n");
2410 }
2411 }
2412
2413 /* Output code to implement the predicate P from the decision tree DT. */
2414
2415 void
2416 write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple)
2417 {
2418 fprintf (f, "\nbool\n"
2419 "%s%s (tree t%s%s)\n"
2420 "{\n", gimple ? "gimple_" : "tree_", p->id,
2421 p->nargs > 0 ? ", tree *res_ops" : "",
2422 gimple ? ", tree (*valueize)(tree)" : "");
2423 /* Conveniently make 'type' available. */
2424 fprintf (f, "tree type = TREE_TYPE (t);\n");
2425
2426 if (!gimple)
2427 fprintf (f, "if (TREE_SIDE_EFFECTS (t)) return false;\n");
2428 dt.root->gen_kids (f, gimple);
2429
2430 fprintf (f, "return false;\n"
2431 "}\n");
2432 }
2433
2434 /* Write the common header for the GIMPLE/GENERIC IL matching routines. */
2435
2436 static void
2437 write_header (FILE *f, const char *head)
2438 {
2439 fprintf (f, "/* Generated automatically by the program `genmatch' from\n");
2440 fprintf (f, " a IL pattern matching and simplification description. */\n");
2441
2442 /* Include the header instead of writing it awkwardly quoted here. */
2443 fprintf (f, "\n#include \"%s\"\n", head);
2444 }
2445
2446
2447
2448 /* AST parsing. */
2449
2450 class parser
2451 {
2452 public:
2453 parser (cpp_reader *);
2454
2455 private:
2456 const cpp_token *next ();
2457 const cpp_token *peek ();
2458 const cpp_token *peek_ident (const char * = NULL);
2459 const cpp_token *expect (enum cpp_ttype);
2460 void eat_token (enum cpp_ttype);
2461 const char *get_string ();
2462 const char *get_ident ();
2463 void eat_ident (const char *);
2464 const char *get_number ();
2465
2466 id_base *parse_operation ();
2467 operand *parse_capture (operand *);
2468 operand *parse_expr ();
2469 c_expr *parse_c_expr (cpp_ttype);
2470 operand *parse_op ();
2471
2472 void parse_pattern ();
2473 void parse_simplify (source_location, vec<simplify *>&, predicate_id *,
2474 expr *);
2475 void parse_for (source_location);
2476 void parse_if (source_location);
2477 void parse_predicates (source_location);
2478
2479 cpp_reader *r;
2480 vec<if_or_with> active_ifs;
2481 vec<vec<user_id *> > active_fors;
2482
2483 cid_map_t *capture_ids;
2484
2485 public:
2486 vec<simplify *> simplifiers;
2487 vec<predicate_id *> user_predicates;
2488 };
2489
2490 /* Lexing helpers. */
2491
2492 /* Read the next non-whitespace token from R. */
2493
2494 const cpp_token *
2495 parser::next ()
2496 {
2497 const cpp_token *token;
2498 do
2499 {
2500 token = cpp_get_token (r);
2501 }
2502 while (token->type == CPP_PADDING
2503 && token->type != CPP_EOF);
2504 return token;
2505 }
2506
2507 /* Peek at the next non-whitespace token from R. */
2508
2509 const cpp_token *
2510 parser::peek ()
2511 {
2512 const cpp_token *token;
2513 unsigned i = 0;
2514 do
2515 {
2516 token = cpp_peek_token (r, i++);
2517 }
2518 while (token->type == CPP_PADDING
2519 && token->type != CPP_EOF);
2520 /* If we peek at EOF this is a fatal error as it leaves the
2521 cpp_reader in unusable state. Assume we really wanted a
2522 token and thus this EOF is unexpected. */
2523 if (token->type == CPP_EOF)
2524 fatal_at (token, "unexpected end of file");
2525 return token;
2526 }
2527
2528 /* Peek at the next identifier token (or return NULL if the next
2529 token is not an identifier or equal to ID if supplied). */
2530
2531 const cpp_token *
2532 parser::peek_ident (const char *id)
2533 {
2534 const cpp_token *token = peek ();
2535 if (token->type != CPP_NAME)
2536 return 0;
2537
2538 if (id == 0)
2539 return token;
2540
2541 const char *t = (const char *) CPP_HASHNODE (token->val.node.node)->ident.str;
2542 if (strcmp (id, t) == 0)
2543 return token;
2544
2545 return 0;
2546 }
2547
2548 /* Read the next token from R and assert it is of type TK. */
2549
2550 const cpp_token *
2551 parser::expect (enum cpp_ttype tk)
2552 {
2553 const cpp_token *token = next ();
2554 if (token->type != tk)
2555 fatal_at (token, "expected %s, got %s",
2556 cpp_type2name (tk, 0), cpp_type2name (token->type, 0));
2557
2558 return token;
2559 }
2560
2561 /* Consume the next token from R and assert it is of type TK. */
2562
2563 void
2564 parser::eat_token (enum cpp_ttype tk)
2565 {
2566 expect (tk);
2567 }
2568
2569 /* Read the next token from R and assert it is of type CPP_STRING and
2570 return its value. */
2571
2572 const char *
2573 parser::get_string ()
2574 {
2575 const cpp_token *token = expect (CPP_STRING);
2576 return (const char *)token->val.str.text;
2577 }
2578
2579 /* Read the next token from R and assert it is of type CPP_NAME and
2580 return its value. */
2581
2582 const char *
2583 parser::get_ident ()
2584 {
2585 const cpp_token *token = expect (CPP_NAME);
2586 return (const char *)CPP_HASHNODE (token->val.node.node)->ident.str;
2587 }
2588
2589 /* Eat an identifier token with value S from R. */
2590
2591 void
2592 parser::eat_ident (const char *s)
2593 {
2594 const cpp_token *token = peek ();
2595 const char *t = get_ident ();
2596 if (strcmp (s, t) != 0)
2597 fatal_at (token, "expected '%s' got '%s'\n", s, t);
2598 }
2599
2600 /* Read the next token from R and assert it is of type CPP_NUMBER and
2601 return its value. */
2602
2603 const char *
2604 parser::get_number ()
2605 {
2606 const cpp_token *token = expect (CPP_NUMBER);
2607 return (const char *)token->val.str.text;
2608 }
2609
2610
2611 /* Parse the operator ID, special-casing convert?, convert1? and
2612 convert2? */
2613
2614 id_base *
2615 parser::parse_operation ()
2616 {
2617 const cpp_token *id_tok = peek ();
2618 const char *id = get_ident ();
2619 const cpp_token *token = peek ();
2620 if (strcmp (id, "convert0") == 0)
2621 fatal_at (id_tok, "use 'convert?' here");
2622 if (token->type == CPP_QUERY
2623 && !(token->flags & PREV_WHITE))
2624 {
2625 if (strcmp (id, "convert") == 0)
2626 id = "convert0";
2627 else if (strcmp (id, "convert1") == 0)
2628 ;
2629 else if (strcmp (id, "convert2") == 0)
2630 ;
2631 else
2632 fatal_at (id_tok, "non-convert operator conditionalized");
2633 eat_token (CPP_QUERY);
2634 }
2635 else if (strcmp (id, "convert1") == 0
2636 || strcmp (id, "convert2") == 0)
2637 fatal_at (id_tok, "expected '?' after conditional operator");
2638 id_base *op = get_operator (id);
2639 if (!op)
2640 fatal_at (id_tok, "unknown operator %s", id);
2641 return op;
2642 }
2643
2644 /* Parse a capture.
2645 capture = '@'<number> */
2646
2647 struct operand *
2648 parser::parse_capture (operand *op)
2649 {
2650 eat_token (CPP_ATSIGN);
2651 const cpp_token *token = peek ();
2652 const char *id;
2653 if (token->type == CPP_NUMBER)
2654 id = get_number ();
2655 else if (token->type == CPP_NAME)
2656 id = get_ident ();
2657 else
2658 fatal_at (token, "expected number or identifier");
2659 unsigned next_id = capture_ids->elements ();
2660 bool existed;
2661 unsigned &num = capture_ids->get_or_insert (id, &existed);
2662 if (!existed)
2663 num = next_id;
2664 return new capture (num, op);
2665 }
2666
2667 /* Parse an expression
2668 expr = '(' <operation>[capture][flag][type] <operand>... ')' */
2669
2670 struct operand *
2671 parser::parse_expr ()
2672 {
2673 expr *e = new expr (parse_operation ());
2674 const cpp_token *token = peek ();
2675 operand *op;
2676 bool is_commutative = false;
2677 const char *expr_type = NULL;
2678
2679 if (token->type == CPP_COLON
2680 && !(token->flags & PREV_WHITE))
2681 {
2682 eat_token (CPP_COLON);
2683 token = peek ();
2684 if (token->type == CPP_NAME
2685 && !(token->flags & PREV_WHITE))
2686 {
2687 const char *s = get_ident ();
2688 if (s[0] == 'c' && !s[1])
2689 is_commutative = true;
2690 else if (s[1] != '\0')
2691 expr_type = s;
2692 else
2693 fatal_at (token, "flag %s not recognized", s);
2694 token = peek ();
2695 }
2696 else
2697 fatal_at (token, "expected flag or type specifying identifier");
2698 }
2699
2700 if (token->type == CPP_ATSIGN
2701 && !(token->flags & PREV_WHITE))
2702 op = parse_capture (e);
2703 else
2704 op = e;
2705 do
2706 {
2707 const cpp_token *token = peek ();
2708 if (token->type == CPP_CLOSE_PAREN)
2709 {
2710 if (e->operation->nargs != -1
2711 && e->operation->nargs != (int) e->ops.length ())
2712 fatal_at (token, "'%s' expects %u operands, not %u",
2713 e->operation->id, e->operation->nargs, e->ops.length ());
2714 if (is_commutative)
2715 {
2716 if (e->ops.length () == 2)
2717 e->is_commutative = true;
2718 else
2719 fatal_at (token, "only binary operators or function with "
2720 "two arguments can be marked commutative");
2721 }
2722 e->expr_type = expr_type;
2723 return op;
2724 }
2725 e->append_op (parse_op ());
2726 }
2727 while (1);
2728 }
2729
2730 /* Lex native C code delimited by START recording the preprocessing tokens
2731 for later processing.
2732 c_expr = ('{'|'(') <pp token>... ('}'|')') */
2733
2734 c_expr *
2735 parser::parse_c_expr (cpp_ttype start)
2736 {
2737 const cpp_token *token;
2738 cpp_ttype end;
2739 unsigned opencnt;
2740 vec<cpp_token> code = vNULL;
2741 unsigned nr_stmts = 0;
2742 eat_token (start);
2743 if (start == CPP_OPEN_PAREN)
2744 end = CPP_CLOSE_PAREN;
2745 else if (start == CPP_OPEN_BRACE)
2746 end = CPP_CLOSE_BRACE;
2747 else
2748 gcc_unreachable ();
2749 opencnt = 1;
2750 do
2751 {
2752 token = next ();
2753
2754 /* Count brace pairs to find the end of the expr to match. */
2755 if (token->type == start)
2756 opencnt++;
2757 else if (token->type == end
2758 && --opencnt == 0)
2759 break;
2760
2761 /* This is a lame way of counting the number of statements. */
2762 if (token->type == CPP_SEMICOLON)
2763 nr_stmts++;
2764
2765 /* Record the token. */
2766 code.safe_push (*token);
2767 }
2768 while (1);
2769 return new c_expr (r, code, nr_stmts, vNULL, capture_ids);
2770 }
2771
2772 /* Parse an operand which is either an expression, a predicate or
2773 a standalone capture.
2774 op = predicate | expr | c_expr | capture */
2775
2776 struct operand *
2777 parser::parse_op ()
2778 {
2779 const cpp_token *token = peek ();
2780 struct operand *op = NULL;
2781 if (token->type == CPP_OPEN_PAREN)
2782 {
2783 eat_token (CPP_OPEN_PAREN);
2784 op = parse_expr ();
2785 eat_token (CPP_CLOSE_PAREN);
2786 }
2787 else if (token->type == CPP_OPEN_BRACE)
2788 {
2789 op = parse_c_expr (CPP_OPEN_BRACE);
2790 }
2791 else
2792 {
2793 /* Remaining ops are either empty or predicates */
2794 if (token->type == CPP_NAME)
2795 {
2796 const char *id = get_ident ();
2797 id_base *opr = get_operator (id);
2798 if (!opr)
2799 fatal_at (token, "expected predicate name");
2800 if (operator_id *code = dyn_cast <operator_id *> (opr))
2801 {
2802 if (code->nargs != 0)
2803 fatal_at (token, "using an operator with operands as predicate");
2804 /* Parse the zero-operand operator "predicates" as
2805 expression. */
2806 op = new expr (opr);
2807 }
2808 else if (predicate_id *p = dyn_cast <predicate_id *> (opr))
2809 op = new predicate (p);
2810 else
2811 fatal_at (token, "using an unsupported operator as predicate");
2812 token = peek ();
2813 if (token->flags & PREV_WHITE)
2814 return op;
2815 }
2816 else if (token->type != CPP_COLON
2817 && token->type != CPP_ATSIGN)
2818 fatal_at (token, "expected expression or predicate");
2819 /* optionally followed by a capture and a predicate. */
2820 if (token->type == CPP_COLON)
2821 fatal_at (token, "not implemented: predicate on leaf operand");
2822 if (token->type == CPP_ATSIGN)
2823 op = parse_capture (op);
2824 }
2825
2826 return op;
2827 }
2828
2829 /* Parse
2830 simplify = 'simplify' <expr> <result-op>
2831 or
2832 match = 'match' <ident> <expr> [<result-op>]
2833 with
2834 <result-op> = <op> | <if> | <with>
2835 <if> = '(' 'if' '(' <c-expr> ')' <result-op> ')'
2836 <with> = '(' 'with' '{' <c-expr> '}' <result-op> ')'
2837 and fill SIMPLIFIERS with the results. */
2838
2839 void
2840 parser::parse_simplify (source_location match_location,
2841 vec<simplify *>& simplifiers, predicate_id *matcher,
2842 expr *result)
2843 {
2844 /* Reset the capture map. */
2845 capture_ids = new cid_map_t;
2846
2847 const cpp_token *loc = peek ();
2848 struct operand *match = parse_op ();
2849 if (match->type == operand::OP_CAPTURE && !matcher)
2850 fatal_at (loc, "outermost expression cannot be captured");
2851 if (match->type == operand::OP_EXPR
2852 && is_a <predicate_id *> (as_a <expr *> (match)->operation))
2853 fatal_at (loc, "outermost expression cannot be a predicate");
2854
2855 const cpp_token *token = peek ();
2856
2857 /* If this if is immediately closed then it is part of a predicate
2858 definition. Push it. */
2859 if (token->type == CPP_CLOSE_PAREN)
2860 {
2861 if (!matcher)
2862 fatal_at (token, "expected transform expression");
2863 simplifiers.safe_push
2864 (new simplify (match, match_location, result, token->src_loc,
2865 active_ifs.copy (), active_fors.copy (),
2866 capture_ids));
2867 return;
2868 }
2869
2870 unsigned active_ifs_len = active_ifs.length ();
2871 while (1)
2872 {
2873 if (token->type == CPP_OPEN_PAREN)
2874 {
2875 source_location paren_loc = token->src_loc;
2876 eat_token (CPP_OPEN_PAREN);
2877 if (peek_ident ("if"))
2878 {
2879 eat_ident ("if");
2880 active_ifs.safe_push (if_or_with (parse_c_expr (CPP_OPEN_PAREN),
2881 token->src_loc, false));
2882 /* If this if is immediately closed then it contains a
2883 manual matcher or is part of a predicate definition.
2884 Push it. */
2885 if (peek ()->type == CPP_CLOSE_PAREN)
2886 {
2887 if (!matcher)
2888 fatal_at (token, "manual transform not implemented");
2889 simplifiers.safe_push
2890 (new simplify (match, match_location, result,
2891 paren_loc, active_ifs.copy (),
2892 active_fors.copy (), capture_ids));
2893 }
2894 }
2895 else if (peek_ident ("with"))
2896 {
2897 eat_ident ("with");
2898 /* Parse (with c-expr expr) as (if-with (true) expr). */
2899 c_expr *e = parse_c_expr (CPP_OPEN_BRACE);
2900 e->nr_stmts = 0;
2901 active_ifs.safe_push (if_or_with (e, token->src_loc, true));
2902 }
2903 else
2904 {
2905 operand *op = result;
2906 if (!matcher)
2907 op = parse_expr ();
2908 simplifiers.safe_push
2909 (new simplify (match, match_location, op,
2910 token->src_loc, active_ifs.copy (),
2911 active_fors.copy (), capture_ids));
2912 eat_token (CPP_CLOSE_PAREN);
2913 /* A "default" result closes the enclosing scope. */
2914 if (active_ifs.length () > active_ifs_len)
2915 {
2916 eat_token (CPP_CLOSE_PAREN);
2917 active_ifs.pop ();
2918 }
2919 else
2920 return;
2921 }
2922 }
2923 else if (token->type == CPP_CLOSE_PAREN)
2924 {
2925 /* Close a scope if requested. */
2926 if (active_ifs.length () > active_ifs_len)
2927 {
2928 eat_token (CPP_CLOSE_PAREN);
2929 active_ifs.pop ();
2930 token = peek ();
2931 }
2932 else
2933 return;
2934 }
2935 else
2936 {
2937 if (matcher)
2938 fatal_at (token, "expected match operand expression");
2939 simplifiers.safe_push
2940 (new simplify (match, match_location,
2941 matcher ? result : parse_op (),
2942 token->src_loc, active_ifs.copy (),
2943 active_fors.copy (), capture_ids));
2944 /* A "default" result closes the enclosing scope. */
2945 if (active_ifs.length () > active_ifs_len)
2946 {
2947 eat_token (CPP_CLOSE_PAREN);
2948 active_ifs.pop ();
2949 }
2950 else
2951 return;
2952 }
2953 token = peek ();
2954 }
2955 }
2956
2957 /* Parsing of the outer control structures. */
2958
2959 /* Parse a for expression
2960 for = '(' 'for' <subst>... <pattern> ')'
2961 subst = <ident> '(' <ident>... ')' */
2962
2963 void
2964 parser::parse_for (source_location)
2965 {
2966 vec<user_id *> user_ids = vNULL;
2967 const cpp_token *token;
2968 unsigned min_n_opers = 0, max_n_opers = 0;
2969
2970 while (1)
2971 {
2972 token = peek_ident ();
2973 if (token == 0)
2974 break;
2975
2976 /* Insert the user defined operators into the operator hash. */
2977 const char *id = get_ident ();
2978 user_id *op = new user_id (id);
2979 id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
2980 if (*slot)
2981 fatal_at (token, "operator already defined");
2982 *slot = op;
2983 user_ids.safe_push (op);
2984
2985 eat_token (CPP_OPEN_PAREN);
2986
2987 int arity = -1;
2988 while ((token = peek_ident ()) != 0)
2989 {
2990 const char *oper = get_ident ();
2991 id_base *idb = get_operator (oper);
2992 if (idb == NULL)
2993 fatal_at (token, "no such operator '%s'", oper);
2994 if (*idb == CONVERT0 || *idb == CONVERT1 || *idb == CONVERT2)
2995 fatal_at (token, "conditional operators cannot be used inside for");
2996
2997 if (arity == -1)
2998 arity = idb->nargs;
2999 else if (idb->nargs == -1)
3000 ;
3001 else if (idb->nargs != arity)
3002 fatal_at (token, "operator '%s' with arity %d does not match "
3003 "others with arity %d", oper, idb->nargs, arity);
3004
3005 op->substitutes.safe_push (idb);
3006 }
3007 op->nargs = arity;
3008 token = expect (CPP_CLOSE_PAREN);
3009
3010 unsigned nsubstitutes = op->substitutes.length ();
3011 if (nsubstitutes == 0)
3012 fatal_at (token, "A user-defined operator must have at least "
3013 "one substitution");
3014 if (max_n_opers == 0)
3015 {
3016 min_n_opers = nsubstitutes;
3017 max_n_opers = nsubstitutes;
3018 }
3019 else
3020 {
3021 if (nsubstitutes % min_n_opers != 0
3022 && min_n_opers % nsubstitutes != 0)
3023 fatal_at (token, "All user-defined identifiers must have a "
3024 "multiple number of operator substitutions of the "
3025 "smallest number of substitutions");
3026 if (nsubstitutes < min_n_opers)
3027 min_n_opers = nsubstitutes;
3028 else if (nsubstitutes > max_n_opers)
3029 max_n_opers = nsubstitutes;
3030 }
3031 }
3032
3033 unsigned n_ids = user_ids.length ();
3034 if (n_ids == 0)
3035 fatal_at (token, "for requires at least one user-defined identifier");
3036
3037 token = peek ();
3038 if (token->type == CPP_CLOSE_PAREN)
3039 fatal_at (token, "no pattern defined in for");
3040
3041 active_fors.safe_push (user_ids);
3042 while (1)
3043 {
3044 token = peek ();
3045 if (token->type == CPP_CLOSE_PAREN)
3046 break;
3047 parse_pattern ();
3048 }
3049 active_fors.pop ();
3050
3051 /* Remove user-defined operators from the hash again. */
3052 for (unsigned i = 0; i < user_ids.length (); ++i)
3053 operators->remove_elt (user_ids[i]);
3054 }
3055
3056 /* Parse an outer if expression.
3057 if = '(' 'if' '(' <c-expr> ')' <pattern> ')' */
3058
3059 void
3060 parser::parse_if (source_location loc)
3061 {
3062 operand *ifexpr = parse_c_expr (CPP_OPEN_PAREN);
3063
3064 const cpp_token *token = peek ();
3065 if (token->type == CPP_CLOSE_PAREN)
3066 fatal_at (token, "no pattern defined in if");
3067
3068 active_ifs.safe_push (if_or_with (ifexpr, loc, false));
3069 while (1)
3070 {
3071 const cpp_token *token = peek ();
3072 if (token->type == CPP_CLOSE_PAREN)
3073 break;
3074
3075 parse_pattern ();
3076 }
3077 active_ifs.pop ();
3078 }
3079
3080 /* Parse a list of predefined predicate identifiers.
3081 preds = '(' 'define_predicates' <ident>... ')' */
3082
3083 void
3084 parser::parse_predicates (source_location)
3085 {
3086 do
3087 {
3088 const cpp_token *token = peek ();
3089 if (token->type != CPP_NAME)
3090 break;
3091
3092 add_predicate (get_ident ());
3093 }
3094 while (1);
3095 }
3096
3097 /* Parse outer control structures.
3098 pattern = <preds>|<for>|<if>|<simplify>|<match> */
3099
3100 void
3101 parser::parse_pattern ()
3102 {
3103 /* All clauses start with '('. */
3104 eat_token (CPP_OPEN_PAREN);
3105 const cpp_token *token = peek ();
3106 const char *id = get_ident ();
3107 if (strcmp (id, "simplify") == 0)
3108 parse_simplify (token->src_loc, simplifiers, NULL, NULL);
3109 else if (strcmp (id, "match") == 0)
3110 {
3111 bool with_args = false;
3112 if (peek ()->type == CPP_OPEN_PAREN)
3113 {
3114 eat_token (CPP_OPEN_PAREN);
3115 with_args = true;
3116 }
3117 const char *name = get_ident ();
3118 id_base *id = get_operator (name);
3119 predicate_id *p;
3120 if (!id)
3121 {
3122 p = add_predicate (name);
3123 user_predicates.safe_push (p);
3124 }
3125 else if ((p = dyn_cast <predicate_id *> (id)))
3126 ;
3127 else
3128 fatal_at (token, "cannot add a match to a non-predicate ID");
3129 /* Parse (match <id> <arg>... (match-expr)) here. */
3130 expr *e = NULL;
3131 if (with_args)
3132 {
3133 e = new expr (p);
3134 while (peek ()->type == CPP_ATSIGN)
3135 e->append_op (parse_capture (NULL));
3136 eat_token (CPP_CLOSE_PAREN);
3137 }
3138 if (p->nargs != -1
3139 && ((e && e->ops.length () != (unsigned)p->nargs)
3140 || (!e && p->nargs != 0)))
3141 fatal_at (token, "non-matching number of match operands");
3142 p->nargs = e ? e->ops.length () : 0;
3143 parse_simplify (token->src_loc, p->matchers, p, e);
3144 }
3145 else if (strcmp (id, "for") == 0)
3146 parse_for (token->src_loc);
3147 else if (strcmp (id, "if") == 0)
3148 parse_if (token->src_loc);
3149 else if (strcmp (id, "define_predicates") == 0)
3150 {
3151 if (active_ifs.length () > 0
3152 || active_fors.length () > 0)
3153 fatal_at (token, "define_predicates inside if or for is not supported");
3154 parse_predicates (token->src_loc);
3155 }
3156 else
3157 fatal_at (token, "expected %s'simplify', 'match', 'for' or 'if'",
3158 active_ifs.length () == 0 && active_fors.length () == 0
3159 ? "'define_predicates', " : "");
3160
3161 eat_token (CPP_CLOSE_PAREN);
3162 }
3163
3164 /* Main entry of the parser. Repeatedly parse outer control structures. */
3165
3166 parser::parser (cpp_reader *r_)
3167 {
3168 r = r_;
3169 active_ifs = vNULL;
3170 active_fors = vNULL;
3171 simplifiers = vNULL;
3172 user_predicates = vNULL;
3173
3174 const cpp_token *token = next ();
3175 while (token->type != CPP_EOF)
3176 {
3177 _cpp_backup_tokens (r, 1);
3178 parse_pattern ();
3179 token = next ();
3180 }
3181 }
3182
3183
3184 /* Helper for the linemap code. */
3185
3186 static size_t
3187 round_alloc_size (size_t s)
3188 {
3189 return s;
3190 }
3191
3192
3193 /* The genmatch generator progam. It reads from a pattern description
3194 and outputs GIMPLE or GENERIC IL matching and simplification routines. */
3195
3196 int
3197 main (int argc, char **argv)
3198 {
3199 cpp_reader *r;
3200
3201 progname = "genmatch";
3202
3203 if (argc < 2)
3204 return 1;
3205
3206 bool gimple = true;
3207 bool verbose = false;
3208 char *input = argv[argc-1];
3209 for (int i = 1; i < argc - 1; ++i)
3210 {
3211 if (strcmp (argv[i], "--gimple") == 0)
3212 gimple = true;
3213 else if (strcmp (argv[i], "--generic") == 0)
3214 gimple = false;
3215 else if (strcmp (argv[i], "-v") == 0)
3216 verbose = true;
3217 else
3218 {
3219 fprintf (stderr, "Usage: genmatch "
3220 "[--gimple] [--generic] [-v] input\n");
3221 return 1;
3222 }
3223 }
3224
3225 line_table = XCNEW (struct line_maps);
3226 linemap_init (line_table, 0);
3227 line_table->reallocator = xrealloc;
3228 line_table->round_alloc_size = round_alloc_size;
3229
3230 r = cpp_create_reader (CLK_GNUC99, NULL, line_table);
3231 cpp_callbacks *cb = cpp_get_callbacks (r);
3232 cb->error = error_cb;
3233
3234 if (!cpp_read_main_file (r, input))
3235 return 1;
3236 cpp_define (r, gimple ? "GIMPLE=1": "GENERIC=1");
3237 cpp_define (r, gimple ? "GENERIC=0": "GIMPLE=0");
3238
3239 /* Pre-seed operators. */
3240 operators = new hash_table<id_base> (1024);
3241 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
3242 add_operator (SYM, # SYM, # TYPE, NARGS);
3243 #define END_OF_BASE_TREE_CODES
3244 #include "tree.def"
3245 add_operator (CONVERT0, "CONVERT0", "tcc_unary", 1);
3246 add_operator (CONVERT1, "CONVERT1", "tcc_unary", 1);
3247 add_operator (CONVERT2, "CONVERT2", "tcc_unary", 1);
3248 #undef END_OF_BASE_TREE_CODES
3249 #undef DEFTREECODE
3250
3251 /* Pre-seed builtin functions.
3252 ??? Cannot use N (name) as that is targetm.emultls.get_address
3253 for BUILT_IN_EMUTLS_GET_ADDRESS ... */
3254 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) \
3255 add_builtin (ENUM, # ENUM);
3256 #include "builtins.def"
3257 #undef DEF_BUILTIN
3258
3259 /* Parse ahead! */
3260 parser p (r);
3261
3262 if (gimple)
3263 write_header (stdout, "gimple-match-head.c");
3264 else
3265 write_header (stdout, "generic-match-head.c");
3266
3267 /* Go over all predicates defined with patterns and perform
3268 lowering and code generation. */
3269 for (unsigned i = 0; i < p.user_predicates.length (); ++i)
3270 {
3271 predicate_id *pred = p.user_predicates[i];
3272 lower (pred->matchers);
3273
3274 if (verbose)
3275 for (unsigned i = 0; i < pred->matchers.length (); ++i)
3276 print_matches (pred->matchers[i]);
3277
3278 decision_tree dt;
3279 for (unsigned i = 0; i < pred->matchers.length (); ++i)
3280 dt.insert (pred->matchers[i], i);
3281
3282 if (verbose)
3283 dt.print (stderr);
3284
3285 write_predicate (stdout, pred, dt, gimple);
3286 }
3287
3288 /* Lower the main simplifiers and generate code for them. */
3289 lower (p.simplifiers);
3290
3291 if (verbose)
3292 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
3293 print_matches (p.simplifiers[i]);
3294
3295 decision_tree dt;
3296 for (unsigned i = 0; i < p.simplifiers.length (); ++i)
3297 dt.insert (p.simplifiers[i], i);
3298
3299 if (verbose)
3300 dt.print (stderr);
3301
3302 if (gimple)
3303 dt.gen_gimple (stdout);
3304 else
3305 dt.gen_generic (stdout);
3306
3307 /* Finalize. */
3308 cpp_finish (r, NULL);
3309 cpp_destroy (r);
3310
3311 delete operators;
3312
3313 return 0;
3314 }