match.pd: X + X --> X * 2 for integers
[platform/upstream/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-2016 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 "system.h"
26 #include "coretypes.h"
27 #include <cpplib.h>
28 #include "errors.h"
29 #include "hash-table.h"
30 #include "hash-set.h"
31 #include "is-a.h"
32
33
34 /* Stubs for GGC referenced through instantiations triggered by hash-map.  */
35 void *ggc_internal_cleared_alloc (size_t, void (*)(void *),
36                                   size_t, size_t MEM_STAT_DECL)
37 {
38   return NULL;
39 }
40 void ggc_free (void *)
41 {
42 }
43
44
45 /* Global state.  */
46
47 /* Verboseness.  0 is quiet, 1 adds some warnings, 2 is for debugging.  */
48 unsigned verbose;
49
50
51 /* libccp helpers.  */
52
53 static struct line_maps *line_table;
54
55 /* The rich_location class within libcpp requires a way to expand
56    source_location instances, and relies on the client code
57    providing a symbol named
58      linemap_client_expand_location_to_spelling_point
59    to do this.
60
61    This is the implementation for genmatch.  */
62
63 expanded_location
64 linemap_client_expand_location_to_spelling_point (source_location loc)
65 {
66   const struct line_map_ordinary *map;
67   loc = linemap_resolve_location (line_table, loc, LRK_SPELLING_LOCATION, &map);
68   return linemap_expand_location (line_table, map, loc);
69 }
70
71 static bool
72 #if GCC_VERSION >= 4001
73 __attribute__((format (printf, 5, 0)))
74 #endif
75 error_cb (cpp_reader *, int errtype, int, rich_location *richloc,
76           const char *msg, va_list *ap)
77 {
78   const line_map_ordinary *map;
79   source_location location = richloc->get_loc ();
80   linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
81   expanded_location loc = linemap_expand_location (line_table, map, location);
82   fprintf (stderr, "%s:%d:%d %s: ", loc.file, loc.line, loc.column,
83            (errtype == CPP_DL_WARNING) ? "warning" : "error");
84   vfprintf (stderr, msg, *ap);
85   fprintf (stderr, "\n");
86   FILE *f = fopen (loc.file, "r");
87   if (f)
88     {
89       char buf[128];
90       while (loc.line > 0)
91         {
92           if (!fgets (buf, 128, f))
93             goto notfound;
94           if (buf[strlen (buf) - 1] != '\n')
95             {
96               if (loc.line > 1)
97                 loc.line++;
98             }
99           loc.line--;
100         }
101       fprintf (stderr, "%s", buf);
102       for (int i = 0; i < loc.column - 1; ++i)
103         fputc (' ', stderr);
104       fputc ('^', stderr);
105       fputc ('\n', stderr);
106 notfound:
107       fclose (f);
108     }
109
110   if (errtype == CPP_DL_FATAL)
111     exit (1);
112   return false;
113 }
114
115 static void
116 #if GCC_VERSION >= 4001
117 __attribute__((format (printf, 2, 3)))
118 #endif
119 fatal_at (const cpp_token *tk, const char *msg, ...)
120 {
121   rich_location richloc (line_table, tk->src_loc);
122   va_list ap;
123   va_start (ap, msg);
124   error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap);
125   va_end (ap);
126 }
127
128 static void
129 #if GCC_VERSION >= 4001
130 __attribute__((format (printf, 2, 3)))
131 #endif
132 fatal_at (source_location loc, const char *msg, ...)
133 {
134   rich_location richloc (line_table, loc);
135   va_list ap;
136   va_start (ap, msg);
137   error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap);
138   va_end (ap);
139 }
140
141 static void
142 #if GCC_VERSION >= 4001
143 __attribute__((format (printf, 2, 3)))
144 #endif
145 warning_at (const cpp_token *tk, const char *msg, ...)
146 {
147   rich_location richloc (line_table, tk->src_loc);
148   va_list ap;
149   va_start (ap, msg);
150   error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap);
151   va_end (ap);
152 }
153
154 static void
155 #if GCC_VERSION >= 4001
156 __attribute__((format (printf, 2, 3)))
157 #endif
158 warning_at (source_location loc, const char *msg, ...)
159 {
160   rich_location richloc (line_table, loc);
161   va_list ap;
162   va_start (ap, msg);
163   error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap);
164   va_end (ap);
165 }
166
167 /* Like fprintf, but print INDENT spaces at the beginning.  */
168
169 static void
170 #if GCC_VERSION >= 4001
171 __attribute__((format (printf, 3, 4)))
172 #endif
173 fprintf_indent (FILE *f, unsigned int indent, const char *format, ...)
174 {
175   va_list ap;
176   for (; indent >= 8; indent -= 8)
177     fputc ('\t', f);
178   fprintf (f, "%*s", indent, "");
179   va_start (ap, format);
180   vfprintf (f, format, ap);
181   va_end (ap);
182 }
183
184 static void
185 output_line_directive (FILE *f, source_location location,
186                        bool dumpfile = false)
187 {
188   const line_map_ordinary *map;
189   linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, &map);
190   expanded_location loc = linemap_expand_location (line_table, map, location);
191   if (dumpfile)
192     {
193       /* When writing to a dumpfile only dump the filename.  */
194       const char *file = strrchr (loc.file, DIR_SEPARATOR);
195       if (!file)
196         file = loc.file;
197       else
198         ++file;
199       fprintf (f, "%s:%d", file, loc.line);
200     }
201   else
202     /* Other gen programs really output line directives here, at least for
203        development it's right now more convenient to have line information
204        from the generated file.  Still keep the directives as comment for now
205        to easily back-point to the meta-description.  */
206     fprintf (f, "/* #line %d \"%s\" */\n", loc.line, loc.file);
207 }
208
209
210 /* Pull in tree codes and builtin function codes from their
211    definition files.  */
212
213 #define DEFTREECODE(SYM, STRING, TYPE, NARGS)   SYM,
214 enum tree_code {
215 #include "tree.def"
216 CONVERT0,
217 CONVERT1,
218 CONVERT2,
219 VIEW_CONVERT0,
220 VIEW_CONVERT1,
221 VIEW_CONVERT2,
222 MAX_TREE_CODES
223 };
224 #undef DEFTREECODE
225
226 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
227 enum built_in_function {
228 #include "builtins.def"
229 END_BUILTINS
230 };
231
232 #define DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) IFN_##CODE,
233 enum internal_fn {
234 #include "internal-fn.def"
235   IFN_LAST
236 };
237
238 /* Return true if CODE represents a commutative tree code.  Otherwise
239    return false.  */
240 bool
241 commutative_tree_code (enum tree_code code)
242 {
243   switch (code)
244     {
245     case PLUS_EXPR:
246     case MULT_EXPR:
247     case MULT_HIGHPART_EXPR:
248     case MIN_EXPR:
249     case MAX_EXPR:
250     case BIT_IOR_EXPR:
251     case BIT_XOR_EXPR:
252     case BIT_AND_EXPR:
253     case NE_EXPR:
254     case EQ_EXPR:
255     case UNORDERED_EXPR:
256     case ORDERED_EXPR:
257     case UNEQ_EXPR:
258     case LTGT_EXPR:
259     case TRUTH_AND_EXPR:
260     case TRUTH_XOR_EXPR:
261     case TRUTH_OR_EXPR:
262     case WIDEN_MULT_EXPR:
263     case VEC_WIDEN_MULT_HI_EXPR:
264     case VEC_WIDEN_MULT_LO_EXPR:
265     case VEC_WIDEN_MULT_EVEN_EXPR:
266     case VEC_WIDEN_MULT_ODD_EXPR:
267       return true;
268
269     default:
270       break;
271     }
272   return false;
273 }
274
275 /* Return true if CODE represents a ternary tree code for which the
276    first two operands are commutative.  Otherwise return false.  */
277 bool
278 commutative_ternary_tree_code (enum tree_code code)
279 {
280   switch (code)
281     {
282     case WIDEN_MULT_PLUS_EXPR:
283     case WIDEN_MULT_MINUS_EXPR:
284     case DOT_PROD_EXPR:
285     case FMA_EXPR:
286       return true;
287
288     default:
289       break;
290     }
291   return false;
292 }
293
294
295 /* Base class for all identifiers the parser knows.  */
296
297 struct id_base : nofree_ptr_hash<id_base>
298 {
299   enum id_kind { CODE, FN, PREDICATE, USER, NULL_ID } kind;
300
301   id_base (id_kind, const char *, int = -1);
302
303   hashval_t hashval;
304   int nargs;
305   const char *id;
306
307   /* hash_table support.  */
308   static inline hashval_t hash (const id_base *);
309   static inline int equal (const id_base *, const id_base *);
310 };
311
312 inline hashval_t
313 id_base::hash (const id_base *op)
314 {
315   return op->hashval;
316 }
317
318 inline int
319 id_base::equal (const id_base *op1,
320                         const id_base *op2)
321 {
322   return (op1->hashval == op2->hashval
323           && strcmp (op1->id, op2->id) == 0);
324 }
325
326 /* The special id "null", which matches nothing.  */
327 static id_base *null_id;
328
329 /* Hashtable of known pattern operators.  This is pre-seeded from
330    all known tree codes and all known builtin function ids.  */
331 static hash_table<id_base> *operators;
332
333 id_base::id_base (id_kind kind_, const char *id_, int nargs_)
334 {
335   kind = kind_;
336   id = id_;
337   nargs = nargs_;
338   hashval = htab_hash_string (id);
339 }
340
341 /* Identifier that maps to a tree code.  */
342
343 struct operator_id : public id_base
344 {
345   operator_id (enum tree_code code_, const char *id_, unsigned nargs_,
346                const char *tcc_)
347       : id_base (id_base::CODE, id_, nargs_), code (code_), tcc (tcc_) {}
348   enum tree_code code;
349   const char *tcc;
350 };
351
352 /* Identifier that maps to a builtin or internal function code.  */
353
354 struct fn_id : public id_base
355 {
356   fn_id (enum built_in_function fn_, const char *id_)
357       : id_base (id_base::FN, id_), fn (fn_) {}
358   fn_id (enum internal_fn fn_, const char *id_)
359       : id_base (id_base::FN, id_), fn (int (END_BUILTINS) + int (fn_)) {}
360   unsigned int fn;
361 };
362
363 struct simplify;
364
365 /* Identifier that maps to a user-defined predicate.  */
366
367 struct predicate_id : public id_base
368 {
369   predicate_id (const char *id_)
370     : id_base (id_base::PREDICATE, id_), matchers (vNULL) {}
371   vec<simplify *> matchers;
372 };
373
374 /* Identifier that maps to a operator defined by a 'for' directive.  */
375
376 struct user_id : public id_base
377 {
378   user_id (const char *id_, bool is_oper_list_ = false)
379     : id_base (id_base::USER, id_), substitutes (vNULL),
380       used (false), is_oper_list (is_oper_list_) {}
381   vec<id_base *> substitutes;
382   bool used;
383   bool is_oper_list;
384 };
385
386 template<>
387 template<>
388 inline bool
389 is_a_helper <fn_id *>::test (id_base *id)
390 {
391   return id->kind == id_base::FN;
392 }
393
394 template<>
395 template<>
396 inline bool
397 is_a_helper <operator_id *>::test (id_base *id)
398 {
399   return id->kind == id_base::CODE;
400 }
401
402 template<>
403 template<>
404 inline bool
405 is_a_helper <predicate_id *>::test (id_base *id)
406 {
407   return id->kind == id_base::PREDICATE;
408 }
409
410 template<>
411 template<>
412 inline bool
413 is_a_helper <user_id *>::test (id_base *id)
414 {
415   return id->kind == id_base::USER;
416 }
417
418 /* Add a predicate identifier to the hash.  */
419
420 static predicate_id *
421 add_predicate (const char *id)
422 {
423   predicate_id *p = new predicate_id (id);
424   id_base **slot = operators->find_slot_with_hash (p, p->hashval, INSERT);
425   if (*slot)
426     fatal ("duplicate id definition");
427   *slot = p;
428   return p;
429 }
430
431 /* Add a tree code identifier to the hash.  */
432
433 static void
434 add_operator (enum tree_code code, const char *id,
435               const char *tcc, unsigned nargs)
436 {
437   if (strcmp (tcc, "tcc_unary") != 0
438       && strcmp (tcc, "tcc_binary") != 0
439       && strcmp (tcc, "tcc_comparison") != 0
440       && strcmp (tcc, "tcc_expression") != 0
441       /* For {REAL,IMAG}PART_EXPR and VIEW_CONVERT_EXPR.  */
442       && strcmp (tcc, "tcc_reference") != 0
443       /* To have INTEGER_CST and friends as "predicate operators".  */
444       && strcmp (tcc, "tcc_constant") != 0
445       /* And allow CONSTRUCTOR for vector initializers.  */
446       && !(code == CONSTRUCTOR)
447       /* Allow SSA_NAME as predicate operator.  */
448       && !(code == SSA_NAME))
449     return;
450   /* Treat ADDR_EXPR as atom, thus don't allow matching its operand.  */
451   if (code == ADDR_EXPR)
452     nargs = 0;
453   operator_id *op = new operator_id (code, id, nargs, tcc);
454   id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
455   if (*slot)
456     fatal ("duplicate id definition");
457   *slot = op;
458 }
459
460 /* Add a built-in or internal function identifier to the hash.  ID is
461    the name of its CFN_* enumeration value.  */
462
463 template <typename T>
464 static void
465 add_function (T code, const char *id)
466 {
467   fn_id *fn = new fn_id (code, id);
468   id_base **slot = operators->find_slot_with_hash (fn, fn->hashval, INSERT);
469   if (*slot)
470     fatal ("duplicate id definition");
471   *slot = fn;
472 }
473
474 /* Helper for easy comparing ID with tree code CODE.  */
475
476 static bool
477 operator==(id_base &id, enum tree_code code)
478 {
479   if (operator_id *oid = dyn_cast <operator_id *> (&id))
480     return oid->code == code;
481   return false;
482 }
483
484 /* Lookup the identifier ID.  Allow "null" if ALLOW_NULL.  */
485
486 id_base *
487 get_operator (const char *id, bool allow_null = false)
488 {
489   if (allow_null && strcmp (id, "null") == 0)
490     return null_id;
491
492   id_base tem (id_base::CODE, id);
493
494   id_base *op = operators->find_with_hash (&tem, tem.hashval);
495   if (op)
496     {
497       /* If this is a user-defined identifier track whether it was used.  */
498       if (user_id *uid = dyn_cast<user_id *> (op))
499         uid->used = true;
500       return op;
501     }
502
503   char *id2;
504   bool all_upper = true;
505   bool all_lower = true;
506   for (unsigned int i = 0; id[i]; ++i)
507     if (ISUPPER (id[i]))
508       all_lower = false;
509     else if (ISLOWER (id[i]))
510       all_upper = false;
511   if (all_lower)
512     {
513       /* Try in caps with _EXPR appended.  */
514       id2 = ACONCAT ((id, "_EXPR", NULL));
515       for (unsigned int i = 0; id2[i]; ++i)
516         id2[i] = TOUPPER (id2[i]);
517     }
518   else if (all_upper && strncmp (id, "IFN_", 4) == 0)
519     /* Try CFN_ instead of IFN_.  */
520     id2 = ACONCAT (("CFN_", id + 4, NULL));
521   else if (all_upper && strncmp (id, "BUILT_IN_", 9) == 0)
522     /* Try prepending CFN_.  */
523     id2 = ACONCAT (("CFN_", id, NULL));
524   else
525     return NULL;
526
527   new (&tem) id_base (id_base::CODE, id2);
528   return operators->find_with_hash (&tem, tem.hashval);
529 }
530
531 typedef hash_map<nofree_string_hash, unsigned> cid_map_t;
532
533
534 /* The AST produced by parsing of the pattern definitions.  */
535
536 struct dt_operand;
537 struct capture_info;
538
539 /* The base class for operands.  */
540
541 struct operand {
542   enum op_type { OP_PREDICATE, OP_EXPR, OP_CAPTURE, OP_C_EXPR, OP_IF, OP_WITH };
543   operand (enum op_type type_, source_location loc_)
544     : type (type_), location (loc_) {}
545   enum op_type type;
546   source_location location;
547   virtual void gen_transform (FILE *, int, const char *, bool, int,
548                               const char *, capture_info *,
549                               dt_operand ** = 0,
550                               int = 0)
551     { gcc_unreachable  (); }
552 };
553
554 /* A predicate operand.  Predicates are leafs in the AST.  */
555
556 struct predicate : public operand
557 {
558   predicate (predicate_id *p_, source_location loc)
559     : operand (OP_PREDICATE, loc), p (p_) {}
560   predicate_id *p;
561 };
562
563 /* An operand that constitutes an expression.  Expressions include
564    function calls and user-defined predicate invocations.  */
565
566 struct expr : public operand
567 {
568   expr (id_base *operation_, source_location loc, bool is_commutative_ = false)
569     : operand (OP_EXPR, loc), operation (operation_),
570       ops (vNULL), expr_type (NULL), is_commutative (is_commutative_),
571       is_generic (false), force_single_use (false) {}
572   expr (expr *e)
573     : operand (OP_EXPR, e->location), operation (e->operation),
574       ops (vNULL), expr_type (e->expr_type), is_commutative (e->is_commutative),
575       is_generic (e->is_generic), force_single_use (e->force_single_use) {}
576   void append_op (operand *op) { ops.safe_push (op); }
577   /* The operator and its operands.  */
578   id_base *operation;
579   vec<operand *> ops;
580   /* An explicitely specified type - used exclusively for conversions.  */
581   const char *expr_type;
582   /* Whether the operation is to be applied commutatively.  This is
583      later lowered to two separate patterns.  */
584   bool is_commutative;
585   /* Whether the expression is expected to be in GENERIC form.  */
586   bool is_generic;
587   /* Whether pushing any stmt to the sequence should be conditional
588      on this expression having a single-use.  */
589   bool force_single_use;
590   virtual void gen_transform (FILE *f, int, const char *, bool, int,
591                               const char *, capture_info *,
592                               dt_operand ** = 0, int = 0);
593 };
594
595 /* An operator that is represented by native C code.  This is always
596    a leaf operand in the AST.  This class is also used to represent
597    the code to be generated for 'if' and 'with' expressions.  */
598
599 struct c_expr : public operand
600 {
601   /* A mapping of an identifier and its replacement.  Used to apply
602      'for' lowering.  */
603   struct id_tab {
604     const char *id;
605     const char *oper;
606     id_tab (const char *id_, const char *oper_): id (id_), oper (oper_) {}
607   };
608
609   c_expr (cpp_reader *r_, source_location loc,
610           vec<cpp_token> code_, unsigned nr_stmts_,
611           vec<id_tab> ids_, cid_map_t *capture_ids_)
612     : operand (OP_C_EXPR, loc), r (r_), code (code_),
613       capture_ids (capture_ids_), nr_stmts (nr_stmts_), ids (ids_) {}
614   /* cpplib tokens and state to transform this back to source.  */
615   cpp_reader *r;
616   vec<cpp_token> code;
617   cid_map_t *capture_ids;
618   /* The number of statements parsed (well, the number of ';'s).  */
619   unsigned nr_stmts;
620   /* The identifier replacement vector.  */
621   vec<id_tab> ids;
622   virtual void gen_transform (FILE *f, int, const char *, bool, int,
623                               const char *, capture_info *,
624                               dt_operand ** = 0, int = 0);
625 };
626
627 /* A wrapper around another operand that captures its value.  */
628
629 struct capture : public operand
630 {
631   capture (source_location loc, unsigned where_, operand *what_)
632       : operand (OP_CAPTURE, loc), where (where_), what (what_) {}
633   /* Identifier index for the value.  */
634   unsigned where;
635   /* The captured value.  */
636   operand *what;
637   virtual void gen_transform (FILE *f, int, const char *, bool, int,
638                               const char *, capture_info *,
639                               dt_operand ** = 0, int = 0);
640 };
641
642 /* if expression.  */
643
644 struct if_expr : public operand
645 {
646   if_expr (source_location loc)
647     : operand (OP_IF, loc), cond (NULL), trueexpr (NULL), falseexpr (NULL) {}
648   c_expr *cond;
649   operand *trueexpr;
650   operand *falseexpr;
651 };
652
653 /* with expression.  */
654
655 struct with_expr : public operand
656 {
657   with_expr (source_location loc)
658     : operand (OP_WITH, loc), with (NULL), subexpr (NULL) {}
659   c_expr *with;
660   operand *subexpr;
661 };
662
663 template<>
664 template<>
665 inline bool
666 is_a_helper <capture *>::test (operand *op)
667 {
668   return op->type == operand::OP_CAPTURE;
669 }
670
671 template<>
672 template<>
673 inline bool
674 is_a_helper <predicate *>::test (operand *op)
675 {
676   return op->type == operand::OP_PREDICATE;
677 }
678
679 template<>
680 template<>
681 inline bool
682 is_a_helper <c_expr *>::test (operand *op)
683 {
684   return op->type == operand::OP_C_EXPR;
685 }
686
687 template<>
688 template<>
689 inline bool
690 is_a_helper <expr *>::test (operand *op)
691 {
692   return op->type == operand::OP_EXPR;
693 }
694
695 template<>
696 template<>
697 inline bool
698 is_a_helper <if_expr *>::test (operand *op)
699 {
700   return op->type == operand::OP_IF;
701 }
702
703 template<>
704 template<>
705 inline bool
706 is_a_helper <with_expr *>::test (operand *op)
707 {
708   return op->type == operand::OP_WITH;
709 }
710
711 /* The main class of a pattern and its transform.  This is used to
712    represent both (simplify ...) and (match ...) kinds.  The AST
713    duplicates all outer 'if' and 'for' expressions here so each
714    simplify can exist in isolation.  */
715
716 struct simplify
717 {
718   enum simplify_kind { SIMPLIFY, MATCH };
719
720   simplify (simplify_kind kind_, operand *match_, operand *result_,
721             vec<vec<user_id *> > for_vec_, cid_map_t *capture_ids_)
722       : kind (kind_), match (match_), result (result_),
723       for_vec (for_vec_), for_subst_vec (vNULL),
724       capture_ids (capture_ids_), capture_max (capture_ids_->elements () - 1) {}
725
726   simplify_kind kind;
727   /* The expression that is matched against the GENERIC or GIMPLE IL.  */
728   operand *match;
729   /* For a (simplify ...) an expression with ifs and withs with the expression
730      produced when the pattern applies in the leafs.
731      For a (match ...) the leafs are either empty if it is a simple predicate
732      or the single expression specifying the matched operands.  */
733   struct operand *result;
734   /* Collected 'for' expression operators that have to be replaced
735      in the lowering phase.  */
736   vec<vec<user_id *> > for_vec;
737   vec<std::pair<user_id *, id_base *> > for_subst_vec;
738   /* A map of capture identifiers to indexes.  */
739   cid_map_t *capture_ids;
740   int capture_max;
741 };
742
743 /* Debugging routines for dumping the AST.  */
744
745 DEBUG_FUNCTION void
746 print_operand (operand *o, FILE *f = stderr, bool flattened = false)
747 {
748   if (capture *c = dyn_cast<capture *> (o))
749     {
750       if (c->what && flattened == false)
751         print_operand (c->what, f, flattened);
752       fprintf (f, "@%u", c->where);
753     }
754
755   else if (predicate *p = dyn_cast<predicate *> (o))
756     fprintf (f, "%s", p->p->id);
757
758   else if (is_a<c_expr *> (o))
759     fprintf (f, "c_expr");
760
761   else if (expr *e = dyn_cast<expr *> (o))
762     {
763       if (e->ops.length () == 0)
764         fprintf (f, "%s", e->operation->id);
765       else
766         {
767           fprintf (f, "(%s", e->operation->id);
768
769           if (flattened == false)
770             {
771               for (unsigned i = 0; i < e->ops.length (); ++i)
772                 {
773                   putc (' ', f);
774                   print_operand (e->ops[i], f, flattened);
775                 }
776             }
777           putc (')', f);
778         }
779     }
780
781   else
782     gcc_unreachable ();
783 }
784
785 DEBUG_FUNCTION void
786 print_matches (struct simplify *s, FILE *f = stderr)
787 {
788   fprintf (f, "for expression: ");
789   print_operand (s->match, f);
790   putc ('\n', f);
791 }
792
793
794 /* AST lowering.  */
795
796 /* Lowering of commutative operators.  */
797
798 static void
799 cartesian_product (const vec< vec<operand *> >& ops_vector,
800                    vec< vec<operand *> >& result, vec<operand *>& v, unsigned n)
801 {
802   if (n == ops_vector.length ())
803     {
804       vec<operand *> xv = v.copy ();
805       result.safe_push (xv);
806       return;
807     }
808
809   for (unsigned i = 0; i < ops_vector[n].length (); ++i)
810     {
811       v[n] = ops_vector[n][i];
812       cartesian_product (ops_vector, result, v, n + 1);
813     }
814 }
815
816 /* Lower OP to two operands in case it is marked as commutative.  */
817
818 static vec<operand *>
819 commutate (operand *op)
820 {
821   vec<operand *> ret = vNULL;
822
823   if (capture *c = dyn_cast <capture *> (op))
824     {
825       if (!c->what)
826         {
827           ret.safe_push (op);
828           return ret;
829         }
830       vec<operand *> v = commutate (c->what);
831       for (unsigned i = 0; i < v.length (); ++i)
832         {
833           capture *nc = new capture (c->location, c->where, v[i]);
834           ret.safe_push (nc);
835         }
836       return ret;
837     }
838
839   expr *e = dyn_cast <expr *> (op);
840   if (!e || e->ops.length () == 0)
841     {
842       ret.safe_push (op);
843       return ret;
844     }
845
846   vec< vec<operand *> > ops_vector = vNULL;
847   for (unsigned i = 0; i < e->ops.length (); ++i)
848     ops_vector.safe_push (commutate (e->ops[i]));
849
850   auto_vec< vec<operand *> > result;
851   auto_vec<operand *> v (e->ops.length ());
852   v.quick_grow_cleared (e->ops.length ());
853   cartesian_product (ops_vector, result, v, 0);
854
855
856   for (unsigned i = 0; i < result.length (); ++i)
857     {
858       expr *ne = new expr (e);
859       ne->is_commutative = false;
860       for (unsigned j = 0; j < result[i].length (); ++j)
861         ne->append_op (result[i][j]);
862       ret.safe_push (ne);
863     }
864
865   if (!e->is_commutative)
866     return ret;
867
868   for (unsigned i = 0; i < result.length (); ++i)
869     {
870       expr *ne = new expr (e);
871       ne->is_commutative = false;
872       // result[i].length () is 2 since e->operation is binary
873       for (unsigned j = result[i].length (); j; --j)
874         ne->append_op (result[i][j-1]);
875       ret.safe_push (ne);
876     }
877
878   return ret;
879 }
880
881 /* Lower operations marked as commutative in the AST of S and push
882    the resulting patterns to SIMPLIFIERS.  */
883
884 static void
885 lower_commutative (simplify *s, vec<simplify *>& simplifiers)
886 {
887   vec<operand *> matchers = commutate (s->match);
888   for (unsigned i = 0; i < matchers.length (); ++i)
889     {
890       simplify *ns = new simplify (s->kind, matchers[i], s->result,
891                                    s->for_vec, s->capture_ids);
892       simplifiers.safe_push (ns);
893     }
894 }
895
896 /* Strip conditional conversios using operator OPER from O and its
897    children if STRIP, else replace them with an unconditional convert.  */
898
899 operand *
900 lower_opt_convert (operand *o, enum tree_code oper,
901                    enum tree_code to_oper, bool strip)
902 {
903   if (capture *c = dyn_cast<capture *> (o))
904     {
905       if (c->what)
906         return new capture (c->location, c->where,
907                             lower_opt_convert (c->what, oper, to_oper, strip));
908       else
909         return c;
910     }
911
912   expr *e = dyn_cast<expr *> (o);
913   if (!e)
914     return o;
915
916   if (*e->operation == oper)
917     {
918       if (strip)
919         return lower_opt_convert (e->ops[0], oper, to_oper, strip);
920
921       expr *ne = new expr (e);
922       ne->operation = (to_oper == CONVERT_EXPR
923                        ? get_operator ("CONVERT_EXPR")
924                        : get_operator ("VIEW_CONVERT_EXPR"));
925       ne->append_op (lower_opt_convert (e->ops[0], oper, to_oper, strip));
926       return ne;
927     }
928
929   expr *ne = new expr (e);
930   for (unsigned i = 0; i < e->ops.length (); ++i)
931     ne->append_op (lower_opt_convert (e->ops[i], oper, to_oper, strip));
932
933   return ne;
934 }
935
936 /* Determine whether O or its children uses the conditional conversion
937    operator OPER.  */
938
939 static bool
940 has_opt_convert (operand *o, enum tree_code oper)
941 {
942   if (capture *c = dyn_cast<capture *> (o))
943     {
944       if (c->what)
945         return has_opt_convert (c->what, oper);
946       else
947         return false;
948     }
949
950   expr *e = dyn_cast<expr *> (o);
951   if (!e)
952     return false;
953
954   if (*e->operation == oper)
955     return true;
956
957   for (unsigned i = 0; i < e->ops.length (); ++i)
958     if (has_opt_convert (e->ops[i], oper))
959       return true;
960
961   return false;
962 }
963
964 /* Lower conditional convert operators in O, expanding it to a vector
965    if required.  */
966
967 static vec<operand *>
968 lower_opt_convert (operand *o)
969 {
970   vec<operand *> v1 = vNULL, v2;
971
972   v1.safe_push (o);
973
974   enum tree_code opers[]
975     = { CONVERT0, CONVERT_EXPR,
976         CONVERT1, CONVERT_EXPR,
977         CONVERT2, CONVERT_EXPR,
978         VIEW_CONVERT0, VIEW_CONVERT_EXPR,
979         VIEW_CONVERT1, VIEW_CONVERT_EXPR,
980         VIEW_CONVERT2, VIEW_CONVERT_EXPR };
981
982   /* Conditional converts are lowered to a pattern with the
983      conversion and one without.  The three different conditional
984      convert codes are lowered separately.  */
985
986   for (unsigned i = 0; i < sizeof (opers) / sizeof (enum tree_code); i += 2)
987     {
988       v2 = vNULL;
989       for (unsigned j = 0; j < v1.length (); ++j)
990         if (has_opt_convert (v1[j], opers[i]))
991           {
992             v2.safe_push (lower_opt_convert (v1[j],
993                                              opers[i], opers[i+1], false));
994             v2.safe_push (lower_opt_convert (v1[j],
995                                              opers[i], opers[i+1], true));
996           }
997
998       if (v2 != vNULL)
999         {
1000           v1 = vNULL;
1001           for (unsigned j = 0; j < v2.length (); ++j)
1002             v1.safe_push (v2[j]);
1003         }
1004     }
1005
1006   return v1;
1007 }
1008
1009 /* Lower conditional convert operators in the AST of S and push
1010    the resulting multiple patterns to SIMPLIFIERS.  */
1011
1012 static void
1013 lower_opt_convert (simplify *s, vec<simplify *>& simplifiers)
1014 {
1015   vec<operand *> matchers = lower_opt_convert (s->match);
1016   for (unsigned i = 0; i < matchers.length (); ++i)
1017     {
1018       simplify *ns = new simplify (s->kind, matchers[i], s->result,
1019                                    s->for_vec, s->capture_ids);
1020       simplifiers.safe_push (ns);
1021     }
1022 }
1023
1024 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
1025    GENERIC and a GIMPLE variant.  */
1026
1027 static vec<operand *>
1028 lower_cond (operand *o)
1029 {
1030   vec<operand *> ro = vNULL;
1031
1032   if (capture *c = dyn_cast<capture *> (o))
1033     {
1034       if (c->what)
1035         {
1036           vec<operand *> lop = vNULL;
1037           lop = lower_cond (c->what);
1038
1039           for (unsigned i = 0; i < lop.length (); ++i)
1040             ro.safe_push (new capture (c->location, c->where, lop[i]));
1041           return ro;
1042         }
1043     }
1044
1045   expr *e = dyn_cast<expr *> (o);
1046   if (!e || e->ops.length () == 0)
1047     {
1048       ro.safe_push (o);
1049       return ro;
1050     }
1051
1052   vec< vec<operand *> > ops_vector = vNULL;
1053   for (unsigned i = 0; i < e->ops.length (); ++i)
1054     ops_vector.safe_push (lower_cond (e->ops[i]));
1055
1056   auto_vec< vec<operand *> > result;
1057   auto_vec<operand *> v (e->ops.length ());
1058   v.quick_grow_cleared (e->ops.length ());
1059   cartesian_product (ops_vector, result, v, 0);
1060
1061   for (unsigned i = 0; i < result.length (); ++i)
1062     {
1063       expr *ne = new expr (e);
1064       for (unsigned j = 0; j < result[i].length (); ++j)
1065         ne->append_op (result[i][j]);
1066       ro.safe_push (ne);
1067       /* If this is a COND with a captured expression or an
1068          expression with two operands then also match a GENERIC
1069          form on the compare.  */
1070       if ((*e->operation == COND_EXPR
1071            || *e->operation == VEC_COND_EXPR)
1072           && ((is_a <capture *> (e->ops[0])
1073                && as_a <capture *> (e->ops[0])->what
1074                && is_a <expr *> (as_a <capture *> (e->ops[0])->what)
1075                && as_a <expr *>
1076                     (as_a <capture *> (e->ops[0])->what)->ops.length () == 2)
1077               || (is_a <expr *> (e->ops[0])
1078                   && as_a <expr *> (e->ops[0])->ops.length () == 2)))
1079         {
1080           expr *ne = new expr (e);
1081           for (unsigned j = 0; j < result[i].length (); ++j)
1082             ne->append_op (result[i][j]);
1083           if (capture *c = dyn_cast <capture *> (ne->ops[0]))
1084             {
1085               expr *ocmp = as_a <expr *> (c->what);
1086               expr *cmp = new expr (ocmp);
1087               for (unsigned j = 0; j < ocmp->ops.length (); ++j)
1088                 cmp->append_op (ocmp->ops[j]);
1089               cmp->is_generic = true;
1090               ne->ops[0] = new capture (c->location, c->where, cmp);
1091             }
1092           else
1093             {
1094               expr *ocmp = as_a <expr *> (ne->ops[0]);
1095               expr *cmp = new expr (ocmp);
1096               for (unsigned j = 0; j < ocmp->ops.length (); ++j)
1097                 cmp->append_op (ocmp->ops[j]);
1098               cmp->is_generic = true;
1099               ne->ops[0] = cmp;
1100             }
1101           ro.safe_push (ne);
1102         }
1103     }
1104
1105   return ro;
1106 }
1107
1108 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
1109    GENERIC and a GIMPLE variant.  */
1110
1111 static void
1112 lower_cond (simplify *s, vec<simplify *>& simplifiers)
1113 {
1114   vec<operand *> matchers = lower_cond (s->match);
1115   for (unsigned i = 0; i < matchers.length (); ++i)
1116     {
1117       simplify *ns = new simplify (s->kind, matchers[i], s->result,
1118                                    s->for_vec, s->capture_ids);
1119       simplifiers.safe_push (ns);
1120     }
1121 }
1122
1123 /* Return true if O refers to ID.  */
1124
1125 bool
1126 contains_id (operand *o, user_id *id)
1127 {
1128   if (capture *c = dyn_cast<capture *> (o))
1129     return c->what && contains_id (c->what, id);
1130
1131   if (expr *e = dyn_cast<expr *> (o))
1132     {
1133       if (e->operation == id)
1134         return true;
1135       for (unsigned i = 0; i < e->ops.length (); ++i)
1136         if (contains_id (e->ops[i], id))
1137           return true;
1138       return false;
1139     }
1140
1141   if (with_expr *w = dyn_cast <with_expr *> (o))
1142     return (contains_id (w->with, id)
1143             || contains_id (w->subexpr, id));
1144
1145   if (if_expr *ife = dyn_cast <if_expr *> (o))
1146     return (contains_id (ife->cond, id)
1147             || contains_id (ife->trueexpr, id)
1148             || (ife->falseexpr && contains_id (ife->falseexpr, id)));
1149
1150   if (c_expr *ce = dyn_cast<c_expr *> (o))
1151     return ce->capture_ids && ce->capture_ids->get (id->id);
1152
1153   return false;
1154 }
1155
1156
1157 /* In AST operand O replace operator ID with operator WITH.  */
1158
1159 operand *
1160 replace_id (operand *o, user_id *id, id_base *with)
1161 {
1162   /* Deep-copy captures and expressions, replacing operations as
1163      needed.  */
1164   if (capture *c = dyn_cast<capture *> (o))
1165     {
1166       if (!c->what)
1167         return c;
1168       return new capture (c->location, c->where,
1169                           replace_id (c->what, id, with));
1170     }
1171   else if (expr *e = dyn_cast<expr *> (o))
1172     {
1173       expr *ne = new expr (e);
1174       if (e->operation == id)
1175         ne->operation = with;
1176       for (unsigned i = 0; i < e->ops.length (); ++i)
1177         ne->append_op (replace_id (e->ops[i], id, with));
1178       return ne;
1179     }
1180   else if (with_expr *w = dyn_cast <with_expr *> (o))
1181     {
1182       with_expr *nw = new with_expr (w->location);
1183       nw->with = as_a <c_expr *> (replace_id (w->with, id, with));
1184       nw->subexpr = replace_id (w->subexpr, id, with);
1185       return nw;
1186     }
1187   else if (if_expr *ife = dyn_cast <if_expr *> (o))
1188     {
1189       if_expr *nife = new if_expr (ife->location);
1190       nife->cond = as_a <c_expr *> (replace_id (ife->cond, id, with));
1191       nife->trueexpr = replace_id (ife->trueexpr, id, with);
1192       if (ife->falseexpr)
1193         nife->falseexpr = replace_id (ife->falseexpr, id, with);
1194       return nife;
1195     }
1196
1197   /* For c_expr we simply record a string replacement table which is
1198      applied at code-generation time.  */
1199   if (c_expr *ce = dyn_cast<c_expr *> (o))
1200     {
1201       vec<c_expr::id_tab> ids = ce->ids.copy ();
1202       ids.safe_push (c_expr::id_tab (id->id, with->id));
1203       return new c_expr (ce->r, ce->location,
1204                          ce->code, ce->nr_stmts, ids, ce->capture_ids);
1205     }
1206
1207   return o;
1208 }
1209
1210 /* Return true if the binary operator OP is ok for delayed substitution
1211    during for lowering.  */
1212
1213 static bool
1214 binary_ok (operator_id *op)
1215 {
1216   switch (op->code)
1217     {
1218     case PLUS_EXPR:
1219     case MINUS_EXPR:
1220     case MULT_EXPR:
1221     case TRUNC_DIV_EXPR:
1222     case CEIL_DIV_EXPR:
1223     case FLOOR_DIV_EXPR:
1224     case ROUND_DIV_EXPR:
1225     case TRUNC_MOD_EXPR:
1226     case CEIL_MOD_EXPR:
1227     case FLOOR_MOD_EXPR:
1228     case ROUND_MOD_EXPR:
1229     case RDIV_EXPR:
1230     case EXACT_DIV_EXPR:
1231     case MIN_EXPR:
1232     case MAX_EXPR:
1233     case BIT_IOR_EXPR:
1234     case BIT_XOR_EXPR:
1235     case BIT_AND_EXPR:
1236       return true;
1237     default:
1238       return false;
1239     }
1240 }
1241
1242 /* Lower recorded fors for SIN and output to SIMPLIFIERS.  */
1243
1244 static void
1245 lower_for (simplify *sin, vec<simplify *>& simplifiers)
1246 {
1247   vec<vec<user_id *> >& for_vec = sin->for_vec;
1248   unsigned worklist_start = 0;
1249   auto_vec<simplify *> worklist;
1250   worklist.safe_push (sin);
1251
1252   /* Lower each recorded for separately, operating on the
1253      set of simplifiers created by the previous one.
1254      Lower inner-to-outer so inner for substitutes can refer
1255      to operators replaced by outer fors.  */
1256   for (int fi = for_vec.length () - 1; fi >= 0; --fi)
1257     {
1258       vec<user_id *>& ids = for_vec[fi];
1259       unsigned n_ids = ids.length ();
1260       unsigned max_n_opers = 0;
1261       bool can_delay_subst = (sin->kind == simplify::SIMPLIFY);
1262       for (unsigned i = 0; i < n_ids; ++i)
1263         {
1264           if (ids[i]->substitutes.length () > max_n_opers)
1265             max_n_opers = ids[i]->substitutes.length ();
1266           /* Require that all substitutes are of the same kind so that
1267              if we delay substitution to the result op code generation
1268              can look at the first substitute for deciding things like
1269              types of operands.  */
1270           enum id_base::id_kind kind = ids[i]->substitutes[0]->kind;
1271           for (unsigned j = 0; j < ids[i]->substitutes.length (); ++j)
1272             if (ids[i]->substitutes[j]->kind != kind)
1273               can_delay_subst = false;
1274             else if (operator_id *op
1275                        = dyn_cast <operator_id *> (ids[i]->substitutes[j]))
1276               {
1277                 operator_id *op0
1278                   = as_a <operator_id *> (ids[i]->substitutes[0]);
1279                 if (strcmp (op->tcc, "tcc_comparison") == 0
1280                     && strcmp (op0->tcc, "tcc_comparison") == 0)
1281                   ;
1282                 /* Unfortunately we can't just allow all tcc_binary.  */
1283                 else if (strcmp (op->tcc, "tcc_binary") == 0
1284                          && strcmp (op0->tcc, "tcc_binary") == 0
1285                          && binary_ok (op)
1286                          && binary_ok (op0))
1287                   ;
1288                 else if ((strcmp (op->id + 1, "SHIFT_EXPR") == 0
1289                           || strcmp (op->id + 1, "ROTATE_EXPR") == 0)
1290                          && (strcmp (op0->id + 1, "SHIFT_EXPR") == 0
1291                              || strcmp (op0->id + 1, "ROTATE_EXPR") == 0))
1292                   ;
1293                 else
1294                   can_delay_subst = false;
1295               }
1296             else if (is_a <fn_id *> (ids[i]->substitutes[j]))
1297               ;
1298             else
1299               can_delay_subst = false;
1300         }
1301
1302       unsigned worklist_end = worklist.length ();
1303       for (unsigned si = worklist_start; si < worklist_end; ++si)
1304         {
1305           simplify *s = worklist[si];
1306           for (unsigned j = 0; j < max_n_opers; ++j)
1307             {
1308               operand *match_op = s->match;
1309               operand *result_op = s->result;
1310               vec<std::pair<user_id *, id_base *> > subst;
1311               subst.create (n_ids);
1312               bool skip = false;
1313               for (unsigned i = 0; i < n_ids; ++i)
1314                 {
1315                   user_id *id = ids[i];
1316                   id_base *oper = id->substitutes[j % id->substitutes.length ()];
1317                   if (oper == null_id
1318                       && (contains_id (match_op, id)
1319                           || contains_id (result_op, id)))
1320                     {
1321                       skip = true;
1322                       break;
1323                     }
1324                   subst.quick_push (std::make_pair (id, oper));
1325                   match_op = replace_id (match_op, id, oper);
1326                   if (result_op
1327                       && !can_delay_subst)
1328                     result_op = replace_id (result_op, id, oper);
1329                 }
1330               if (skip)
1331                 {
1332                   subst.release ();
1333                   continue;
1334                 }
1335               simplify *ns = new simplify (s->kind, match_op, result_op,
1336                                            vNULL, s->capture_ids);
1337               ns->for_subst_vec.safe_splice (s->for_subst_vec);
1338               if (result_op
1339                   && can_delay_subst)
1340                 ns->for_subst_vec.safe_splice (subst);
1341               else
1342                 subst.release ();
1343               worklist.safe_push (ns);
1344             }
1345         }
1346       worklist_start = worklist_end;
1347     }
1348
1349   /* Copy out the result from the last for lowering.  */
1350   for (unsigned i = worklist_start; i < worklist.length (); ++i)
1351     simplifiers.safe_push (worklist[i]);
1352 }
1353
1354 /* Lower the AST for everything in SIMPLIFIERS.  */
1355
1356 static void
1357 lower (vec<simplify *>& simplifiers, bool gimple)
1358 {
1359   auto_vec<simplify *> out_simplifiers;
1360   for (unsigned i = 0; i < simplifiers.length (); ++i)
1361     lower_opt_convert (simplifiers[i], out_simplifiers);
1362
1363   simplifiers.truncate (0);
1364   for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1365     lower_commutative (out_simplifiers[i], simplifiers);
1366
1367   out_simplifiers.truncate (0);
1368   if (gimple)
1369     for (unsigned i = 0; i < simplifiers.length (); ++i)
1370       lower_cond (simplifiers[i], out_simplifiers);
1371   else
1372     out_simplifiers.safe_splice (simplifiers);
1373
1374
1375   simplifiers.truncate (0);
1376   for (unsigned i = 0; i < out_simplifiers.length (); ++i)
1377     lower_for (out_simplifiers[i], simplifiers);
1378 }
1379
1380
1381
1382
1383 /* The decision tree built for generating GIMPLE and GENERIC pattern
1384    matching code.  It represents the 'match' expression of all
1385    simplifies and has those as its leafs.  */
1386
1387 struct dt_simplify;
1388
1389 /* A hash-map collecting semantically equivalent leafs in the decision
1390    tree for splitting out to separate functions.  */
1391 struct sinfo
1392 {
1393   dt_simplify *s;
1394
1395   const char *fname;
1396   unsigned cnt;
1397 };
1398
1399 struct sinfo_hashmap_traits : simple_hashmap_traits<pointer_hash<dt_simplify>,
1400                                                     sinfo *>
1401 {
1402   static inline hashval_t hash (const key_type &);
1403   static inline bool equal_keys (const key_type &, const key_type &);
1404   template <typename T> static inline void remove (T &) {}
1405 };
1406
1407 typedef hash_map<void * /* unused */, sinfo *, sinfo_hashmap_traits>
1408   sinfo_map_t;
1409
1410
1411 /* Decision tree base class, used for DT_TRUE and DT_NODE.  */
1412
1413 struct dt_node
1414 {
1415   enum dt_type { DT_NODE, DT_OPERAND, DT_TRUE, DT_MATCH, DT_SIMPLIFY };
1416
1417   enum dt_type type;
1418   unsigned level;
1419   vec<dt_node *> kids;
1420
1421   /* Statistics.  */
1422   unsigned num_leafs;
1423   unsigned total_size;
1424   unsigned max_level;
1425
1426   dt_node (enum dt_type type_): type (type_), level (0), kids (vNULL) {}
1427
1428   dt_node *append_node (dt_node *);
1429   dt_node *append_op (operand *, dt_node *parent = 0, unsigned pos = 0);
1430   dt_node *append_true_op (dt_node *parent = 0, unsigned pos = 0);
1431   dt_node *append_match_op (dt_operand *, dt_node *parent = 0, unsigned pos = 0);
1432   dt_node *append_simplify (simplify *, unsigned, dt_operand **);
1433
1434   virtual void gen (FILE *, int, bool) {}
1435
1436   void gen_kids (FILE *, int, bool);
1437   void gen_kids_1 (FILE *, int, bool,
1438                    vec<dt_operand *>, vec<dt_operand *>, vec<dt_operand *>,
1439                    vec<dt_operand *>, vec<dt_operand *>, vec<dt_node *>);
1440
1441   void analyze (sinfo_map_t &);
1442 };
1443
1444 /* Generic decision tree node used for DT_OPERAND and DT_MATCH.  */
1445
1446 struct dt_operand : public dt_node
1447 {
1448   operand *op;
1449   dt_operand *match_dop;
1450   dt_operand *parent;
1451   unsigned pos;
1452
1453   dt_operand (enum dt_type type, operand *op_, dt_operand *match_dop_,
1454               dt_operand *parent_ = 0, unsigned pos_ = 0)
1455       : dt_node (type), op (op_), match_dop (match_dop_),
1456       parent (parent_), pos (pos_) {}
1457
1458   void gen (FILE *, int, bool);
1459   unsigned gen_predicate (FILE *, int, const char *, bool);
1460   unsigned gen_match_op (FILE *, int, const char *);
1461
1462   unsigned gen_gimple_expr (FILE *, int);
1463   unsigned gen_generic_expr (FILE *, int, const char *);
1464
1465   char *get_name (char *);
1466   void gen_opname (char *, unsigned);
1467 };
1468
1469 /* Leaf node of the decision tree, used for DT_SIMPLIFY.  */
1470
1471 struct dt_simplify : public dt_node
1472 {
1473   simplify *s;
1474   unsigned pattern_no;
1475   dt_operand **indexes;
1476   sinfo *info;
1477
1478   dt_simplify (simplify *s_, unsigned pattern_no_, dt_operand **indexes_)
1479         : dt_node (DT_SIMPLIFY), s (s_), pattern_no (pattern_no_),
1480           indexes (indexes_), info (NULL)  {}
1481
1482   void gen_1 (FILE *, int, bool, operand *);
1483   void gen (FILE *f, int, bool);
1484 };
1485
1486 template<>
1487 template<>
1488 inline bool
1489 is_a_helper <dt_operand *>::test (dt_node *n)
1490 {
1491   return (n->type == dt_node::DT_OPERAND
1492           || n->type == dt_node::DT_MATCH);
1493 }
1494
1495 template<>
1496 template<>
1497 inline bool
1498 is_a_helper <dt_simplify *>::test (dt_node *n)
1499 {
1500   return n->type == dt_node::DT_SIMPLIFY;
1501 }
1502
1503
1504
1505 /* A container for the actual decision tree.  */
1506
1507 struct decision_tree
1508 {
1509   dt_node *root;
1510
1511   void insert (struct simplify *, unsigned);
1512   void gen (FILE *f, bool gimple);
1513   void print (FILE *f = stderr);
1514
1515   decision_tree () { root = new dt_node (dt_node::DT_NODE); }
1516
1517   static dt_node *insert_operand (dt_node *, operand *, dt_operand **indexes,
1518                                   unsigned pos = 0, dt_node *parent = 0);
1519   static dt_node *find_node (vec<dt_node *>&, dt_node *);
1520   static bool cmp_node (dt_node *, dt_node *);
1521   static void print_node (dt_node *, FILE *f = stderr, unsigned = 0);
1522 };
1523
1524 /* Compare two AST operands O1 and O2 and return true if they are equal.  */
1525
1526 bool
1527 cmp_operand (operand *o1, operand *o2)
1528 {
1529   if (!o1 || !o2 || o1->type != o2->type)
1530     return false;
1531
1532   if (o1->type == operand::OP_PREDICATE)
1533     {
1534       predicate *p1 = as_a<predicate *>(o1);
1535       predicate *p2 = as_a<predicate *>(o2);
1536       return p1->p == p2->p;
1537     }
1538   else if (o1->type == operand::OP_EXPR)
1539     {
1540       expr *e1 = static_cast<expr *>(o1);
1541       expr *e2 = static_cast<expr *>(o2);
1542       return (e1->operation == e2->operation
1543               && e1->is_generic == e2->is_generic);
1544     }
1545   else
1546     return false;
1547 }
1548
1549 /* Compare two decision tree nodes N1 and N2 and return true if they
1550    are equal.  */
1551
1552 bool
1553 decision_tree::cmp_node (dt_node *n1, dt_node *n2)
1554 {
1555   if (!n1 || !n2 || n1->type != n2->type)
1556     return false;
1557
1558   if (n1 == n2)
1559     return true;
1560
1561   if (n1->type == dt_node::DT_TRUE)
1562     return false;
1563
1564   if (n1->type == dt_node::DT_OPERAND)
1565     return cmp_operand ((as_a<dt_operand *> (n1))->op,
1566                         (as_a<dt_operand *> (n2))->op);
1567   else if (n1->type == dt_node::DT_MATCH)
1568     return ((as_a<dt_operand *> (n1))->match_dop
1569             == (as_a<dt_operand *> (n2))->match_dop);
1570   return false;
1571 }
1572
1573 /* Search OPS for a decision tree node like P and return it if found.  */
1574
1575 dt_node *
1576 decision_tree::find_node (vec<dt_node *>& ops, dt_node *p)
1577 {
1578   /* We can merge adjacent DT_TRUE.  */
1579   if (p->type == dt_node::DT_TRUE
1580       && !ops.is_empty ()
1581       && ops.last ()->type == dt_node::DT_TRUE)
1582     return ops.last ();
1583   for (int i = ops.length () - 1; i >= 0; --i)
1584     {
1585       /* But we can't merge across DT_TRUE nodes as they serve as
1586          pattern order barriers to make sure that patterns apply
1587          in order of appearance in case multiple matches are possible.  */
1588       if (ops[i]->type == dt_node::DT_TRUE)
1589         return NULL;
1590       if (decision_tree::cmp_node (ops[i], p))
1591         return ops[i];
1592     }
1593   return NULL;
1594 }
1595
1596 /* Append N to the decision tree if it there is not already an existing
1597    identical child.  */
1598
1599 dt_node *
1600 dt_node::append_node (dt_node *n)
1601 {
1602   dt_node *kid;
1603
1604   kid = decision_tree::find_node (kids, n);
1605   if (kid)
1606     return kid;
1607
1608   kids.safe_push (n);
1609   n->level = this->level + 1;
1610
1611   return n;
1612 }
1613
1614 /* Append OP to the decision tree.  */
1615
1616 dt_node *
1617 dt_node::append_op (operand *op, dt_node *parent, unsigned pos)
1618 {
1619   dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1620   dt_operand *n = new dt_operand (DT_OPERAND, op, 0, parent_, pos);
1621   return append_node (n);
1622 }
1623
1624 /* Append a DT_TRUE decision tree node.  */
1625
1626 dt_node *
1627 dt_node::append_true_op (dt_node *parent, unsigned pos)
1628 {
1629   dt_operand *parent_ = safe_as_a<dt_operand *> (parent);
1630   dt_operand *n = new dt_operand (DT_TRUE, 0, 0, parent_, pos);
1631   return append_node (n);
1632 }
1633
1634 /* Append a DT_MATCH decision tree node.  */
1635
1636 dt_node *
1637 dt_node::append_match_op (dt_operand *match_dop, dt_node *parent, unsigned pos)
1638 {
1639   dt_operand *parent_ = as_a<dt_operand *> (parent);
1640   dt_operand *n = new dt_operand (DT_MATCH, 0, match_dop, parent_, pos);
1641   return append_node (n);
1642 }
1643
1644 /* Append S to the decision tree.  */
1645
1646 dt_node *
1647 dt_node::append_simplify (simplify *s, unsigned pattern_no,
1648                           dt_operand **indexes)
1649 {
1650   dt_simplify *n = new dt_simplify (s, pattern_no, indexes);
1651   for (unsigned i = 0; i < kids.length (); ++i)
1652     if (dt_simplify *s2 = dyn_cast <dt_simplify *> (kids[i]))
1653       {
1654         warning_at (s->match->location, "duplicate pattern");
1655         warning_at (s2->s->match->location, "previous pattern defined here");
1656         print_operand (s->match, stderr);
1657         fprintf (stderr, "\n");
1658       }
1659   return append_node (n);
1660 }
1661
1662 /* Analyze the node and its children.  */
1663
1664 void
1665 dt_node::analyze (sinfo_map_t &map)
1666 {
1667   num_leafs = 0;
1668   total_size = 1;
1669   max_level = level;
1670
1671   if (type == DT_SIMPLIFY)
1672     {
1673       /* Populate the map of equivalent simplifies.  */
1674       dt_simplify *s = as_a <dt_simplify *> (this);
1675       bool existed;
1676       sinfo *&si = map.get_or_insert (s, &existed);
1677       if (!existed)
1678         {
1679           si = new sinfo;
1680           si->s = s;
1681           si->cnt = 1;
1682           si->fname = NULL;
1683         }
1684       else
1685         si->cnt++;
1686       s->info = si;
1687       num_leafs = 1;
1688       return;
1689     }
1690
1691   for (unsigned i = 0; i < kids.length (); ++i)
1692     {
1693       kids[i]->analyze (map);
1694       num_leafs += kids[i]->num_leafs;
1695       total_size += kids[i]->total_size;
1696       max_level = MAX (max_level, kids[i]->max_level);
1697     }
1698 }
1699
1700 /* Insert O into the decision tree and return the decision tree node found
1701    or created.  */
1702
1703 dt_node *
1704 decision_tree::insert_operand (dt_node *p, operand *o, dt_operand **indexes,
1705                                unsigned pos, dt_node *parent)
1706 {
1707   dt_node *q, *elm = 0;
1708
1709   if (capture *c = dyn_cast<capture *> (o))
1710     {
1711       unsigned capt_index = c->where;
1712
1713       if (indexes[capt_index] == 0)
1714         {
1715           if (c->what)
1716             q = insert_operand (p, c->what, indexes, pos, parent);
1717           else
1718             {
1719               q = elm = p->append_true_op (parent, pos);
1720               goto at_assert_elm;
1721             }
1722           // get to the last capture
1723           for (operand *what = c->what;
1724                what && is_a<capture *> (what);
1725                c = as_a<capture *> (what), what = c->what)
1726             ;
1727
1728           if (!c->what)
1729             {
1730               unsigned cc_index = c->where;
1731               dt_operand *match_op = indexes[cc_index];
1732
1733               dt_operand temp (dt_node::DT_TRUE, 0, 0);
1734               elm = decision_tree::find_node (p->kids, &temp);
1735
1736               if (elm == 0)
1737                 {
1738                   dt_operand temp (dt_node::DT_MATCH, 0, match_op);
1739                   elm = decision_tree::find_node (p->kids, &temp);
1740                 }
1741             }
1742           else
1743             {
1744               dt_operand temp (dt_node::DT_OPERAND, c->what, 0);
1745               elm = decision_tree::find_node (p->kids, &temp);
1746             }
1747
1748 at_assert_elm:
1749           gcc_assert (elm->type == dt_node::DT_TRUE
1750                       || elm->type == dt_node::DT_OPERAND
1751                       || elm->type == dt_node::DT_MATCH);
1752           indexes[capt_index] = static_cast<dt_operand *> (elm);
1753           return q;
1754         }
1755       else
1756         {
1757           p = p->append_match_op (indexes[capt_index], parent, pos);
1758           if (c->what)
1759             return insert_operand (p, c->what, indexes, 0, p);
1760           else
1761             return p;
1762         }
1763     }
1764   p = p->append_op (o, parent, pos);
1765   q = p;
1766
1767   if (expr *e = dyn_cast <expr *>(o))
1768     {
1769       for (unsigned i = 0; i < e->ops.length (); ++i)
1770         q = decision_tree::insert_operand (q, e->ops[i], indexes, i, p);
1771     }
1772
1773   return q;
1774 }
1775
1776 /* Insert S into the decision tree.  */
1777
1778 void
1779 decision_tree::insert (struct simplify *s, unsigned pattern_no)
1780 {
1781   dt_operand **indexes = XCNEWVEC (dt_operand *, s->capture_max + 1);
1782   dt_node *p = decision_tree::insert_operand (root, s->match, indexes);
1783   p->append_simplify (s, pattern_no, indexes);
1784 }
1785
1786 /* Debug functions to dump the decision tree.  */
1787
1788 DEBUG_FUNCTION void
1789 decision_tree::print_node (dt_node *p, FILE *f, unsigned indent)
1790 {
1791   if (p->type == dt_node::DT_NODE)
1792     fprintf (f, "root");
1793   else
1794     {
1795       fprintf (f, "|");
1796       for (unsigned i = 0; i < indent; i++)
1797         fprintf (f, "-");
1798
1799       if (p->type == dt_node::DT_OPERAND)
1800         {
1801           dt_operand *dop = static_cast<dt_operand *>(p);
1802           print_operand (dop->op, f, true);
1803         }
1804       else if (p->type == dt_node::DT_TRUE)
1805         fprintf (f, "true");
1806       else if (p->type == dt_node::DT_MATCH)
1807         fprintf (f, "match (%p)", (void *)((as_a<dt_operand *>(p))->match_dop));
1808       else if (p->type == dt_node::DT_SIMPLIFY)
1809         {
1810           dt_simplify *s = static_cast<dt_simplify *> (p);
1811           fprintf (f, "simplify_%u { ", s->pattern_no);
1812           for (int i = 0; i <= s->s->capture_max; ++i)
1813             fprintf (f, "%p, ", (void *) s->indexes[i]);
1814           fprintf (f, " } ");
1815         }
1816     }
1817
1818   fprintf (stderr, " (%p), %u, %u\n", (void *) p, p->level, p->kids.length ());
1819
1820   for (unsigned i = 0; i < p->kids.length (); ++i)
1821     decision_tree::print_node (p->kids[i], f, indent + 2);
1822 }
1823
1824 DEBUG_FUNCTION void
1825 decision_tree::print (FILE *f)
1826 {
1827   return decision_tree::print_node (root, f);
1828 }
1829
1830
1831 /* For GENERIC we have to take care of wrapping multiple-used
1832    expressions with side-effects in save_expr and preserve side-effects
1833    of expressions with omit_one_operand.  Analyze captures in
1834    match, result and with expressions and perform early-outs
1835    on the outermost match expression operands for cases we cannot
1836    handle.  */
1837
1838 struct capture_info
1839 {
1840   capture_info (simplify *s, operand *, bool);
1841   void walk_match (operand *o, unsigned toplevel_arg, bool, bool);
1842   bool walk_result (operand *o, bool, operand *);
1843   void walk_c_expr (c_expr *);
1844
1845   struct cinfo
1846     {
1847       bool expr_p;
1848       bool cse_p;
1849       bool force_no_side_effects_p;
1850       bool force_single_use;
1851       bool cond_expr_cond_p;
1852       unsigned long toplevel_msk;
1853       unsigned match_use_count;
1854       unsigned result_use_count;
1855       unsigned same_as;
1856       capture *c;
1857     };
1858
1859   auto_vec<cinfo> info;
1860   unsigned long force_no_side_effects;
1861   bool gimple;
1862 };
1863
1864 /* Analyze captures in S.  */
1865
1866 capture_info::capture_info (simplify *s, operand *result, bool gimple_)
1867 {
1868   gimple = gimple_;
1869
1870   expr *e;
1871   if (s->kind == simplify::MATCH)
1872     {
1873       force_no_side_effects = -1;
1874       return;
1875     }
1876
1877   force_no_side_effects = 0;
1878   info.safe_grow_cleared (s->capture_max + 1);
1879   for (int i = 0; i <= s->capture_max; ++i)
1880     info[i].same_as = i;
1881
1882   e = as_a <expr *> (s->match);
1883   for (unsigned i = 0; i < e->ops.length (); ++i)
1884     walk_match (e->ops[i], i,
1885                 (i != 0 && *e->operation == COND_EXPR)
1886                 || *e->operation == TRUTH_ANDIF_EXPR
1887                 || *e->operation == TRUTH_ORIF_EXPR,
1888                 i == 0
1889                 && (*e->operation == COND_EXPR
1890                     || *e->operation == VEC_COND_EXPR));
1891
1892   walk_result (s->result, false, result);
1893 }
1894
1895 /* Analyze captures in the match expression piece O.  */
1896
1897 void
1898 capture_info::walk_match (operand *o, unsigned toplevel_arg,
1899                           bool conditional_p, bool cond_expr_cond_p)
1900 {
1901   if (capture *c = dyn_cast <capture *> (o))
1902     {
1903       unsigned where = c->where;
1904       info[where].match_use_count++;
1905       info[where].toplevel_msk |= 1 << toplevel_arg;
1906       info[where].force_no_side_effects_p |= conditional_p;
1907       info[where].cond_expr_cond_p |= cond_expr_cond_p;
1908       if (!info[where].c)
1909         info[where].c = c;
1910       if (!c->what)
1911         return;
1912       /* Recurse to exprs and captures.  */
1913       if (is_a <capture *> (c->what)
1914           || is_a <expr *> (c->what))
1915         walk_match (c->what, toplevel_arg, conditional_p, false);
1916       /* We need to look past multiple captures to find a captured
1917          expression as with conditional converts two captures
1918          can be collapsed onto the same expression.  Also collect
1919          what captures capture the same thing.  */
1920       while (c->what && is_a <capture *> (c->what))
1921         {
1922           c = as_a <capture *> (c->what);
1923           if (info[c->where].same_as != c->where
1924               && info[c->where].same_as != info[where].same_as)
1925             fatal_at (c->location, "cannot handle this collapsed capture");
1926           info[c->where].same_as = info[where].same_as;
1927         }
1928       /* Mark expr (non-leaf) captures and forced single-use exprs.  */
1929       expr *e;
1930       if (c->what
1931           && (e = dyn_cast <expr *> (c->what)))
1932         {
1933           info[where].expr_p = true;
1934           info[where].force_single_use |= e->force_single_use;
1935         }
1936     }
1937   else if (expr *e = dyn_cast <expr *> (o))
1938     {
1939       for (unsigned i = 0; i < e->ops.length (); ++i)
1940         {
1941           bool cond_p = conditional_p;
1942           bool cond_expr_cond_p = false;
1943           if (i != 0 && *e->operation == COND_EXPR)
1944             cond_p = true;
1945           else if (*e->operation == TRUTH_ANDIF_EXPR
1946                    || *e->operation == TRUTH_ORIF_EXPR)
1947             cond_p = true;
1948           if (i == 0
1949               && (*e->operation == COND_EXPR
1950                   || *e->operation == VEC_COND_EXPR))
1951             cond_expr_cond_p = true;
1952           walk_match (e->ops[i], toplevel_arg, cond_p, cond_expr_cond_p);
1953         }
1954     }
1955   else if (is_a <predicate *> (o))
1956     {
1957       /* Mark non-captured leafs toplevel arg for checking.  */
1958       force_no_side_effects |= 1 << toplevel_arg;
1959       if (verbose >= 1
1960           && !gimple)
1961         warning_at (o->location,
1962                     "forcing no side-effects on possibly lost leaf");
1963     }
1964   else
1965     gcc_unreachable ();
1966 }
1967
1968 /* Analyze captures in the result expression piece O.  Return true
1969    if RESULT was visited in one of the children.  Only visit
1970    non-if/with children if they are rooted on RESULT.  */
1971
1972 bool
1973 capture_info::walk_result (operand *o, bool conditional_p, operand *result)
1974 {
1975   if (capture *c = dyn_cast <capture *> (o))
1976     {
1977       unsigned where = info[c->where].same_as;
1978       info[where].result_use_count++;
1979       /* If we substitute an expression capture we don't know
1980          which captures this will end up using (well, we don't
1981          compute that).  Force the uses to be side-effect free
1982          which means forcing the toplevels that reach the
1983          expression side-effect free.  */
1984       if (info[where].expr_p)
1985         force_no_side_effects |= info[where].toplevel_msk;
1986       /* Mark CSE capture uses as forced to have no side-effects. */
1987       if (c->what
1988           && is_a <expr *> (c->what))
1989         {
1990           info[where].cse_p = true;
1991           walk_result (c->what, true, result);
1992         }
1993     }
1994   else if (expr *e = dyn_cast <expr *> (o))
1995     {
1996       id_base *opr = e->operation;
1997       if (user_id *uid = dyn_cast <user_id *> (opr))
1998         opr = uid->substitutes[0];
1999       for (unsigned i = 0; i < e->ops.length (); ++i)
2000         {
2001           bool cond_p = conditional_p;
2002           if (i != 0 && *e->operation == COND_EXPR)
2003             cond_p = true;
2004           else if (*e->operation == TRUTH_ANDIF_EXPR
2005                    || *e->operation == TRUTH_ORIF_EXPR)
2006             cond_p = true;
2007           walk_result (e->ops[i], cond_p, result);
2008         }
2009     }
2010   else if (if_expr *e = dyn_cast <if_expr *> (o))
2011     {
2012       /* 'if' conditions should be all fine.  */
2013       if (e->trueexpr == result)
2014         {
2015           walk_result (e->trueexpr, false, result);
2016           return true;
2017         }
2018       if (e->falseexpr == result)
2019         {
2020           walk_result (e->falseexpr, false, result);
2021           return true;
2022         }
2023       bool res = false;
2024       if (is_a <if_expr *> (e->trueexpr)
2025           || is_a <with_expr *> (e->trueexpr))
2026         res |= walk_result (e->trueexpr, false, result);
2027       if (e->falseexpr
2028           && (is_a <if_expr *> (e->falseexpr)
2029               || is_a <with_expr *> (e->falseexpr)))
2030         res |= walk_result (e->falseexpr, false, result);
2031       return res;
2032     }
2033   else if (with_expr *e = dyn_cast <with_expr *> (o))
2034     {
2035       bool res = (e->subexpr == result);
2036       if (res
2037           || is_a <if_expr *> (e->subexpr)
2038           || is_a <with_expr *> (e->subexpr))
2039         res |= walk_result (e->subexpr, false, result);
2040       if (res)
2041         walk_c_expr (e->with);
2042       return res;
2043     }
2044   else if (c_expr *e = dyn_cast <c_expr *> (o))
2045     walk_c_expr (e);
2046   else
2047     gcc_unreachable ();
2048
2049   return false;
2050 }
2051
2052 /* Look for captures in the C expr E.  */
2053
2054 void
2055 capture_info::walk_c_expr (c_expr *e)
2056 {
2057   /* Give up for C exprs mentioning captures not inside TREE_TYPE,
2058      TREE_REAL_CST, TREE_CODE or a predicate where they cannot
2059      really escape through.  */
2060   unsigned p_depth = 0;
2061   for (unsigned i = 0; i < e->code.length (); ++i)
2062     {
2063       const cpp_token *t = &e->code[i];
2064       const cpp_token *n = i < e->code.length () - 1 ? &e->code[i+1] : NULL;
2065       id_base *id;
2066       if (t->type == CPP_NAME
2067           && (strcmp ((const char *)CPP_HASHNODE
2068                       (t->val.node.node)->ident.str, "TREE_TYPE") == 0
2069               || strcmp ((const char *)CPP_HASHNODE
2070                          (t->val.node.node)->ident.str, "TREE_CODE") == 0
2071               || strcmp ((const char *)CPP_HASHNODE
2072                          (t->val.node.node)->ident.str, "TREE_REAL_CST") == 0
2073               || ((id = get_operator ((const char *)CPP_HASHNODE
2074                                       (t->val.node.node)->ident.str))
2075                   && is_a <predicate_id *> (id)))
2076           && n->type == CPP_OPEN_PAREN)
2077         p_depth++;
2078       else if (t->type == CPP_CLOSE_PAREN
2079                && p_depth > 0)
2080         p_depth--;
2081       else if (p_depth == 0
2082                && t->type == CPP_ATSIGN
2083                && (n->type == CPP_NUMBER
2084                    || n->type == CPP_NAME)
2085                && !(n->flags & PREV_WHITE))
2086         {
2087           const char *id;
2088           if (n->type == CPP_NUMBER)
2089             id = (const char *)n->val.str.text;
2090           else
2091             id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
2092           unsigned where = *e->capture_ids->get(id);
2093           info[info[where].same_as].force_no_side_effects_p = true;
2094           if (verbose >= 1
2095               && !gimple)
2096             warning_at (t, "capture escapes");
2097         }
2098     }
2099 }
2100
2101
2102 /* Code generation off the decision tree and the refered AST nodes.  */
2103
2104 bool
2105 is_conversion (id_base *op)
2106 {
2107   return (*op == CONVERT_EXPR
2108           || *op == NOP_EXPR
2109           || *op == FLOAT_EXPR
2110           || *op == FIX_TRUNC_EXPR
2111           || *op == VIEW_CONVERT_EXPR);
2112 }
2113
2114 /* Get the type to be used for generating operands of OP from the
2115    various sources.  */
2116
2117 static const char *
2118 get_operand_type (id_base *op, const char *in_type,
2119                   const char *expr_type,
2120                   const char *other_oprnd_type)
2121 {
2122   /* Generally operands whose type does not match the type of the
2123      expression generated need to know their types but match and
2124      thus can fall back to 'other_oprnd_type'.  */
2125   if (is_conversion (op))
2126     return other_oprnd_type;
2127   else if (*op == REALPART_EXPR
2128            || *op == IMAGPART_EXPR)
2129     return other_oprnd_type;
2130   else if (is_a <operator_id *> (op)
2131            && strcmp (as_a <operator_id *> (op)->tcc, "tcc_comparison") == 0)
2132     return other_oprnd_type;
2133   else
2134     {
2135       /* Otherwise all types should match - choose one in order of
2136          preference.  */
2137       if (expr_type)
2138         return expr_type;
2139       else if (in_type)
2140         return in_type;
2141       else
2142         return other_oprnd_type;
2143     }
2144 }
2145
2146 /* Generate transform code for an expression.  */
2147
2148 void
2149 expr::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
2150                      int depth, const char *in_type, capture_info *cinfo,
2151                      dt_operand **indexes, int)
2152 {
2153   id_base *opr = operation;
2154   /* When we delay operator substituting during lowering of fors we
2155      make sure that for code-gen purposes the effects of each substitute
2156      are the same.  Thus just look at that.  */
2157   if (user_id *uid = dyn_cast <user_id *> (opr))
2158     opr = uid->substitutes[0];
2159
2160   bool conversion_p = is_conversion (opr);
2161   const char *type = expr_type;
2162   char optype[64];
2163   if (type)
2164     /* If there was a type specification in the pattern use it.  */
2165     ;
2166   else if (conversion_p)
2167     /* For conversions we need to build the expression using the
2168        outer type passed in.  */
2169     type = in_type;
2170   else if (*opr == REALPART_EXPR
2171            || *opr == IMAGPART_EXPR)
2172     {
2173       /* __real and __imag use the component type of its operand.  */
2174       sprintf (optype, "TREE_TYPE (TREE_TYPE (ops%d[0]))", depth);
2175       type = optype;
2176     }
2177   else if (is_a <operator_id *> (opr)
2178            && !strcmp (as_a <operator_id *> (opr)->tcc, "tcc_comparison"))
2179     {
2180       /* comparisons use boolean_type_node (or what gets in), but
2181          their operands need to figure out the types themselves.  */
2182       sprintf (optype, "boolean_type_node");
2183       type = optype;
2184     }
2185   else if (*opr == COND_EXPR
2186            || *opr == VEC_COND_EXPR)
2187     {
2188       /* Conditions are of the same type as their first alternative.  */
2189       sprintf (optype, "TREE_TYPE (ops%d[1])", depth);
2190       type = optype;
2191     }
2192   else
2193     {
2194       /* Other operations are of the same type as their first operand.  */
2195       sprintf (optype, "TREE_TYPE (ops%d[0])", depth);
2196       type = optype;
2197     }
2198   if (!type)
2199     fatal_at (location, "cannot determine type of operand");
2200
2201   fprintf_indent (f, indent, "{\n");
2202   indent += 2;
2203   fprintf_indent (f, indent, "tree ops%d[%u], res;\n", depth, ops.length ());
2204   char op0type[64];
2205   snprintf (op0type, 64, "TREE_TYPE (ops%d[0])", depth);
2206   for (unsigned i = 0; i < ops.length (); ++i)
2207     {
2208       char dest[32];
2209       snprintf (dest, 32, "ops%d[%u]", depth, i);
2210       const char *optype
2211         = get_operand_type (opr, in_type, expr_type,
2212                             i == 0 ? NULL : op0type);
2213       ops[i]->gen_transform (f, indent, dest, gimple, depth + 1, optype,
2214                              cinfo, indexes,
2215                              (*opr == COND_EXPR
2216                               || *opr == VEC_COND_EXPR) && i == 0 ? 1 : 2);
2217     }
2218
2219   const char *opr_name;
2220   if (*operation == CONVERT_EXPR)
2221     opr_name = "NOP_EXPR";
2222   else
2223     opr_name = operation->id;
2224
2225   if (gimple)
2226     {
2227       if (*opr == CONVERT_EXPR)
2228         {
2229           fprintf_indent (f, indent,
2230                           "if (%s != TREE_TYPE (ops%d[0])\n",
2231                           type, depth);
2232           fprintf_indent (f, indent,
2233                           "    && !useless_type_conversion_p (%s, TREE_TYPE (ops%d[0])))\n",
2234                           type, depth);
2235           fprintf_indent (f, indent + 2, "{\n");
2236           indent += 4;
2237         }
2238       /* ???  Building a stmt can fail for various reasons here, seq being
2239          NULL or the stmt referencing SSA names occuring in abnormal PHIs.
2240          So if we fail here we should continue matching other patterns.  */
2241       fprintf_indent (f, indent, "code_helper tem_code = %s;\n", opr_name);
2242       fprintf_indent (f, indent, "tree tem_ops[3] = { ");
2243       for (unsigned i = 0; i < ops.length (); ++i)
2244         fprintf (f, "ops%d[%u]%s", depth, i,
2245                  i == ops.length () - 1 ? " };\n" : ", ");
2246       fprintf_indent (f, indent,
2247                       "gimple_resimplify%d (lseq, &tem_code, %s, tem_ops, valueize);\n",
2248                       ops.length (), type);
2249       fprintf_indent (f, indent,
2250                       "res = maybe_push_res_to_seq (tem_code, %s, tem_ops, lseq);\n",
2251                       type);
2252       fprintf_indent (f, indent,
2253                       "if (!res) return false;\n");
2254       if (*opr == CONVERT_EXPR)
2255         {
2256           indent -= 4;
2257           fprintf_indent (f, indent, "  }\n");
2258           fprintf_indent (f, indent, "else\n");
2259           fprintf_indent (f, indent, "  res = ops%d[0];\n", depth);
2260         }
2261     }
2262   else
2263     {
2264       if (*opr == CONVERT_EXPR)
2265         {
2266           fprintf_indent (f, indent, "if (TREE_TYPE (ops%d[0]) != %s)\n",
2267                           depth, type);
2268           indent += 2;
2269         }
2270       if (opr->kind == id_base::CODE)
2271         fprintf_indent (f, indent, "res = fold_build%d_loc (loc, %s, %s",
2272                         ops.length(), opr_name, type);
2273       else
2274         {
2275           fprintf_indent (f, indent, "{\n");
2276           fprintf_indent (f, indent, "  res = maybe_build_call_expr_loc (loc, "
2277                           "%s, %s, %d", opr_name, type, ops.length());
2278         }
2279       for (unsigned i = 0; i < ops.length (); ++i)
2280         fprintf (f, ", ops%d[%u]", depth, i);
2281       fprintf (f, ");\n");
2282       if (opr->kind != id_base::CODE)
2283         {
2284           fprintf_indent (f, indent, "  if (!res)\n");
2285           fprintf_indent (f, indent, "    return NULL_TREE;\n");
2286           fprintf_indent (f, indent, "}\n");
2287         }
2288       if (*opr == CONVERT_EXPR)
2289         {
2290           indent -= 2;
2291           fprintf_indent (f, indent, "else\n");
2292           fprintf_indent (f, indent, "  res = ops%d[0];\n", depth);
2293         }
2294     }
2295   fprintf_indent (f, indent, "%s = res;\n", dest);
2296   indent -= 2;
2297   fprintf_indent (f, indent, "}\n");
2298 }
2299
2300 /* Generate code for a c_expr which is either the expression inside
2301    an if statement or a sequence of statements which computes a
2302    result to be stored to DEST.  */
2303
2304 void
2305 c_expr::gen_transform (FILE *f, int indent, const char *dest,
2306                        bool, int, const char *, capture_info *,
2307                        dt_operand **, int)
2308 {
2309   if (dest && nr_stmts == 1)
2310     fprintf_indent (f, indent, "%s = ", dest);
2311
2312   unsigned stmt_nr = 1;
2313   for (unsigned i = 0; i < code.length (); ++i)
2314     {
2315       const cpp_token *token = &code[i];
2316
2317       /* Replace captures for code-gen.  */
2318       if (token->type == CPP_ATSIGN)
2319         {
2320           const cpp_token *n = &code[i+1];
2321           if ((n->type == CPP_NUMBER
2322                || n->type == CPP_NAME)
2323               && !(n->flags & PREV_WHITE))
2324             {
2325               if (token->flags & PREV_WHITE)
2326                 fputc (' ', f);
2327               const char *id;
2328               if (n->type == CPP_NUMBER)
2329                 id = (const char *)n->val.str.text;
2330               else
2331                 id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
2332               unsigned *cid = capture_ids->get (id);
2333               if (!cid)
2334                 fatal_at (token, "unknown capture id");
2335               fprintf (f, "captures[%u]", *cid);
2336               ++i;
2337               continue;
2338             }
2339         }
2340
2341       if (token->flags & PREV_WHITE)
2342         fputc (' ', f);
2343
2344       if (token->type == CPP_NAME)
2345         {
2346           const char *id = (const char *) NODE_NAME (token->val.node.node);
2347           unsigned j;
2348           for (j = 0; j < ids.length (); ++j)
2349             {
2350             if (strcmp (id, ids[j].id) == 0)
2351               {
2352                 fprintf (f, "%s", ids[j].oper);
2353                 break;
2354               }
2355             }
2356           if (j < ids.length ())
2357             continue;
2358         }
2359
2360       /* Output the token as string.  */
2361       char *tk = (char *)cpp_token_as_text (r, token);
2362       fputs (tk, f);
2363
2364       if (token->type == CPP_SEMICOLON)
2365         {
2366           stmt_nr++;
2367           fputc ('\n', f);
2368           if (dest && stmt_nr == nr_stmts)
2369             fprintf_indent (f, indent, "%s = ", dest);
2370         }
2371     }
2372 }
2373
2374 /* Generate transform code for a capture.  */
2375
2376 void
2377 capture::gen_transform (FILE *f, int indent, const char *dest, bool gimple,
2378                         int depth, const char *in_type, capture_info *cinfo,
2379                         dt_operand **indexes, int cond_handling)
2380 {
2381   if (what && is_a<expr *> (what))
2382     {
2383       if (indexes[where] == 0)
2384         {
2385           char buf[20];
2386           sprintf (buf, "captures[%u]", where);
2387           what->gen_transform (f, indent, buf, gimple, depth, in_type,
2388                                cinfo, NULL);
2389         }
2390     }
2391
2392   fprintf_indent (f, indent, "%s = captures[%u];\n", dest, where);
2393
2394   /* ???  Stupid tcc_comparison GENERIC trees in COND_EXPRs.  Deal
2395      with substituting a capture of that.  */
2396   if (gimple
2397       && cond_handling != 0
2398       && cinfo->info[where].cond_expr_cond_p)
2399     {
2400       /* If substituting into a cond_expr condition, unshare.  */
2401       if (cond_handling == 1)
2402         fprintf_indent (f, indent, "%s = unshare_expr (%s);\n", dest, dest);
2403       /* If substituting elsewhere we might need to decompose it.  */
2404       else if (cond_handling == 2)
2405         {
2406           /* ???  Returning false here will also not allow any other patterns
2407              to match unless this generator was split out.  */
2408           fprintf_indent (f, indent, "if (COMPARISON_CLASS_P (%s))\n", dest);
2409           fprintf_indent (f, indent, "  {\n");
2410           fprintf_indent (f, indent, "    if (!seq) return false;\n");
2411           fprintf_indent (f, indent, "    %s = gimple_build (seq,"
2412                           " TREE_CODE (%s),"
2413                           " TREE_TYPE (%s), TREE_OPERAND (%s, 0),"
2414                           " TREE_OPERAND (%s, 1));\n",
2415                           dest, dest, dest, dest, dest);
2416           fprintf_indent (f, indent, "  }\n");
2417         }
2418     }
2419 }
2420
2421 /* Return the name of the operand representing the decision tree node.
2422    Use NAME as space to generate it.  */
2423
2424 char *
2425 dt_operand::get_name (char *name)
2426 {
2427   if (!parent)
2428     sprintf (name, "t");
2429   else if (parent->level == 1)
2430     sprintf (name, "op%u", pos);
2431   else if (parent->type == dt_node::DT_MATCH)
2432     return parent->get_name (name);
2433   else
2434     sprintf (name, "o%u%u", parent->level, pos);
2435   return name;
2436 }
2437
2438 /* Fill NAME with the operand name at position POS.  */
2439
2440 void
2441 dt_operand::gen_opname (char *name, unsigned pos)
2442 {
2443   if (!parent)
2444     sprintf (name, "op%u", pos);
2445   else
2446     sprintf (name, "o%u%u", level, pos);
2447 }
2448
2449 /* Generate matching code for the decision tree operand which is
2450    a predicate.  */
2451
2452 unsigned
2453 dt_operand::gen_predicate (FILE *f, int indent, const char *opname, bool gimple)
2454 {
2455   predicate *p = as_a <predicate *> (op);
2456
2457   if (p->p->matchers.exists ())
2458     {
2459       /* If this is a predicate generated from a pattern mangle its
2460          name and pass on the valueize hook.  */
2461       if (gimple)
2462         fprintf_indent (f, indent, "if (gimple_%s (%s, valueize))\n",
2463                         p->p->id, opname);
2464       else
2465         fprintf_indent (f, indent, "if (tree_%s (%s))\n", p->p->id, opname);
2466     }
2467   else
2468     fprintf_indent (f, indent, "if (%s (%s))\n", p->p->id, opname);
2469   fprintf_indent (f, indent + 2, "{\n");
2470   return 1;
2471 }
2472
2473 /* Generate matching code for the decision tree operand which is
2474    a capture-match.  */
2475
2476 unsigned
2477 dt_operand::gen_match_op (FILE *f, int indent, const char *opname)
2478 {
2479   char match_opname[20];
2480   match_dop->get_name (match_opname);
2481   fprintf_indent (f, indent, "if (%s == %s || operand_equal_p (%s, %s, 0))\n",
2482                   opname, match_opname, opname, match_opname);
2483   fprintf_indent (f, indent + 2, "{\n");
2484   return 1;
2485 }
2486
2487 /* Generate GIMPLE matching code for the decision tree operand.  */
2488
2489 unsigned
2490 dt_operand::gen_gimple_expr (FILE *f, int indent)
2491 {
2492   expr *e = static_cast<expr *> (op);
2493   id_base *id = e->operation;
2494   unsigned n_ops = e->ops.length ();
2495
2496   for (unsigned i = 0; i < n_ops; ++i)
2497     {
2498       char child_opname[20];
2499       gen_opname (child_opname, i);
2500
2501       if (id->kind == id_base::CODE)
2502         {
2503           if (e->is_generic
2504               || *id == REALPART_EXPR || *id == IMAGPART_EXPR
2505               || *id == BIT_FIELD_REF || *id == VIEW_CONVERT_EXPR)
2506             {
2507               /* ???  If this is a memory operation we can't (and should not)
2508                  match this.  The only sensible operand types are
2509                  SSA names and invariants.  */
2510               fprintf_indent (f, indent,
2511                               "tree %s = TREE_OPERAND (gimple_assign_rhs1 (def), %i);\n",
2512                               child_opname, i);
2513               fprintf_indent (f, indent,
2514                               "if ((TREE_CODE (%s) == SSA_NAME\n",
2515                               child_opname);
2516               fprintf_indent (f, indent,
2517                               "     || is_gimple_min_invariant (%s))\n",
2518                               child_opname);
2519               fprintf_indent (f, indent,
2520                               "    && (%s = do_valueize (valueize, %s)))\n",
2521                               child_opname, child_opname);
2522               fprintf_indent (f, indent,
2523                               "  {\n");
2524               indent += 4;
2525               continue;
2526             }
2527           else
2528             fprintf_indent (f, indent,
2529                             "tree %s = gimple_assign_rhs%u (def);\n",
2530                             child_opname, i + 1);
2531         }
2532       else
2533         fprintf_indent (f, indent,
2534                         "tree %s = gimple_call_arg (def, %u);\n",
2535                         child_opname, i);
2536       fprintf_indent (f, indent,
2537                       "if ((%s = do_valueize (valueize, %s)))\n",
2538                       child_opname, child_opname);
2539       fprintf_indent (f, indent, "  {\n");
2540       indent += 4;
2541     }
2542   /* While the toplevel operands are canonicalized by the caller
2543      after valueizing operands of sub-expressions we have to
2544      re-canonicalize operand order.  */
2545   if (operator_id *code = dyn_cast <operator_id *> (id))
2546     {
2547       /* ???  We can't canonicalize tcc_comparison operands here
2548          because that requires changing the comparison code which
2549          we already matched...  */
2550       if (commutative_tree_code (code->code)
2551           || commutative_ternary_tree_code (code->code))
2552         {
2553           char child_opname0[20], child_opname1[20];
2554           gen_opname (child_opname0, 0);
2555           gen_opname (child_opname1, 1);
2556           fprintf_indent (f, indent,
2557                           "if (tree_swap_operands_p (%s, %s, false))\n",
2558                           child_opname0, child_opname1);
2559           fprintf_indent (f, indent,
2560                           "  std::swap (%s, %s);\n",
2561                           child_opname0, child_opname1);
2562         }
2563     }
2564
2565   return n_ops;
2566 }
2567
2568 /* Generate GENERIC matching code for the decision tree operand.  */
2569
2570 unsigned
2571 dt_operand::gen_generic_expr (FILE *f, int indent, const char *opname)
2572 {
2573   expr *e = static_cast<expr *> (op);
2574   unsigned n_ops = e->ops.length ();
2575
2576   for (unsigned i = 0; i < n_ops; ++i)
2577     {
2578       char child_opname[20];
2579       gen_opname (child_opname, i);
2580
2581       if (e->operation->kind == id_base::CODE)
2582         fprintf_indent (f, indent, "tree %s = TREE_OPERAND (%s, %u);\n",
2583                         child_opname, opname, i);
2584       else
2585         fprintf_indent (f, indent, "tree %s = CALL_EXPR_ARG (%s, %u);\n",
2586                         child_opname, opname, i);
2587     }
2588
2589   return 0;
2590 }
2591
2592 /* Generate matching code for the children of the decision tree node.  */
2593
2594 void
2595 dt_node::gen_kids (FILE *f, int indent, bool gimple)
2596 {
2597   auto_vec<dt_operand *> gimple_exprs;
2598   auto_vec<dt_operand *> generic_exprs;
2599   auto_vec<dt_operand *> fns;
2600   auto_vec<dt_operand *> generic_fns;
2601   auto_vec<dt_operand *> preds;
2602   auto_vec<dt_node *> others;
2603
2604   for (unsigned i = 0; i < kids.length (); ++i)
2605     {
2606       if (kids[i]->type == dt_node::DT_OPERAND)
2607         {
2608           dt_operand *op = as_a<dt_operand *> (kids[i]);
2609           if (expr *e = dyn_cast <expr *> (op->op))
2610             {
2611               if (e->ops.length () == 0
2612                   && (!gimple || !(*e->operation == CONSTRUCTOR)))
2613                 generic_exprs.safe_push (op);
2614               else if (e->operation->kind == id_base::FN)
2615                 {
2616                   if (gimple)
2617                     fns.safe_push (op);
2618                   else
2619                     generic_fns.safe_push (op);
2620                 }
2621               else if (e->operation->kind == id_base::PREDICATE)
2622                 preds.safe_push (op);
2623               else
2624                 {
2625                   if (gimple && !e->is_generic)
2626                     gimple_exprs.safe_push (op);
2627                   else
2628                     generic_exprs.safe_push (op);
2629                 }
2630             }
2631           else if (op->op->type == operand::OP_PREDICATE)
2632             others.safe_push (kids[i]);
2633           else
2634             gcc_unreachable ();
2635         }
2636       else if (kids[i]->type == dt_node::DT_SIMPLIFY)
2637         others.safe_push (kids[i]);
2638       else if (kids[i]->type == dt_node::DT_MATCH
2639                || kids[i]->type == dt_node::DT_TRUE)
2640         {
2641           /* A DT_TRUE operand serves as a barrier - generate code now
2642              for what we have collected sofar.
2643              Like DT_TRUE, DT_MATCH serves as a barrier as it can cause
2644              dependent matches to get out-of-order.  Generate code now
2645              for what we have collected sofar.  */
2646           gen_kids_1 (f, indent, gimple, gimple_exprs, generic_exprs,
2647                       fns, generic_fns, preds, others);
2648           /* And output the true operand itself.  */
2649           kids[i]->gen (f, indent, gimple);
2650           gimple_exprs.truncate (0);
2651           generic_exprs.truncate (0);
2652           fns.truncate (0);
2653           generic_fns.truncate (0);
2654           preds.truncate (0);
2655           others.truncate (0);
2656         }
2657       else
2658         gcc_unreachable ();
2659     }
2660
2661   /* Generate code for the remains.  */
2662   gen_kids_1 (f, indent, gimple, gimple_exprs, generic_exprs,
2663               fns, generic_fns, preds, others);
2664 }
2665
2666 /* Generate matching code for the children of the decision tree node.  */
2667
2668 void
2669 dt_node::gen_kids_1 (FILE *f, int indent, bool gimple,
2670                      vec<dt_operand *> gimple_exprs,
2671                      vec<dt_operand *> generic_exprs,
2672                      vec<dt_operand *> fns,
2673                      vec<dt_operand *> generic_fns,
2674                      vec<dt_operand *> preds,
2675                      vec<dt_node *> others)
2676 {
2677   char buf[128];
2678   char *kid_opname = buf;
2679
2680   unsigned exprs_len = gimple_exprs.length ();
2681   unsigned gexprs_len = generic_exprs.length ();
2682   unsigned fns_len = fns.length ();
2683   unsigned gfns_len = generic_fns.length ();
2684
2685   if (exprs_len || fns_len || gexprs_len || gfns_len)
2686     {
2687       if (exprs_len)
2688         gimple_exprs[0]->get_name (kid_opname);
2689       else if (fns_len)
2690         fns[0]->get_name (kid_opname);
2691       else if (gfns_len)
2692         generic_fns[0]->get_name (kid_opname);
2693       else
2694         generic_exprs[0]->get_name (kid_opname);
2695
2696       fprintf_indent (f, indent, "switch (TREE_CODE (%s))\n", kid_opname);
2697       fprintf_indent (f, indent, "  {\n");
2698       indent += 2;
2699     }
2700
2701   if (exprs_len || fns_len)
2702     {
2703       fprintf_indent (f, indent,
2704                       "case SSA_NAME:\n");
2705       fprintf_indent (f, indent,
2706                       "  if (do_valueize (valueize, %s) != NULL_TREE)\n",
2707                       kid_opname);
2708       fprintf_indent (f, indent,
2709                       "    {\n");
2710       fprintf_indent (f, indent,
2711                       "      gimple *def_stmt = SSA_NAME_DEF_STMT (%s);\n",
2712                       kid_opname);
2713
2714       indent += 6;
2715       if (exprs_len)
2716         {
2717           fprintf_indent (f, indent,
2718                           "if (gassign *def = dyn_cast <gassign *> (def_stmt))\n");
2719           fprintf_indent (f, indent,
2720                           "  switch (gimple_assign_rhs_code (def))\n");
2721           indent += 4;
2722           fprintf_indent (f, indent, "{\n");
2723           for (unsigned i = 0; i < exprs_len; ++i)
2724             {
2725               expr *e = as_a <expr *> (gimple_exprs[i]->op);
2726               id_base *op = e->operation;
2727               if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2728                 fprintf_indent (f, indent, "CASE_CONVERT:\n");
2729               else
2730                 fprintf_indent (f, indent, "case %s:\n", op->id);
2731               fprintf_indent (f, indent, "  {\n");
2732               gimple_exprs[i]->gen (f, indent + 4, true);
2733               fprintf_indent (f, indent, "    break;\n");
2734               fprintf_indent (f, indent, "  }\n");
2735             }
2736           fprintf_indent (f, indent, "default:;\n");
2737           fprintf_indent (f, indent, "}\n");
2738           indent -= 4;
2739         }
2740
2741       if (fns_len)
2742         {
2743           fprintf_indent (f, indent,
2744                           "%sif (gcall *def = dyn_cast <gcall *>"
2745                           " (def_stmt))\n",
2746                           exprs_len ? "else " : "");
2747           fprintf_indent (f, indent,
2748                           "  switch (gimple_call_combined_fn (def))\n");
2749
2750           indent += 4;
2751           fprintf_indent (f, indent, "{\n");
2752           for (unsigned i = 0; i < fns_len; ++i)
2753             {
2754               expr *e = as_a <expr *>(fns[i]->op);
2755               fprintf_indent (f, indent, "case %s:\n", e->operation->id);
2756               fprintf_indent (f, indent, "  {\n");
2757               fns[i]->gen (f, indent + 4, true);
2758               fprintf_indent (f, indent, "    break;\n");
2759               fprintf_indent (f, indent, "  }\n");
2760             }
2761
2762           fprintf_indent (f, indent, "default:;\n");
2763           fprintf_indent (f, indent, "}\n");
2764           indent -= 4;
2765         }
2766
2767       indent -= 6;
2768       fprintf_indent (f, indent, "    }\n");
2769       fprintf_indent (f, indent, "  break;\n");
2770     }
2771
2772   for (unsigned i = 0; i < generic_exprs.length (); ++i)
2773     {
2774       expr *e = as_a <expr *>(generic_exprs[i]->op);
2775       id_base *op = e->operation;
2776       if (*op == CONVERT_EXPR || *op == NOP_EXPR)
2777         fprintf_indent (f, indent, "CASE_CONVERT:\n");
2778       else
2779         fprintf_indent (f, indent, "case %s:\n", op->id);
2780       fprintf_indent (f, indent, "  {\n");
2781       generic_exprs[i]->gen (f, indent + 4, gimple);
2782       fprintf_indent (f, indent, "    break;\n");
2783       fprintf_indent (f, indent, "  }\n");
2784     }
2785
2786   if (gfns_len)
2787     {
2788       fprintf_indent (f, indent,
2789                       "case CALL_EXPR:\n");
2790       fprintf_indent (f, indent,
2791                       "  switch (get_call_combined_fn (%s))\n",
2792                       kid_opname);
2793       fprintf_indent (f, indent,
2794                       "    {\n");
2795       indent += 4;
2796
2797       for (unsigned j = 0; j < generic_fns.length (); ++j)
2798         {
2799           expr *e = as_a <expr *>(generic_fns[j]->op);
2800           gcc_assert (e->operation->kind == id_base::FN);
2801
2802           fprintf_indent (f, indent, "case %s:\n", e->operation->id);
2803           fprintf_indent (f, indent, "  {\n");
2804           generic_fns[j]->gen (f, indent + 4, false);
2805           fprintf_indent (f, indent, "    break;\n");
2806           fprintf_indent (f, indent, "  }\n");
2807         }
2808       fprintf_indent (f, indent, "default:;\n");
2809
2810       indent -= 4;
2811       fprintf_indent (f, indent, "    }\n");
2812       fprintf_indent (f, indent, "  break;\n");
2813     }
2814
2815   /* Close switch (TREE_CODE ()).  */
2816   if (exprs_len || fns_len || gexprs_len || gfns_len)
2817     {
2818       indent -= 4;
2819       fprintf_indent (f, indent, "    default:;\n");
2820       fprintf_indent (f, indent, "    }\n");
2821     }
2822
2823   for (unsigned i = 0; i < preds.length (); ++i)
2824     {
2825       expr *e = as_a <expr *> (preds[i]->op);
2826       predicate_id *p = as_a <predicate_id *> (e->operation);
2827       preds[i]->get_name (kid_opname);
2828       fprintf_indent (f, indent, "tree %s_pops[%d];\n", kid_opname, p->nargs);
2829       fprintf_indent (f, indent, "if (%s_%s (%s, %s_pops%s))\n",
2830                gimple ? "gimple" : "tree",
2831                p->id, kid_opname, kid_opname,
2832                gimple ? ", valueize" : "");
2833       fprintf_indent (f, indent, "  {\n");
2834       for (int j = 0; j < p->nargs; ++j)
2835         {
2836           char child_opname[20];
2837           preds[i]->gen_opname (child_opname, j);
2838           fprintf_indent (f, indent + 4, "tree %s = %s_pops[%d];\n",
2839                           child_opname, kid_opname, j);
2840         }
2841       preds[i]->gen_kids (f, indent + 4, gimple);
2842       fprintf (f, "}\n");
2843     }
2844
2845   for (unsigned i = 0; i < others.length (); ++i)
2846     others[i]->gen (f, indent, gimple);
2847 }
2848
2849 /* Generate matching code for the decision tree operand.  */
2850
2851 void
2852 dt_operand::gen (FILE *f, int indent, bool gimple)
2853 {
2854   char opname[20];
2855   get_name (opname);
2856
2857   unsigned n_braces = 0;
2858
2859   if (type == DT_OPERAND)
2860     switch (op->type)
2861       {
2862         case operand::OP_PREDICATE:
2863           n_braces = gen_predicate (f, indent, opname, gimple);
2864           break;
2865
2866         case operand::OP_EXPR:
2867           if (gimple)
2868             n_braces = gen_gimple_expr (f, indent);
2869           else
2870             n_braces = gen_generic_expr (f, indent, opname);
2871           break;
2872
2873         default:
2874           gcc_unreachable ();
2875       }
2876   else if (type == DT_TRUE)
2877     ;
2878   else if (type == DT_MATCH)
2879     n_braces = gen_match_op (f, indent, opname);
2880   else
2881     gcc_unreachable ();
2882
2883   indent += 4 * n_braces;
2884   gen_kids (f, indent, gimple);
2885
2886   for (unsigned i = 0; i < n_braces; ++i)
2887     {
2888       indent -= 4;
2889       if (indent < 0)
2890         indent = 0;
2891       fprintf_indent (f, indent, "  }\n");
2892     }
2893 }
2894
2895
2896 /* Generate code for the '(if ...)', '(with ..)' and actual transform
2897    step of a '(simplify ...)' or '(match ...)'.  This handles everything
2898    that is not part of the decision tree (simplify->match).
2899    Main recursive worker.  */
2900
2901 void
2902 dt_simplify::gen_1 (FILE *f, int indent, bool gimple, operand *result)
2903 {
2904   if (result)
2905     {
2906       if (with_expr *w = dyn_cast <with_expr *> (result))
2907         {
2908           fprintf_indent (f, indent, "{\n");
2909           indent += 4;
2910           output_line_directive (f, w->location);
2911           w->with->gen_transform (f, indent, NULL, true, 1, "type", NULL);
2912           gen_1 (f, indent, gimple, w->subexpr);
2913           indent -= 4;
2914           fprintf_indent (f, indent, "}\n");
2915           return;
2916         }
2917       else if (if_expr *ife = dyn_cast <if_expr *> (result))
2918         {
2919           output_line_directive (f, ife->location);
2920           fprintf_indent (f, indent, "if (");
2921           ife->cond->gen_transform (f, indent, NULL, true, 1, "type", NULL);
2922           fprintf (f, ")\n");
2923           fprintf_indent (f, indent + 2, "{\n");
2924           indent += 4;
2925           gen_1 (f, indent, gimple, ife->trueexpr);
2926           indent -= 4;
2927           fprintf_indent (f, indent + 2, "}\n");
2928           if (ife->falseexpr)
2929             {
2930               fprintf_indent (f, indent, "else\n");
2931               fprintf_indent (f, indent + 2, "{\n");
2932               indent += 4;
2933               gen_1 (f, indent, gimple, ife->falseexpr);
2934               indent -= 4;
2935               fprintf_indent (f, indent + 2, "}\n");
2936             }
2937           return;
2938         }
2939     }
2940
2941   /* Analyze captures and perform early-outs on the incoming arguments
2942      that cover cases we cannot handle.  */
2943   capture_info cinfo (s, result, gimple);
2944   if (s->kind == simplify::SIMPLIFY)
2945     {
2946       if (!gimple)
2947         {
2948           for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
2949             if (cinfo.force_no_side_effects & (1 << i))
2950               {
2951                 fprintf_indent (f, indent,
2952                                 "if (TREE_SIDE_EFFECTS (op%d)) return NULL_TREE;\n",
2953                                 i);
2954                 if (verbose >= 1)
2955                   warning_at (as_a <expr *> (s->match)->ops[i]->location,
2956                               "forcing toplevel operand to have no "
2957                               "side-effects");
2958               }
2959           for (int i = 0; i <= s->capture_max; ++i)
2960             if (cinfo.info[i].cse_p)
2961               ;
2962             else if (cinfo.info[i].force_no_side_effects_p
2963                      && (cinfo.info[i].toplevel_msk
2964                          & cinfo.force_no_side_effects) == 0)
2965               {
2966                 fprintf_indent (f, indent,
2967                                 "if (TREE_SIDE_EFFECTS (captures[%d])) "
2968                                 "return NULL_TREE;\n", i);
2969                 if (verbose >= 1)
2970                   warning_at (cinfo.info[i].c->location,
2971                               "forcing captured operand to have no "
2972                               "side-effects");
2973               }
2974             else if ((cinfo.info[i].toplevel_msk
2975                       & cinfo.force_no_side_effects) != 0)
2976               /* Mark capture as having no side-effects if we had to verify
2977                  that via forced toplevel operand checks.  */
2978               cinfo.info[i].force_no_side_effects_p = true;
2979         }
2980       if (gimple)
2981         {
2982           /* Force single-use restriction by only allowing simple
2983              results via setting seq to NULL.  */
2984           fprintf_indent (f, indent, "gimple_seq *lseq = seq;\n");
2985           bool first_p = true;
2986           for (int i = 0; i <= s->capture_max; ++i)
2987             if (cinfo.info[i].force_single_use)
2988               {
2989                 if (first_p)
2990                   {
2991                     fprintf_indent (f, indent, "if (lseq\n");
2992                     fprintf_indent (f, indent, "    && (");
2993                     first_p = false;
2994                   }
2995                 else
2996                   {
2997                     fprintf (f, "\n");
2998                     fprintf_indent (f, indent, "        || ");
2999                   }
3000                 fprintf (f, "!single_use (captures[%d])", i);
3001               }
3002           if (!first_p)
3003             {
3004               fprintf (f, "))\n");
3005               fprintf_indent (f, indent, "  lseq = NULL;\n");
3006             }
3007         }
3008     }
3009
3010   fprintf_indent (f, indent, "if (dump_file && (dump_flags & TDF_DETAILS)) "
3011            "fprintf (dump_file, \"Applying pattern ");
3012   output_line_directive (f,
3013                          result ? result->location : s->match->location, true);
3014   fprintf (f, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
3015
3016   if (!result)
3017     {
3018       /* If there is no result then this is a predicate implementation.  */
3019       fprintf_indent (f, indent, "return true;\n");
3020     }
3021   else if (gimple)
3022     {
3023       /* For GIMPLE simply drop NON_LVALUE_EXPR (which only appears
3024          in outermost position).  */
3025       if (result->type == operand::OP_EXPR
3026           && *as_a <expr *> (result)->operation == NON_LVALUE_EXPR)
3027         result = as_a <expr *> (result)->ops[0];
3028       if (result->type == operand::OP_EXPR)
3029         {
3030           expr *e = as_a <expr *> (result);
3031           id_base *opr = e->operation;
3032           bool is_predicate = false;
3033           /* When we delay operator substituting during lowering of fors we
3034              make sure that for code-gen purposes the effects of each substitute
3035              are the same.  Thus just look at that.  */
3036           if (user_id *uid = dyn_cast <user_id *> (opr))
3037             opr = uid->substitutes[0];
3038           else if (is_a <predicate_id *> (opr))
3039             is_predicate = true;
3040           if (!is_predicate)
3041             fprintf_indent (f, indent, "*res_code = %s;\n",
3042                             *e->operation == CONVERT_EXPR
3043                             ? "NOP_EXPR" : e->operation->id);
3044           for (unsigned j = 0; j < e->ops.length (); ++j)
3045             {
3046               char dest[32];
3047               snprintf (dest, 32, "res_ops[%d]", j);
3048               const char *optype
3049                 = get_operand_type (opr,
3050                                     "type", e->expr_type,
3051                                     j == 0 ? NULL : "TREE_TYPE (res_ops[0])");
3052               /* We need to expand GENERIC conditions we captured from
3053                  COND_EXPRs and we need to unshare them when substituting
3054                  into COND_EXPRs.  */
3055               int cond_handling = 0;
3056               if (!is_predicate)
3057                 cond_handling = ((*opr == COND_EXPR
3058                                   || *opr == VEC_COND_EXPR) && j == 0) ? 1 : 2;
3059               e->ops[j]->gen_transform (f, indent, dest, true, 1, optype,
3060                                         &cinfo, indexes, cond_handling);
3061             }
3062
3063           /* Re-fold the toplevel result.  It's basically an embedded
3064              gimple_build w/o actually building the stmt.  */
3065           if (!is_predicate)
3066             fprintf_indent (f, indent,
3067                             "gimple_resimplify%d (lseq, res_code, type, "
3068                             "res_ops, valueize);\n", e->ops.length ());
3069         }
3070       else if (result->type == operand::OP_CAPTURE
3071                || result->type == operand::OP_C_EXPR)
3072         {
3073           result->gen_transform (f, indent, "res_ops[0]", true, 1, "type",
3074                                  &cinfo, indexes);
3075           fprintf_indent (f, indent, "*res_code = TREE_CODE (res_ops[0]);\n");
3076           if (is_a <capture *> (result)
3077               && cinfo.info[as_a <capture *> (result)->where].cond_expr_cond_p)
3078             {
3079               /* ???  Stupid tcc_comparison GENERIC trees in COND_EXPRs.  Deal
3080                  with substituting a capture of that.  */
3081               fprintf_indent (f, indent,
3082                               "if (COMPARISON_CLASS_P (res_ops[0]))\n");
3083               fprintf_indent (f, indent,
3084                               "  {\n");
3085               fprintf_indent (f, indent,
3086                               "    tree tem = res_ops[0];\n");
3087               fprintf_indent (f, indent,
3088                               "    res_ops[0] = TREE_OPERAND (tem, 0);\n");
3089               fprintf_indent (f, indent,
3090                               "    res_ops[1] = TREE_OPERAND (tem, 1);\n");
3091               fprintf_indent (f, indent,
3092                               "  }\n");
3093             }
3094         }
3095       else
3096         gcc_unreachable ();
3097       fprintf_indent (f, indent, "return true;\n");
3098     }
3099   else /* GENERIC */
3100     {
3101       bool is_predicate = false;
3102       if (result->type == operand::OP_EXPR)
3103         {
3104           expr *e = as_a <expr *> (result);
3105           id_base *opr = e->operation;
3106           /* When we delay operator substituting during lowering of fors we
3107              make sure that for code-gen purposes the effects of each substitute
3108              are the same.  Thus just look at that.  */
3109           if (user_id *uid = dyn_cast <user_id *> (opr))
3110             opr = uid->substitutes[0];
3111           else if (is_a <predicate_id *> (opr))
3112             is_predicate = true;
3113           /* Search for captures used multiple times in the result expression
3114              and wrap them in a SAVE_EXPR.  Allow as many uses as in the
3115              original expression.  */
3116           if (!is_predicate)
3117             for (int i = 0; i < s->capture_max + 1; ++i)
3118               {
3119                 if (cinfo.info[i].same_as != (unsigned)i
3120                     || cinfo.info[i].cse_p)
3121                   continue;
3122                 if (cinfo.info[i].result_use_count
3123                     > cinfo.info[i].match_use_count)
3124                   fprintf_indent (f, indent,
3125                                   "if (! tree_invariant_p (captures[%d])) "
3126                                   "return NULL_TREE;\n", i);
3127               }
3128           for (unsigned j = 0; j < e->ops.length (); ++j)
3129             {
3130               char dest[32];
3131               if (is_predicate)
3132                 snprintf (dest, 32, "res_ops[%d]", j);
3133               else
3134                 {
3135                   fprintf_indent (f, indent, "tree res_op%d;\n", j);
3136                   snprintf (dest, 32, "res_op%d", j);
3137                 }
3138               const char *optype
3139                 = get_operand_type (opr,
3140                                     "type", e->expr_type,
3141                                     j == 0
3142                                     ? NULL : "TREE_TYPE (res_op0)");
3143               e->ops[j]->gen_transform (f, indent, dest, false, 1, optype,
3144                                         &cinfo, indexes);
3145             }
3146           if (is_predicate)
3147             fprintf_indent (f, indent, "return true;\n");
3148           else
3149             {
3150               fprintf_indent (f, indent, "tree res;\n");
3151               /* Re-fold the toplevel result.  Use non_lvalue to
3152                  build NON_LVALUE_EXPRs so they get properly
3153                  ignored when in GIMPLE form.  */
3154               if (*opr == NON_LVALUE_EXPR)
3155                 fprintf_indent (f, indent,
3156                                 "res = non_lvalue_loc (loc, res_op0);\n");
3157               else
3158                 {
3159                   if (is_a <operator_id *> (opr))
3160                     fprintf_indent (f, indent,
3161                                     "res = fold_build%d_loc (loc, %s, type",
3162                                     e->ops.length (),
3163                                     *e->operation == CONVERT_EXPR
3164                                     ? "NOP_EXPR" : e->operation->id);
3165                   else
3166                     fprintf_indent (f, indent,
3167                                     "res = maybe_build_call_expr_loc (loc, "
3168                                     "%s, type, %d", e->operation->id,
3169                                     e->ops.length());
3170                   for (unsigned j = 0; j < e->ops.length (); ++j)
3171                     fprintf (f, ", res_op%d", j);
3172                   fprintf (f, ");\n");
3173                   if (!is_a <operator_id *> (opr))
3174                     {
3175                       fprintf_indent (f, indent, "if (!res)\n");
3176                       fprintf_indent (f, indent, "  return NULL_TREE;\n");
3177                     }
3178                 }
3179             }
3180         }
3181       else if (result->type == operand::OP_CAPTURE
3182                || result->type == operand::OP_C_EXPR)
3183
3184         {
3185           fprintf_indent (f, indent, "tree res;\n");
3186           result->gen_transform (f, indent, "res", false, 1, "type",
3187                                     &cinfo, indexes);
3188         }
3189       else
3190         gcc_unreachable ();
3191       if (!is_predicate)
3192         {
3193           /* Search for captures not used in the result expression and dependent
3194              on TREE_SIDE_EFFECTS emit omit_one_operand.  */
3195           for (int i = 0; i < s->capture_max + 1; ++i)
3196             {
3197               if (cinfo.info[i].same_as != (unsigned)i)
3198                 continue;
3199               if (!cinfo.info[i].force_no_side_effects_p
3200                   && !cinfo.info[i].expr_p
3201                   && cinfo.info[i].result_use_count == 0)
3202                 {
3203                   fprintf_indent (f, indent,
3204                                   "if (TREE_SIDE_EFFECTS (captures[%d]))\n",
3205                                   i);
3206                   fprintf_indent (f, indent + 2,
3207                                   "res = build2_loc (loc, COMPOUND_EXPR, type, "
3208                                   "fold_ignored_result (captures[%d]), res);\n",
3209                                   i);
3210                 }
3211             }
3212           fprintf_indent (f, indent, "return res;\n");
3213         }
3214     }
3215 }
3216
3217 /* Generate code for the '(if ...)', '(with ..)' and actual transform
3218    step of a '(simplify ...)' or '(match ...)'.  This handles everything
3219    that is not part of the decision tree (simplify->match).  */
3220
3221 void
3222 dt_simplify::gen (FILE *f, int indent, bool gimple)
3223 {
3224   fprintf_indent (f, indent, "{\n");
3225   indent += 2;
3226   output_line_directive (f,
3227                          s->result ? s->result->location : s->match->location);
3228   if (s->capture_max >= 0)
3229     {
3230       char opname[20];
3231       fprintf_indent (f, indent, "tree captures[%u] ATTRIBUTE_UNUSED = { %s",
3232                       s->capture_max + 1, indexes[0]->get_name (opname));
3233
3234       for (int i = 1; i <= s->capture_max; ++i)
3235         {
3236           if (!indexes[i])
3237             break;
3238           fprintf (f, ", %s", indexes[i]->get_name (opname));
3239         }
3240       fprintf (f, " };\n");
3241     }
3242
3243   /* If we have a split-out function for the actual transform, call it.  */
3244   if (info && info->fname)
3245     {
3246       if (gimple)
3247         {
3248           fprintf_indent (f, indent, "if (%s (res_code, res_ops, seq, "
3249                           "valueize, type, captures", info->fname);
3250           for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3251             fprintf (f, ", %s", s->for_subst_vec[i].second->id);
3252           fprintf (f, "))\n");
3253           fprintf_indent (f, indent, "  return true;\n");
3254         }
3255       else
3256         {
3257           fprintf_indent (f, indent, "tree res = %s (loc, type",
3258                           info->fname);
3259           for (unsigned i = 0; i < as_a <expr *> (s->match)->ops.length (); ++i)
3260             fprintf (f, ", op%d", i);
3261           fprintf (f, ", captures");
3262           for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3263             fprintf (f, ", %s", s->for_subst_vec[i].second->id);
3264           fprintf (f, ");\n");
3265           fprintf_indent (f, indent, "if (res) return res;\n");
3266         }
3267     }
3268   else
3269     {
3270       for (unsigned i = 0; i < s->for_subst_vec.length (); ++i)
3271         {
3272           if (is_a <operator_id *> (s->for_subst_vec[i].second))
3273             fprintf_indent (f, indent, "enum tree_code %s = %s;\n",
3274                             s->for_subst_vec[i].first->id,
3275                             s->for_subst_vec[i].second->id);
3276           else if (is_a <fn_id *> (s->for_subst_vec[i].second))
3277             fprintf_indent (f, indent, "combined_fn %s = %s;\n",
3278                             s->for_subst_vec[i].first->id,
3279                             s->for_subst_vec[i].second->id);
3280           else
3281             gcc_unreachable ();
3282         }
3283       gen_1 (f, indent, gimple, s->result);
3284     }
3285
3286   indent -= 2;
3287   fprintf_indent (f, indent, "}\n");
3288 }
3289
3290
3291 /* Hash function for finding equivalent transforms.  */
3292
3293 hashval_t
3294 sinfo_hashmap_traits::hash (const key_type &v)
3295 {
3296   /* Only bother to compare those originating from the same source pattern.  */
3297   return v->s->result->location;
3298 }
3299
3300 /* Compare function for finding equivalent transforms.  */
3301
3302 static bool
3303 compare_op (operand *o1, simplify *s1, operand *o2, simplify *s2)
3304 {
3305   if (o1->type != o2->type)
3306     return false;
3307
3308   switch (o1->type)
3309     {
3310     case operand::OP_IF:
3311       {
3312         if_expr *if1 = as_a <if_expr *> (o1);
3313         if_expr *if2 = as_a <if_expr *> (o2);
3314         /* ???  Properly compare c-exprs.  */
3315         if (if1->cond != if2->cond)
3316           return false;
3317         if (!compare_op (if1->trueexpr, s1, if2->trueexpr, s2))
3318           return false;
3319         if (if1->falseexpr != if2->falseexpr
3320             || (if1->falseexpr
3321                 && !compare_op (if1->falseexpr, s1, if2->falseexpr, s2)))
3322           return false;
3323         return true;
3324       }
3325     case operand::OP_WITH:
3326       {
3327         with_expr *with1 = as_a <with_expr *> (o1);
3328         with_expr *with2 = as_a <with_expr *> (o2);
3329         if (with1->with != with2->with)
3330           return false;
3331         return compare_op (with1->subexpr, s1, with2->subexpr, s2);
3332       }
3333     default:;
3334     }
3335
3336   /* We've hit a result.  Time to compare capture-infos - this is required
3337      in addition to the conservative pointer-equivalency of the result IL.  */
3338   capture_info cinfo1 (s1, o1, true);
3339   capture_info cinfo2 (s2, o2, true);
3340
3341   if (cinfo1.force_no_side_effects != cinfo2.force_no_side_effects
3342       || cinfo1.info.length () != cinfo2.info.length ())
3343     return false;
3344
3345   for (unsigned i = 0; i < cinfo1.info.length (); ++i)
3346     {
3347       if (cinfo1.info[i].expr_p != cinfo2.info[i].expr_p
3348           || cinfo1.info[i].cse_p != cinfo2.info[i].cse_p
3349           || (cinfo1.info[i].force_no_side_effects_p
3350               != cinfo2.info[i].force_no_side_effects_p)
3351           || cinfo1.info[i].force_single_use != cinfo2.info[i].force_single_use
3352           || cinfo1.info[i].cond_expr_cond_p != cinfo2.info[i].cond_expr_cond_p
3353           /* toplevel_msk is an optimization */
3354           || cinfo1.info[i].result_use_count != cinfo2.info[i].result_use_count
3355           || cinfo1.info[i].same_as != cinfo2.info[i].same_as
3356           /* the pointer back to the capture is for diagnostics only */)
3357         return false;
3358     }
3359
3360   /* ???  Deep-compare the actual result.  */
3361   return o1 == o2;
3362 }
3363
3364 bool
3365 sinfo_hashmap_traits::equal_keys (const key_type &v,
3366                                   const key_type &candidate)
3367 {
3368   return compare_op (v->s->result, v->s, candidate->s->result, candidate->s);
3369 }
3370
3371
3372 /* Main entry to generate code for matching GIMPLE IL off the decision
3373    tree.  */
3374
3375 void
3376 decision_tree::gen (FILE *f, bool gimple)
3377 {
3378   sinfo_map_t si;
3379
3380   root->analyze (si);
3381
3382   fprintf (stderr, "%s decision tree has %u leafs, maximum depth %u and "
3383            "a total number of %u nodes\n",
3384            gimple ? "GIMPLE" : "GENERIC", 
3385            root->num_leafs, root->max_level, root->total_size);
3386
3387   /* First split out the transform part of equal leafs.  */
3388   unsigned rcnt = 0;
3389   unsigned fcnt = 1;
3390   for (sinfo_map_t::iterator iter = si.begin ();
3391        iter != si.end (); ++iter)
3392     {
3393       sinfo *s = (*iter).second;
3394       /* Do not split out single uses.  */
3395       if (s->cnt <= 1)
3396         continue;
3397
3398       rcnt += s->cnt - 1;
3399       if (verbose >= 1)
3400         {
3401           fprintf (stderr, "found %u uses of", s->cnt);
3402           output_line_directive (stderr, s->s->s->result->location);
3403         }
3404
3405       /* Generate a split out function with the leaf transform code.  */
3406       s->fname = xasprintf ("%s_simplify_%u", gimple ? "gimple" : "generic",
3407                             fcnt++);
3408       if (gimple)
3409         fprintf (f, "\nstatic bool\n"
3410                  "%s (code_helper *res_code, tree *res_ops,\n"
3411                  "                 gimple_seq *seq, tree (*valueize)(tree) "
3412                  "ATTRIBUTE_UNUSED,\n"
3413                  "                 tree ARG_UNUSED (type), tree *ARG_UNUSED "
3414                  "(captures)\n",
3415                  s->fname);
3416       else
3417         {
3418           fprintf (f, "\nstatic tree\n"
3419                    "%s (location_t ARG_UNUSED (loc), tree ARG_UNUSED (type),\n",
3420                    (*iter).second->fname);
3421           for (unsigned i = 0;
3422                i < as_a <expr *>(s->s->s->match)->ops.length (); ++i)
3423             fprintf (f, " tree ARG_UNUSED (op%d),", i);
3424           fprintf (f, " tree *captures\n");
3425         }
3426       for (unsigned i = 0; i < s->s->s->for_subst_vec.length (); ++i)
3427         {
3428           if (is_a <operator_id *> (s->s->s->for_subst_vec[i].second))
3429             fprintf (f, ", enum tree_code ARG_UNUSED (%s)",
3430                      s->s->s->for_subst_vec[i].first->id);
3431           else if (is_a <fn_id *> (s->s->s->for_subst_vec[i].second))
3432             fprintf (f, ", combined_fn ARG_UNUSED (%s)",
3433                      s->s->s->for_subst_vec[i].first->id);
3434         }
3435
3436       fprintf (f, ")\n{\n");
3437       s->s->gen_1 (f, 2, gimple, s->s->s->result);
3438       if (gimple)
3439         fprintf (f, "  return false;\n");
3440       else
3441         fprintf (f, "  return NULL_TREE;\n");
3442       fprintf (f, "}\n");
3443     }
3444   fprintf (stderr, "removed %u duplicate tails\n", rcnt);
3445
3446   for (unsigned n = 1; n <= 3; ++n)
3447     {
3448       /* First generate split-out functions.  */
3449       for (unsigned i = 0; i < root->kids.length (); i++)
3450         {
3451           dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
3452           expr *e = static_cast<expr *>(dop->op);
3453           if (e->ops.length () != n
3454               /* Builtin simplifications are somewhat premature on
3455                  GENERIC.  The following drops patterns with outermost
3456                  calls.  It's easy to emit overloads for function code
3457                  though if necessary.  */
3458               || (!gimple
3459                   && e->operation->kind != id_base::CODE))
3460             continue;
3461
3462           if (gimple)
3463             fprintf (f, "\nstatic bool\n"
3464                      "gimple_simplify_%s (code_helper *res_code, tree *res_ops,\n"
3465                      "                 gimple_seq *seq, tree (*valueize)(tree) "
3466                      "ATTRIBUTE_UNUSED,\n"
3467                      "                 code_helper ARG_UNUSED (code), tree "
3468                      "ARG_UNUSED (type)\n",
3469                      e->operation->id);
3470           else
3471             fprintf (f, "\nstatic tree\n"
3472                      "generic_simplify_%s (location_t ARG_UNUSED (loc), enum "
3473                      "tree_code ARG_UNUSED (code), tree ARG_UNUSED (type)",
3474                      e->operation->id);
3475           for (unsigned i = 0; i < n; ++i)
3476             fprintf (f, ", tree op%d", i);
3477           fprintf (f, ")\n");
3478           fprintf (f, "{\n");
3479           dop->gen_kids (f, 2, gimple);
3480           if (gimple)
3481             fprintf (f, "  return false;\n");
3482           else
3483             fprintf (f, "  return NULL_TREE;\n");
3484           fprintf (f, "}\n");
3485         }
3486
3487       /* Then generate the main entry with the outermost switch and
3488          tail-calls to the split-out functions.  */
3489       if (gimple)
3490         fprintf (f, "\nstatic bool\n"
3491                  "gimple_simplify (code_helper *res_code, tree *res_ops,\n"
3492                  "                 gimple_seq *seq, tree (*valueize)(tree),\n"
3493                  "                 code_helper code, tree type");
3494       else
3495         fprintf (f, "\ntree\n"
3496                  "generic_simplify (location_t loc, enum tree_code code, "
3497                  "tree type ATTRIBUTE_UNUSED");
3498       for (unsigned i = 0; i < n; ++i)
3499         fprintf (f, ", tree op%d", i);
3500       fprintf (f, ")\n");
3501       fprintf (f, "{\n");
3502
3503       if (gimple)
3504         fprintf (f, "  switch (code.get_rep())\n"
3505                  "    {\n");
3506       else
3507         fprintf (f, "  switch (code)\n"
3508                  "    {\n");
3509       for (unsigned i = 0; i < root->kids.length (); i++)
3510         {
3511           dt_operand *dop = static_cast<dt_operand *>(root->kids[i]);
3512           expr *e = static_cast<expr *>(dop->op);
3513           if (e->ops.length () != n
3514               /* Builtin simplifications are somewhat premature on
3515                  GENERIC.  The following drops patterns with outermost
3516                  calls.  It's easy to emit overloads for function code
3517                  though if necessary.  */
3518               || (!gimple
3519                   && e->operation->kind != id_base::CODE))
3520             continue;
3521
3522           if (*e->operation == CONVERT_EXPR
3523               || *e->operation == NOP_EXPR)
3524             fprintf (f, "    CASE_CONVERT:\n");
3525           else
3526             fprintf (f, "    case %s%s:\n",
3527                      is_a <fn_id *> (e->operation) ? "-" : "",
3528                      e->operation->id);
3529           if (gimple)
3530             fprintf (f, "      return gimple_simplify_%s (res_code, res_ops, "
3531                      "seq, valueize, code, type", e->operation->id);
3532           else
3533             fprintf (f, "      return generic_simplify_%s (loc, code, type",
3534                      e->operation->id);
3535           for (unsigned i = 0; i < n; ++i)
3536             fprintf (f, ", op%d", i);
3537           fprintf (f, ");\n");
3538         }
3539       fprintf (f,       "    default:;\n"
3540                         "    }\n");
3541
3542       if (gimple)
3543         fprintf (f, "  return false;\n");
3544       else
3545         fprintf (f, "  return NULL_TREE;\n");
3546       fprintf (f, "}\n");
3547     }
3548 }
3549
3550 /* Output code to implement the predicate P from the decision tree DT.  */
3551
3552 void
3553 write_predicate (FILE *f, predicate_id *p, decision_tree &dt, bool gimple)
3554 {
3555   fprintf (f, "\nbool\n"
3556            "%s%s (tree t%s%s)\n"
3557            "{\n", gimple ? "gimple_" : "tree_", p->id,
3558            p->nargs > 0 ? ", tree *res_ops" : "",
3559            gimple ? ", tree (*valueize)(tree) ATTRIBUTE_UNUSED" : "");
3560   /* Conveniently make 'type' available.  */
3561   fprintf_indent (f, 2, "tree type = TREE_TYPE (t);\n");
3562
3563   if (!gimple)
3564     fprintf_indent (f, 2, "if (TREE_SIDE_EFFECTS (t)) return false;\n");
3565   dt.root->gen_kids (f, 2, gimple);
3566
3567   fprintf_indent (f, 2, "return false;\n"
3568            "}\n");
3569 }
3570
3571 /* Write the common header for the GIMPLE/GENERIC IL matching routines.  */
3572
3573 static void
3574 write_header (FILE *f, const char *head)
3575 {
3576   fprintf (f, "/* Generated automatically by the program `genmatch' from\n");
3577   fprintf (f, "   a IL pattern matching and simplification description.  */\n");
3578
3579   /* Include the header instead of writing it awkwardly quoted here.  */
3580   fprintf (f, "\n#include \"%s\"\n", head);
3581 }
3582
3583
3584
3585 /* AST parsing.  */
3586
3587 class parser
3588 {
3589 public:
3590   parser (cpp_reader *);
3591
3592 private:
3593   const cpp_token *next ();
3594   const cpp_token *peek (unsigned = 1);
3595   const cpp_token *peek_ident (const char * = NULL, unsigned = 1);
3596   const cpp_token *expect (enum cpp_ttype);
3597   const cpp_token *eat_token (enum cpp_ttype);
3598   const char *get_string ();
3599   const char *get_ident ();
3600   const cpp_token *eat_ident (const char *);
3601   const char *get_number ();
3602
3603   id_base *parse_operation ();
3604   operand *parse_capture (operand *, bool);
3605   operand *parse_expr ();
3606   c_expr *parse_c_expr (cpp_ttype);
3607   operand *parse_op ();
3608
3609   void record_operlist (source_location, user_id *);
3610
3611   void parse_pattern ();
3612   operand *parse_result (operand *, predicate_id *);
3613   void push_simplify (simplify::simplify_kind,
3614                       vec<simplify *>&, operand *, operand *);
3615   void parse_simplify (simplify::simplify_kind,
3616                        vec<simplify *>&, predicate_id *, operand *);
3617   void parse_for (source_location);
3618   void parse_if (source_location);
3619   void parse_predicates (source_location);
3620   void parse_operator_list (source_location);
3621
3622   cpp_reader *r;
3623   vec<c_expr *> active_ifs;
3624   vec<vec<user_id *> > active_fors;
3625   hash_set<user_id *> *oper_lists_set;
3626   vec<user_id *> oper_lists;
3627
3628   cid_map_t *capture_ids;
3629
3630 public:
3631   vec<simplify *> simplifiers;
3632   vec<predicate_id *> user_predicates;
3633   bool parsing_match_operand;
3634 };
3635
3636 /* Lexing helpers.  */
3637
3638 /* Read the next non-whitespace token from R.  */
3639
3640 const cpp_token *
3641 parser::next ()
3642 {
3643   const cpp_token *token;
3644   do
3645     {
3646       token = cpp_get_token (r);
3647     }
3648   while (token->type == CPP_PADDING
3649          && token->type != CPP_EOF);
3650   return token;
3651 }
3652
3653 /* Peek at the next non-whitespace token from R.  */
3654
3655 const cpp_token *
3656 parser::peek (unsigned num)
3657 {
3658   const cpp_token *token;
3659   unsigned i = 0;
3660   do
3661     {
3662       token = cpp_peek_token (r, i++);
3663     }
3664   while ((token->type == CPP_PADDING
3665           && token->type != CPP_EOF)
3666          || (--num > 0));
3667   /* If we peek at EOF this is a fatal error as it leaves the
3668      cpp_reader in unusable state.  Assume we really wanted a
3669      token and thus this EOF is unexpected.  */
3670   if (token->type == CPP_EOF)
3671     fatal_at (token, "unexpected end of file");
3672   return token;
3673 }
3674
3675 /* Peek at the next identifier token (or return NULL if the next
3676    token is not an identifier or equal to ID if supplied).  */
3677
3678 const cpp_token *
3679 parser::peek_ident (const char *id, unsigned num)
3680 {
3681   const cpp_token *token = peek (num);
3682   if (token->type != CPP_NAME)
3683     return 0;
3684
3685   if (id == 0)
3686     return token;
3687
3688   const char *t = (const char *) CPP_HASHNODE (token->val.node.node)->ident.str;
3689   if (strcmp (id, t) == 0)
3690     return token;
3691
3692   return 0;
3693 }
3694
3695 /* Read the next token from R and assert it is of type TK.  */
3696
3697 const cpp_token *
3698 parser::expect (enum cpp_ttype tk)
3699 {
3700   const cpp_token *token = next ();
3701   if (token->type != tk)
3702     fatal_at (token, "expected %s, got %s",
3703               cpp_type2name (tk, 0), cpp_type2name (token->type, 0));
3704
3705   return token;
3706 }
3707
3708 /* Consume the next token from R and assert it is of type TK.  */
3709
3710 const cpp_token *
3711 parser::eat_token (enum cpp_ttype tk)
3712 {
3713   return expect (tk);
3714 }
3715
3716 /* Read the next token from R and assert it is of type CPP_STRING and
3717    return its value.  */
3718
3719 const char *
3720 parser::get_string ()
3721 {
3722   const cpp_token *token = expect (CPP_STRING);
3723   return (const char *)token->val.str.text;
3724 }
3725
3726 /* Read the next token from R and assert it is of type CPP_NAME and
3727    return its value.  */
3728
3729 const char *
3730 parser::get_ident ()
3731 {
3732   const cpp_token *token = expect (CPP_NAME);
3733   return (const char *)CPP_HASHNODE (token->val.node.node)->ident.str;
3734 }
3735
3736 /* Eat an identifier token with value S from R.  */
3737
3738 const cpp_token *
3739 parser::eat_ident (const char *s)
3740 {
3741   const cpp_token *token = peek ();
3742   const char *t = get_ident ();
3743   if (strcmp (s, t) != 0)
3744     fatal_at (token, "expected '%s' got '%s'\n", s, t);
3745   return token;
3746 }
3747
3748 /* Read the next token from R and assert it is of type CPP_NUMBER and
3749    return its value.  */
3750
3751 const char *
3752 parser::get_number ()
3753 {
3754   const cpp_token *token = expect (CPP_NUMBER);
3755   return (const char *)token->val.str.text;
3756 }
3757
3758
3759 /* Record an operator-list use for transparent for handling.  */
3760
3761 void
3762 parser::record_operlist (source_location loc, user_id *p)
3763 {
3764   if (!oper_lists_set->add (p))
3765     {
3766       if (!oper_lists.is_empty ()
3767           && oper_lists[0]->substitutes.length () != p->substitutes.length ())
3768         fatal_at (loc, "User-defined operator list does not have the "
3769                   "same number of entries as others used in the pattern");
3770       oper_lists.safe_push (p);
3771     }
3772 }
3773
3774 /* Parse the operator ID, special-casing convert?, convert1? and
3775    convert2?  */
3776
3777 id_base *
3778 parser::parse_operation ()
3779 {
3780   const cpp_token *id_tok = peek ();
3781   const char *id = get_ident ();
3782   const cpp_token *token = peek ();
3783   if (strcmp (id, "convert0") == 0)
3784     fatal_at (id_tok, "use 'convert?' here");
3785   else if (strcmp (id, "view_convert0") == 0)
3786     fatal_at (id_tok, "use 'view_convert?' here");
3787   if (token->type == CPP_QUERY
3788       && !(token->flags & PREV_WHITE))
3789     {
3790       if (strcmp (id, "convert") == 0)
3791         id = "convert0";
3792       else if (strcmp (id, "convert1") == 0)
3793         ;
3794       else if (strcmp (id, "convert2") == 0)
3795         ;
3796       else if (strcmp (id, "view_convert") == 0)
3797         id = "view_convert0";
3798       else if (strcmp (id, "view_convert1") == 0)
3799         ;
3800       else if (strcmp (id, "view_convert2") == 0)
3801         ;
3802       else
3803         fatal_at (id_tok, "non-convert operator conditionalized");
3804
3805       if (!parsing_match_operand)
3806         fatal_at (id_tok, "conditional convert can only be used in "
3807                   "match expression");
3808       eat_token (CPP_QUERY);
3809     }
3810   else if (strcmp (id, "convert1") == 0
3811            || strcmp (id, "convert2") == 0
3812            || strcmp (id, "view_convert1") == 0
3813            || strcmp (id, "view_convert2") == 0)
3814     fatal_at (id_tok, "expected '?' after conditional operator");
3815   id_base *op = get_operator (id);
3816   if (!op)
3817     fatal_at (id_tok, "unknown operator %s", id);
3818
3819   user_id *p = dyn_cast<user_id *> (op);
3820   if (p && p->is_oper_list)
3821     {
3822       if (active_fors.length() == 0)
3823         record_operlist (id_tok->src_loc, p);
3824       else
3825         fatal_at (id_tok, "operator-list %s cannot be exapnded inside 'for'", id);
3826     }
3827   return op;
3828 }
3829
3830 /* Parse a capture.
3831      capture = '@'<number>  */
3832
3833 struct operand *
3834 parser::parse_capture (operand *op, bool require_existing)
3835 {
3836   source_location src_loc = eat_token (CPP_ATSIGN)->src_loc;
3837   const cpp_token *token = peek ();
3838   const char *id = NULL;
3839   if (token->type == CPP_NUMBER)
3840     id = get_number ();
3841   else if (token->type == CPP_NAME)
3842     id = get_ident ();
3843   else
3844     fatal_at (token, "expected number or identifier");
3845   unsigned next_id = capture_ids->elements ();
3846   bool existed;
3847   unsigned &num = capture_ids->get_or_insert (id, &existed);
3848   if (!existed)
3849     {
3850       if (require_existing)
3851         fatal_at (src_loc, "unknown capture id");
3852       num = next_id;
3853     }
3854   return new capture (src_loc, num, op);
3855 }
3856
3857 /* Parse an expression
3858      expr = '(' <operation>[capture][flag][type] <operand>... ')'  */
3859
3860 struct operand *
3861 parser::parse_expr ()
3862 {
3863   const cpp_token *token = peek ();
3864   expr *e = new expr (parse_operation (), token->src_loc);
3865   token = peek ();
3866   operand *op;
3867   bool is_commutative = false;
3868   bool force_capture = false;
3869   const char *expr_type = NULL;
3870
3871   if (token->type == CPP_COLON
3872       && !(token->flags & PREV_WHITE))
3873     {
3874       eat_token (CPP_COLON);
3875       token = peek ();
3876       if (token->type == CPP_NAME
3877           && !(token->flags & PREV_WHITE))
3878         {
3879           const char *s = get_ident ();
3880           if (!parsing_match_operand)
3881             expr_type = s;
3882           else
3883             {
3884               const char *sp = s;
3885               while (*sp)
3886                 {
3887                   if (*sp == 'c')
3888                     is_commutative = true;
3889                   else if (*sp == 's')
3890                     {
3891                       e->force_single_use = true;
3892                       force_capture = true;
3893                     }
3894                   else
3895                     fatal_at (token, "flag %c not recognized", *sp);
3896                   sp++;
3897                 }
3898             }
3899           token = peek ();
3900         }
3901       else
3902         fatal_at (token, "expected flag or type specifying identifier");
3903     }
3904
3905   if (token->type == CPP_ATSIGN
3906       && !(token->flags & PREV_WHITE))
3907     op = parse_capture (e, false);
3908   else if (force_capture)
3909     {
3910       unsigned num = capture_ids->elements ();
3911       char id[8];
3912       bool existed;
3913       sprintf (id, "__%u", num);
3914       capture_ids->get_or_insert (xstrdup (id), &existed);
3915       if (existed)
3916         fatal_at (token, "reserved capture id '%s' already used", id);
3917       op = new capture (token->src_loc, num, e);
3918     }
3919   else
3920     op = e;
3921   do
3922     {
3923       const cpp_token *token = peek ();
3924       if (token->type == CPP_CLOSE_PAREN)
3925         {
3926           if (e->operation->nargs != -1
3927               && e->operation->nargs != (int) e->ops.length ())
3928             fatal_at (token, "'%s' expects %u operands, not %u",
3929                       e->operation->id, e->operation->nargs, e->ops.length ());
3930           if (is_commutative)
3931             {
3932               if (e->ops.length () == 2)
3933                 e->is_commutative = true;
3934               else
3935                 fatal_at (token, "only binary operators or function with "
3936                           "two arguments can be marked commutative");
3937             }
3938           e->expr_type = expr_type;
3939           return op;
3940         }
3941       else if (!(token->flags & PREV_WHITE))
3942         fatal_at (token, "expected expression operand");
3943
3944       e->append_op (parse_op ());
3945     }
3946   while (1);
3947 }
3948
3949 /* Lex native C code delimited by START recording the preprocessing tokens
3950    for later processing.
3951      c_expr = ('{'|'(') <pp token>... ('}'|')')  */
3952
3953 c_expr *
3954 parser::parse_c_expr (cpp_ttype start)
3955 {
3956   const cpp_token *token;
3957   cpp_ttype end;
3958   unsigned opencnt;
3959   vec<cpp_token> code = vNULL;
3960   unsigned nr_stmts = 0;
3961   source_location loc = eat_token (start)->src_loc;
3962   if (start == CPP_OPEN_PAREN)
3963     end = CPP_CLOSE_PAREN;
3964   else if (start == CPP_OPEN_BRACE)
3965     end = CPP_CLOSE_BRACE;
3966   else
3967     gcc_unreachable ();
3968   opencnt = 1;
3969   do
3970     {
3971       token = next ();
3972
3973       /* Count brace pairs to find the end of the expr to match.  */
3974       if (token->type == start)
3975         opencnt++;
3976       else if (token->type == end
3977                && --opencnt == 0)
3978         break;
3979
3980       /* This is a lame way of counting the number of statements.  */
3981       if (token->type == CPP_SEMICOLON)
3982         nr_stmts++;
3983
3984       /* If this is possibly a user-defined identifier mark it used.  */
3985       if (token->type == CPP_NAME)
3986         {
3987           id_base *idb = get_operator ((const char *)CPP_HASHNODE
3988                                       (token->val.node.node)->ident.str);
3989           user_id *p;
3990           if (idb && (p = dyn_cast<user_id *> (idb)) && p->is_oper_list)
3991             record_operlist (token->src_loc, p);
3992         }
3993
3994       /* Record the token.  */
3995       code.safe_push (*token);
3996     }
3997   while (1);
3998   return new c_expr (r, loc, code, nr_stmts, vNULL, capture_ids);
3999 }
4000
4001 /* Parse an operand which is either an expression, a predicate or
4002    a standalone capture.
4003      op = predicate | expr | c_expr | capture  */
4004
4005 struct operand *
4006 parser::parse_op ()
4007 {
4008   const cpp_token *token = peek ();
4009   struct operand *op = NULL;
4010   if (token->type == CPP_OPEN_PAREN)
4011     {
4012       eat_token (CPP_OPEN_PAREN);
4013       op = parse_expr ();
4014       eat_token (CPP_CLOSE_PAREN);
4015     }
4016   else if (token->type == CPP_OPEN_BRACE)
4017     {
4018       op = parse_c_expr (CPP_OPEN_BRACE);
4019     }
4020   else
4021     {
4022       /* Remaining ops are either empty or predicates  */
4023       if (token->type == CPP_NAME)
4024         {
4025           const char *id = get_ident ();
4026           id_base *opr = get_operator (id);
4027           if (!opr)
4028             fatal_at (token, "expected predicate name");
4029           if (operator_id *code = dyn_cast <operator_id *> (opr))
4030             {
4031               if (code->nargs != 0)
4032                 fatal_at (token, "using an operator with operands as predicate");
4033               /* Parse the zero-operand operator "predicates" as
4034                  expression.  */
4035               op = new expr (opr, token->src_loc);
4036             }
4037           else if (user_id *code = dyn_cast <user_id *> (opr))
4038             {
4039               if (code->nargs != 0)
4040                 fatal_at (token, "using an operator with operands as predicate");
4041               /* Parse the zero-operand operator "predicates" as
4042                  expression.  */
4043               op = new expr (opr, token->src_loc);
4044             }
4045           else if (predicate_id *p = dyn_cast <predicate_id *> (opr))
4046             op = new predicate (p, token->src_loc);
4047           else
4048             fatal_at (token, "using an unsupported operator as predicate");
4049           if (!parsing_match_operand)
4050             fatal_at (token, "predicates are only allowed in match expression");
4051           token = peek ();
4052           if (token->flags & PREV_WHITE)
4053             return op;
4054         }
4055       else if (token->type != CPP_COLON
4056                && token->type != CPP_ATSIGN)
4057         fatal_at (token, "expected expression or predicate");
4058       /* optionally followed by a capture and a predicate.  */
4059       if (token->type == CPP_COLON)
4060         fatal_at (token, "not implemented: predicate on leaf operand");
4061       if (token->type == CPP_ATSIGN)
4062         op = parse_capture (op, !parsing_match_operand);
4063     }
4064
4065   return op;
4066 }
4067
4068 /* Create a new simplify from the current parsing state and MATCH,
4069    MATCH_LOC, RESULT and RESULT_LOC and push it to SIMPLIFIERS.  */
4070
4071 void
4072 parser::push_simplify (simplify::simplify_kind kind,
4073                        vec<simplify *>& simplifiers,
4074                        operand *match, operand *result)
4075 {
4076   /* Build and push a temporary for operator list uses in expressions.  */
4077   if (!oper_lists.is_empty ())
4078     active_fors.safe_push (oper_lists);
4079
4080   simplifiers.safe_push
4081     (new simplify (kind, match, result,
4082                    active_fors.copy (), capture_ids));
4083
4084   if (!oper_lists.is_empty ())
4085     active_fors.pop ();
4086 }
4087
4088 /* Parse
4089      <result-op> = <op> | <if> | <with>
4090      <if> = '(' 'if' '(' <c-expr> ')' <result-op> ')'
4091      <with> = '(' 'with' '{' <c-expr> '}' <result-op> ')'
4092    and return it.  */
4093
4094 operand *
4095 parser::parse_result (operand *result, predicate_id *matcher)
4096 {
4097   const cpp_token *token = peek ();
4098   if (token->type != CPP_OPEN_PAREN)
4099     return parse_op ();
4100
4101   eat_token (CPP_OPEN_PAREN);
4102   if (peek_ident ("if"))
4103     {
4104       eat_ident ("if");
4105       if_expr *ife = new if_expr (token->src_loc);
4106       ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4107       if (peek ()->type == CPP_OPEN_PAREN)
4108         {
4109           ife->trueexpr = parse_result (result, matcher);
4110           if (peek ()->type == CPP_OPEN_PAREN)
4111             ife->falseexpr = parse_result (result, matcher);
4112           else if (peek ()->type != CPP_CLOSE_PAREN)
4113             ife->falseexpr = parse_op ();
4114         }
4115       else if (peek ()->type != CPP_CLOSE_PAREN)
4116         {
4117           ife->trueexpr = parse_op ();
4118           if (peek ()->type == CPP_OPEN_PAREN)
4119             ife->falseexpr = parse_result (result, matcher);
4120           else if (peek ()->type != CPP_CLOSE_PAREN)
4121             ife->falseexpr = parse_op ();
4122         }
4123       /* If this if is immediately closed then it contains a
4124          manual matcher or is part of a predicate definition.  */
4125       else /* if (peek ()->type == CPP_CLOSE_PAREN) */
4126         {
4127           if (!matcher)
4128             fatal_at (peek (), "manual transform not implemented");
4129           ife->trueexpr = result;
4130         }
4131       eat_token (CPP_CLOSE_PAREN);
4132       return ife;
4133     }
4134   else if (peek_ident ("with"))
4135     {
4136       eat_ident ("with");
4137       with_expr *withe = new with_expr (token->src_loc);
4138       /* Parse (with c-expr expr) as (if-with (true) expr).  */
4139       withe->with = parse_c_expr (CPP_OPEN_BRACE);
4140       withe->with->nr_stmts = 0;
4141       withe->subexpr = parse_result (result, matcher);
4142       eat_token (CPP_CLOSE_PAREN);
4143       return withe;
4144     }
4145   else if (peek_ident ("switch"))
4146     {
4147       token = eat_ident ("switch");
4148       source_location ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
4149       eat_ident ("if");
4150       if_expr *ife = new if_expr (ifloc);
4151       operand *res = ife;
4152       ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4153       if (peek ()->type == CPP_OPEN_PAREN)
4154         ife->trueexpr = parse_result (result, matcher);
4155       else
4156         ife->trueexpr = parse_op ();
4157       eat_token (CPP_CLOSE_PAREN);
4158       if (peek ()->type != CPP_OPEN_PAREN
4159           || !peek_ident ("if", 2))
4160         fatal_at (token, "switch can be implemented with a single if");
4161       while  (peek ()->type != CPP_CLOSE_PAREN)
4162         {
4163           if (peek ()->type == CPP_OPEN_PAREN)
4164             {
4165               if (peek_ident ("if", 2))
4166                 {
4167                   ifloc = eat_token (CPP_OPEN_PAREN)->src_loc;
4168                   eat_ident ("if");
4169                   ife->falseexpr = new if_expr (ifloc);
4170                   ife = as_a <if_expr *> (ife->falseexpr);
4171                   ife->cond = parse_c_expr (CPP_OPEN_PAREN);
4172                   if (peek ()->type == CPP_OPEN_PAREN)
4173                     ife->trueexpr = parse_result (result, matcher);
4174                   else
4175                     ife->trueexpr = parse_op ();
4176                   eat_token (CPP_CLOSE_PAREN);
4177                 }
4178               else
4179                 {
4180                   /* switch default clause */
4181                   ife->falseexpr = parse_result (result, matcher);
4182                   eat_token (CPP_CLOSE_PAREN);
4183                   return res;
4184                 }
4185             }
4186           else
4187             {
4188               /* switch default clause */
4189               ife->falseexpr = parse_op ();
4190               eat_token (CPP_CLOSE_PAREN);
4191               return res;
4192             }
4193         }
4194       eat_token (CPP_CLOSE_PAREN);
4195       return res;
4196     }
4197   else
4198     {
4199       operand *op = result;
4200       if (!matcher)
4201         op = parse_expr ();
4202       eat_token (CPP_CLOSE_PAREN);
4203       return op;
4204     }
4205 }
4206
4207 /* Parse
4208      simplify = 'simplify' <expr> <result-op>
4209    or
4210      match = 'match' <ident> <expr> [<result-op>]
4211    and fill SIMPLIFIERS with the results.  */
4212
4213 void
4214 parser::parse_simplify (simplify::simplify_kind kind,
4215                         vec<simplify *>& simplifiers, predicate_id *matcher,
4216                         operand *result)
4217 {
4218   /* Reset the capture map.  */
4219   if (!capture_ids)
4220     capture_ids = new cid_map_t;
4221   /* Reset oper_lists and set.  */
4222   hash_set <user_id *> olist;
4223   oper_lists_set = &olist;
4224   oper_lists = vNULL;
4225
4226   const cpp_token *loc = peek ();
4227   parsing_match_operand = true;
4228   struct operand *match = parse_op ();
4229   parsing_match_operand = false;
4230   if (match->type == operand::OP_CAPTURE && !matcher)
4231     fatal_at (loc, "outermost expression cannot be captured");
4232   if (match->type == operand::OP_EXPR
4233       && is_a <predicate_id *> (as_a <expr *> (match)->operation))
4234     fatal_at (loc, "outermost expression cannot be a predicate");
4235
4236   /* Splice active_ifs onto result and continue parsing the
4237      "then" expr.  */
4238   if_expr *active_if = NULL;
4239   for (int i = active_ifs.length (); i > 0; --i)
4240     {
4241       if_expr *ifc = new if_expr (active_ifs[i-1]->location);
4242       ifc->cond = active_ifs[i-1];
4243       ifc->trueexpr = active_if;
4244       active_if = ifc;
4245     }
4246   if_expr *outermost_if = active_if;
4247   while (active_if && active_if->trueexpr)
4248     active_if = as_a <if_expr *> (active_if->trueexpr);
4249
4250   const cpp_token *token = peek ();
4251
4252   /* If this if is immediately closed then it is part of a predicate
4253      definition.  Push it.  */
4254   if (token->type == CPP_CLOSE_PAREN)
4255     {
4256       if (!matcher)
4257         fatal_at (token, "expected transform expression");
4258       if (active_if)
4259         {
4260           active_if->trueexpr = result;
4261           result = outermost_if;
4262         }
4263       push_simplify (kind, simplifiers, match, result);
4264       return;
4265     }
4266
4267   operand *tem = parse_result (result, matcher);
4268   if (active_if)
4269     {
4270       active_if->trueexpr = tem;
4271       result = outermost_if;
4272     }
4273   else
4274     result = tem;
4275
4276   push_simplify (kind, simplifiers, match, result);
4277 }
4278
4279 /* Parsing of the outer control structures.  */
4280
4281 /* Parse a for expression
4282      for = '(' 'for' <subst>... <pattern> ')'
4283      subst = <ident> '(' <ident>... ')'  */
4284
4285 void
4286 parser::parse_for (source_location)
4287 {
4288   auto_vec<const cpp_token *> user_id_tokens;
4289   vec<user_id *> user_ids = vNULL;
4290   const cpp_token *token;
4291   unsigned min_n_opers = 0, max_n_opers = 0;
4292
4293   while (1)
4294     {
4295       token = peek ();
4296       if (token->type != CPP_NAME)
4297         break;
4298
4299       /* Insert the user defined operators into the operator hash.  */
4300       const char *id = get_ident ();
4301       if (get_operator (id, true) != NULL)
4302         fatal_at (token, "operator already defined");
4303       user_id *op = new user_id (id);
4304       id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
4305       *slot = op;
4306       user_ids.safe_push (op);
4307       user_id_tokens.safe_push (token);
4308
4309       eat_token (CPP_OPEN_PAREN);
4310
4311       int arity = -1;
4312       while ((token = peek_ident ()) != 0)
4313         {
4314           const char *oper = get_ident ();
4315           id_base *idb = get_operator (oper, true);
4316           if (idb == NULL)
4317             fatal_at (token, "no such operator '%s'", oper);
4318           if (*idb == CONVERT0 || *idb == CONVERT1 || *idb == CONVERT2
4319               || *idb == VIEW_CONVERT0 || *idb == VIEW_CONVERT1
4320               || *idb == VIEW_CONVERT2)
4321             fatal_at (token, "conditional operators cannot be used inside for");
4322
4323           if (arity == -1)
4324             arity = idb->nargs;
4325           else if (idb->nargs == -1)
4326             ;
4327           else if (idb->nargs != arity)
4328             fatal_at (token, "operator '%s' with arity %d does not match "
4329                       "others with arity %d", oper, idb->nargs, arity);
4330
4331           user_id *p = dyn_cast<user_id *> (idb);
4332           if (p)
4333             {
4334               if (p->is_oper_list)
4335                 op->substitutes.safe_splice (p->substitutes);
4336               else
4337                 fatal_at (token, "iterator cannot be used as operator-list");
4338             }
4339           else 
4340             op->substitutes.safe_push (idb);
4341         }
4342       op->nargs = arity;
4343       token = expect (CPP_CLOSE_PAREN);
4344
4345       unsigned nsubstitutes = op->substitutes.length ();
4346       if (nsubstitutes == 0)
4347         fatal_at (token, "A user-defined operator must have at least "
4348                   "one substitution");
4349       if (max_n_opers == 0)
4350         {
4351           min_n_opers = nsubstitutes;
4352           max_n_opers = nsubstitutes;
4353         }
4354       else
4355         {
4356           if (nsubstitutes % min_n_opers != 0
4357               && min_n_opers % nsubstitutes != 0)
4358             fatal_at (token, "All user-defined identifiers must have a "
4359                       "multiple number of operator substitutions of the "
4360                       "smallest number of substitutions");
4361           if (nsubstitutes < min_n_opers)
4362             min_n_opers = nsubstitutes;
4363           else if (nsubstitutes > max_n_opers)
4364             max_n_opers = nsubstitutes;
4365         }
4366     }
4367
4368   unsigned n_ids = user_ids.length ();
4369   if (n_ids == 0)
4370     fatal_at (token, "for requires at least one user-defined identifier");
4371
4372   token = peek ();
4373   if (token->type == CPP_CLOSE_PAREN)
4374     fatal_at (token, "no pattern defined in for");
4375
4376   active_fors.safe_push (user_ids);
4377   while (1)
4378     {
4379       token = peek ();
4380       if (token->type == CPP_CLOSE_PAREN)
4381         break;
4382       parse_pattern ();
4383     }
4384   active_fors.pop ();
4385
4386   /* Remove user-defined operators from the hash again.  */
4387   for (unsigned i = 0; i < user_ids.length (); ++i)
4388     {
4389       if (!user_ids[i]->used)
4390         warning_at (user_id_tokens[i],
4391                     "operator %s defined but not used", user_ids[i]->id);
4392       operators->remove_elt (user_ids[i]);
4393     }
4394 }
4395
4396 /* Parse an identifier associated with a list of operators.
4397      oprs = '(' 'define_operator_list' <ident> <ident>... ')'  */
4398
4399 void
4400 parser::parse_operator_list (source_location)
4401 {
4402   const cpp_token *token = peek (); 
4403   const char *id = get_ident ();
4404
4405   if (get_operator (id, true) != 0)
4406     fatal_at (token, "operator %s already defined", id);
4407
4408   user_id *op = new user_id (id, true);
4409   int arity = -1;
4410   
4411   while ((token = peek_ident ()) != 0)
4412     {
4413       token = peek (); 
4414       const char *oper = get_ident ();
4415       id_base *idb = get_operator (oper, true);
4416       
4417       if (idb == 0)
4418         fatal_at (token, "no such operator '%s'", oper);
4419
4420       if (arity == -1)
4421         arity = idb->nargs;
4422       else if (idb->nargs == -1)
4423         ;
4424       else if (arity != idb->nargs)
4425         fatal_at (token, "operator '%s' with arity %d does not match "
4426                          "others with arity %d", oper, idb->nargs, arity);
4427
4428       /* We allow composition of multiple operator lists.  */
4429       if (user_id *p = dyn_cast<user_id *> (idb))
4430         op->substitutes.safe_splice (p->substitutes);
4431       else
4432         op->substitutes.safe_push (idb);
4433     }
4434
4435   // Check that there is no junk after id-list
4436   token = peek();
4437   if (token->type != CPP_CLOSE_PAREN)
4438     fatal_at (token, "expected identifier got %s", cpp_type2name (token->type, 0));
4439
4440   if (op->substitutes.length () == 0)
4441     fatal_at (token, "operator-list cannot be empty");
4442
4443   op->nargs = arity;
4444   id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT);
4445   *slot = op;
4446 }
4447
4448 /* Parse an outer if expression.
4449      if = '(' 'if' '(' <c-expr> ')' <pattern> ')'  */
4450
4451 void
4452 parser::parse_if (source_location)
4453 {
4454   c_expr *ifexpr = parse_c_expr (CPP_OPEN_PAREN);
4455
4456   const cpp_token *token = peek ();
4457   if (token->type == CPP_CLOSE_PAREN)
4458     fatal_at (token, "no pattern defined in if");
4459
4460   active_ifs.safe_push (ifexpr);
4461   while (1)
4462     {
4463       const cpp_token *token = peek ();
4464       if (token->type == CPP_CLOSE_PAREN)
4465         break;
4466
4467       parse_pattern ();
4468     }
4469   active_ifs.pop ();
4470 }
4471
4472 /* Parse a list of predefined predicate identifiers.
4473      preds = '(' 'define_predicates' <ident>... ')'  */
4474
4475 void
4476 parser::parse_predicates (source_location)
4477 {
4478   do
4479     {
4480       const cpp_token *token = peek ();
4481       if (token->type != CPP_NAME)
4482         break;
4483
4484       add_predicate (get_ident ());
4485     }
4486   while (1);
4487 }
4488
4489 /* Parse outer control structures.
4490      pattern = <preds>|<for>|<if>|<simplify>|<match>  */
4491
4492 void
4493 parser::parse_pattern ()
4494 {
4495   /* All clauses start with '('.  */
4496   eat_token (CPP_OPEN_PAREN);
4497   const cpp_token *token = peek ();
4498   const char *id = get_ident ();
4499   if (strcmp (id, "simplify") == 0)
4500     {
4501       parse_simplify (simplify::SIMPLIFY, simplifiers, NULL, NULL);
4502       capture_ids = NULL;
4503     }
4504   else if (strcmp (id, "match") == 0)
4505     {
4506       bool with_args = false;
4507       source_location e_loc = peek ()->src_loc;
4508       if (peek ()->type == CPP_OPEN_PAREN)
4509         {
4510           eat_token (CPP_OPEN_PAREN);
4511           with_args = true;
4512         }
4513       const char *name = get_ident ();
4514       id_base *id = get_operator (name);
4515       predicate_id *p;
4516       if (!id)
4517         {
4518           p = add_predicate (name);
4519           user_predicates.safe_push (p);
4520         }
4521       else if ((p = dyn_cast <predicate_id *> (id)))
4522         ;
4523       else
4524         fatal_at (token, "cannot add a match to a non-predicate ID");
4525       /* Parse (match <id> <arg>... (match-expr)) here.  */
4526       expr *e = NULL;
4527       if (with_args)
4528         {
4529           capture_ids = new cid_map_t;
4530           e = new expr (p, e_loc);
4531           while (peek ()->type == CPP_ATSIGN)
4532             e->append_op (parse_capture (NULL, false));
4533           eat_token (CPP_CLOSE_PAREN);
4534         }
4535       if (p->nargs != -1
4536           && ((e && e->ops.length () != (unsigned)p->nargs)
4537               || (!e && p->nargs != 0)))
4538         fatal_at (token, "non-matching number of match operands");
4539       p->nargs = e ? e->ops.length () : 0;
4540       parse_simplify (simplify::MATCH, p->matchers, p, e);
4541       capture_ids = NULL;
4542     }
4543   else if (strcmp (id, "for") == 0)
4544     parse_for (token->src_loc);
4545   else if (strcmp (id, "if") == 0)
4546     parse_if (token->src_loc);
4547   else if (strcmp (id, "define_predicates") == 0)
4548     {
4549       if (active_ifs.length () > 0
4550           || active_fors.length () > 0)
4551         fatal_at (token, "define_predicates inside if or for is not supported");
4552       parse_predicates (token->src_loc);
4553     }
4554   else if (strcmp (id, "define_operator_list") == 0)
4555     {
4556       if (active_ifs.length () > 0
4557           || active_fors.length () > 0)
4558         fatal_at (token, "operator-list inside if or for is not supported");
4559       parse_operator_list (token->src_loc);
4560     }
4561   else
4562     fatal_at (token, "expected %s'simplify', 'match', 'for' or 'if'",
4563               active_ifs.length () == 0 && active_fors.length () == 0
4564               ? "'define_predicates', " : "");
4565
4566   eat_token (CPP_CLOSE_PAREN);
4567 }
4568
4569 /* Main entry of the parser.  Repeatedly parse outer control structures.  */
4570
4571 parser::parser (cpp_reader *r_)
4572 {
4573   r = r_;
4574   active_ifs = vNULL;
4575   active_fors = vNULL;
4576   simplifiers = vNULL;
4577   oper_lists_set = NULL;
4578   oper_lists = vNULL;
4579   capture_ids = NULL;
4580   user_predicates = vNULL;
4581   parsing_match_operand = false;
4582
4583   const cpp_token *token = next ();
4584   while (token->type != CPP_EOF)
4585     {
4586       _cpp_backup_tokens (r, 1);
4587       parse_pattern ();
4588       token = next ();
4589     }
4590 }
4591
4592
4593 /* Helper for the linemap code.  */
4594
4595 static size_t
4596 round_alloc_size (size_t s)
4597 {
4598   return s;
4599 }
4600
4601
4602 /* The genmatch generator progam.  It reads from a pattern description
4603    and outputs GIMPLE or GENERIC IL matching and simplification routines.  */
4604
4605 int
4606 main (int argc, char **argv)
4607 {
4608   cpp_reader *r;
4609
4610   progname = "genmatch";
4611
4612   if (argc < 2)
4613     return 1;
4614
4615   bool gimple = true;
4616   char *input = argv[argc-1];
4617   for (int i = 1; i < argc - 1; ++i)
4618     {
4619       if (strcmp (argv[i], "--gimple") == 0)
4620         gimple = true;
4621       else if (strcmp (argv[i], "--generic") == 0)
4622         gimple = false;
4623       else if (strcmp (argv[i], "-v") == 0)
4624         verbose = 1;
4625       else if (strcmp (argv[i], "-vv") == 0)
4626         verbose = 2;
4627       else
4628         {
4629           fprintf (stderr, "Usage: genmatch "
4630                    "[--gimple] [--generic] [-v[v]] input\n");
4631           return 1;
4632         }
4633     }
4634
4635   line_table = XCNEW (struct line_maps);
4636   linemap_init (line_table, 0);
4637   line_table->reallocator = xrealloc;
4638   line_table->round_alloc_size = round_alloc_size;
4639
4640   r = cpp_create_reader (CLK_GNUC99, NULL, line_table);
4641   cpp_callbacks *cb = cpp_get_callbacks (r);
4642   cb->error = error_cb;
4643
4644   /* Add the build directory to the #include "" search path.  */
4645   cpp_dir *dir = XCNEW (cpp_dir);
4646   dir->name = getpwd ();
4647   if (!dir->name)
4648     dir->name = ASTRDUP (".");
4649   cpp_set_include_chains (r, dir, NULL, false);
4650
4651   if (!cpp_read_main_file (r, input))
4652     return 1;
4653   cpp_define (r, gimple ? "GIMPLE=1": "GENERIC=1");
4654   cpp_define (r, gimple ? "GENERIC=0": "GIMPLE=0");
4655
4656   null_id = new id_base (id_base::NULL_ID, "null");
4657
4658   /* Pre-seed operators.  */
4659   operators = new hash_table<id_base> (1024);
4660 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
4661   add_operator (SYM, # SYM, # TYPE, NARGS);
4662 #define END_OF_BASE_TREE_CODES
4663 #include "tree.def"
4664 add_operator (CONVERT0, "convert0", "tcc_unary", 1);
4665 add_operator (CONVERT1, "convert1", "tcc_unary", 1);
4666 add_operator (CONVERT2, "convert2", "tcc_unary", 1);
4667 add_operator (VIEW_CONVERT0, "view_convert0", "tcc_unary", 1);
4668 add_operator (VIEW_CONVERT1, "view_convert1", "tcc_unary", 1);
4669 add_operator (VIEW_CONVERT2, "view_convert2", "tcc_unary", 1);
4670 #undef END_OF_BASE_TREE_CODES
4671 #undef DEFTREECODE
4672
4673   /* Pre-seed builtin functions.
4674      ???  Cannot use N (name) as that is targetm.emultls.get_address
4675      for BUILT_IN_EMUTLS_GET_ADDRESS ... */
4676 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) \
4677   add_function (ENUM, "CFN_" # ENUM);
4678 #include "builtins.def"
4679
4680 #define DEF_INTERNAL_FN(CODE, NAME, FNSPEC) \
4681   add_function (IFN_##CODE, "CFN_" #CODE);
4682 #include "internal-fn.def"
4683
4684   /* Parse ahead!  */
4685   parser p (r);
4686
4687   if (gimple)
4688     write_header (stdout, "gimple-match-head.c");
4689   else
4690     write_header (stdout, "generic-match-head.c");
4691
4692   /* Go over all predicates defined with patterns and perform
4693      lowering and code generation.  */
4694   for (unsigned i = 0; i < p.user_predicates.length (); ++i)
4695     {
4696       predicate_id *pred = p.user_predicates[i];
4697       lower (pred->matchers, gimple);
4698
4699       if (verbose == 2)
4700         for (unsigned i = 0; i < pred->matchers.length (); ++i)
4701           print_matches (pred->matchers[i]);
4702
4703       decision_tree dt;
4704       for (unsigned i = 0; i < pred->matchers.length (); ++i)
4705         dt.insert (pred->matchers[i], i);
4706
4707       if (verbose == 2)
4708         dt.print (stderr);
4709
4710       write_predicate (stdout, pred, dt, gimple);
4711     }
4712
4713   /* Lower the main simplifiers and generate code for them.  */
4714   lower (p.simplifiers, gimple);
4715
4716   if (verbose == 2)
4717     for (unsigned i = 0; i < p.simplifiers.length (); ++i)
4718       print_matches (p.simplifiers[i]);
4719
4720   decision_tree dt;
4721   for (unsigned i = 0; i < p.simplifiers.length (); ++i)
4722     dt.insert (p.simplifiers[i], i);
4723
4724   if (verbose == 2)
4725     dt.print (stderr);
4726
4727   dt.gen (stdout, gimple);
4728
4729   /* Finalize.  */
4730   cpp_finish (r, NULL);
4731   cpp_destroy (r);
4732
4733   delete operators;
4734
4735   return 0;
4736 }