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