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