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