1 /* Generate pattern matching and transform code shared between
2 GENERIC and GIMPLE folding code from match-and-simplify description.
4 Copyright (C) 2014-2016 Free Software Foundation, Inc.
5 Contributed by Richard Biener <rguenther@suse.de>
6 and Prathamesh Kulkarni <bilbotheelffriend@gmail.com>
8 This file is part of GCC.
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
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
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/>. */
26 #include "coretypes.h"
29 #include "hash-table.h"
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
)
40 void ggc_free (void *)
47 /* Verboseness. 0 is quiet, 1 adds some warnings, 2 is for debugging. */
53 static struct line_maps
*line_table
;
55 /* The rich_location class within libcpp requires a way to expand
56 source_location instances, and relies on the client code
57 providing a symbol named
58 linemap_client_expand_location_to_spelling_point
61 This is the implementation for genmatch. */
64 linemap_client_expand_location_to_spelling_point (source_location loc
)
66 const struct line_map_ordinary
*map
;
67 loc
= linemap_resolve_location (line_table
, loc
, LRK_SPELLING_LOCATION
, &map
);
68 return linemap_expand_location (line_table
, map
, loc
);
72 #if GCC_VERSION >= 4001
73 __attribute__((format (printf
, 5, 0)))
75 error_cb (cpp_reader
*, int errtype
, int, rich_location
*richloc
,
76 const char *msg
, va_list *ap
)
78 const line_map_ordinary
*map
;
79 source_location location
= richloc
->get_loc ();
80 linemap_resolve_location (line_table
, location
, LRK_SPELLING_LOCATION
, &map
);
81 expanded_location loc
= linemap_expand_location (line_table
, map
, location
);
82 fprintf (stderr
, "%s:%d:%d %s: ", loc
.file
, loc
.line
, loc
.column
,
83 (errtype
== CPP_DL_WARNING
) ? "warning" : "error");
84 vfprintf (stderr
, msg
, *ap
);
85 fprintf (stderr
, "\n");
86 FILE *f
= fopen (loc
.file
, "r");
92 if (!fgets (buf
, 128, f
))
94 if (buf
[strlen (buf
) - 1] != '\n')
101 fprintf (stderr
, "%s", buf
);
102 for (int i
= 0; i
< loc
.column
- 1; ++i
)
105 fputc ('\n', stderr
);
110 if (errtype
== CPP_DL_FATAL
)
116 #if GCC_VERSION >= 4001
117 __attribute__((format (printf
, 2, 3)))
119 fatal_at (const cpp_token
*tk
, const char *msg
, ...)
121 rich_location
richloc (line_table
, tk
->src_loc
);
124 error_cb (NULL
, CPP_DL_FATAL
, 0, &richloc
, msg
, &ap
);
129 #if GCC_VERSION >= 4001
130 __attribute__((format (printf
, 2, 3)))
132 fatal_at (source_location loc
, const char *msg
, ...)
134 rich_location
richloc (line_table
, loc
);
137 error_cb (NULL
, CPP_DL_FATAL
, 0, &richloc
, msg
, &ap
);
142 #if GCC_VERSION >= 4001
143 __attribute__((format (printf
, 2, 3)))
145 warning_at (const cpp_token
*tk
, const char *msg
, ...)
147 rich_location
richloc (line_table
, tk
->src_loc
);
150 error_cb (NULL
, CPP_DL_WARNING
, 0, &richloc
, msg
, &ap
);
155 #if GCC_VERSION >= 4001
156 __attribute__((format (printf
, 2, 3)))
158 warning_at (source_location loc
, const char *msg
, ...)
160 rich_location
richloc (line_table
, loc
);
163 error_cb (NULL
, CPP_DL_WARNING
, 0, &richloc
, msg
, &ap
);
167 /* Like fprintf, but print INDENT spaces at the beginning. */
170 #if GCC_VERSION >= 4001
171 __attribute__((format (printf
, 3, 4)))
173 fprintf_indent (FILE *f
, unsigned int indent
, const char *format
, ...)
176 for (; indent
>= 8; indent
-= 8)
178 fprintf (f
, "%*s", indent
, "");
179 va_start (ap
, format
);
180 vfprintf (f
, format
, ap
);
185 output_line_directive (FILE *f
, source_location location
,
186 bool dumpfile
= false)
188 const line_map_ordinary
*map
;
189 linemap_resolve_location (line_table
, location
, LRK_SPELLING_LOCATION
, &map
);
190 expanded_location loc
= linemap_expand_location (line_table
, map
, location
);
193 /* When writing to a dumpfile only dump the filename. */
194 const char *file
= strrchr (loc
.file
, DIR_SEPARATOR
);
199 fprintf (f
, "%s:%d", file
, loc
.line
);
202 /* Other gen programs really output line directives here, at least for
203 development it's right now more convenient to have line information
204 from the generated file. Still keep the directives as comment for now
205 to easily back-point to the meta-description. */
206 fprintf (f
, "/* #line %d \"%s\" */\n", loc
.line
, loc
.file
);
210 /* Pull in tree codes and builtin function codes from their
213 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) SYM,
226 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) ENUM,
227 enum built_in_function
{
228 #include "builtins.def"
232 #define DEF_INTERNAL_FN(CODE, FLAGS, FNSPEC) IFN_##CODE,
234 #include "internal-fn.def"
238 /* Return true if CODE represents a commutative tree code. Otherwise
241 commutative_tree_code (enum tree_code code
)
247 case MULT_HIGHPART_EXPR
:
262 case WIDEN_MULT_EXPR
:
263 case VEC_WIDEN_MULT_HI_EXPR
:
264 case VEC_WIDEN_MULT_LO_EXPR
:
265 case VEC_WIDEN_MULT_EVEN_EXPR
:
266 case VEC_WIDEN_MULT_ODD_EXPR
:
275 /* Return true if CODE represents a ternary tree code for which the
276 first two operands are commutative. Otherwise return false. */
278 commutative_ternary_tree_code (enum tree_code code
)
282 case WIDEN_MULT_PLUS_EXPR
:
283 case WIDEN_MULT_MINUS_EXPR
:
294 /* Return true if CODE is a comparison. */
297 comparison_code_p (enum tree_code code
)
324 /* Base class for all identifiers the parser knows. */
326 struct id_base
: nofree_ptr_hash
<id_base
>
328 enum id_kind
{ CODE
, FN
, PREDICATE
, USER
, NULL_ID
} kind
;
330 id_base (id_kind
, const char *, int = -1);
336 /* hash_table support. */
337 static inline hashval_t
hash (const id_base
*);
338 static inline int equal (const id_base
*, const id_base
*);
342 id_base::hash (const id_base
*op
)
348 id_base::equal (const id_base
*op1
,
351 return (op1
->hashval
== op2
->hashval
352 && strcmp (op1
->id
, op2
->id
) == 0);
355 /* The special id "null", which matches nothing. */
356 static id_base
*null_id
;
358 /* Hashtable of known pattern operators. This is pre-seeded from
359 all known tree codes and all known builtin function ids. */
360 static hash_table
<id_base
> *operators
;
362 id_base::id_base (id_kind kind_
, const char *id_
, int nargs_
)
367 hashval
= htab_hash_string (id
);
370 /* Identifier that maps to a tree code. */
372 struct operator_id
: public id_base
374 operator_id (enum tree_code code_
, const char *id_
, unsigned nargs_
,
376 : id_base (id_base::CODE
, id_
, nargs_
), code (code_
), tcc (tcc_
) {}
381 /* Identifier that maps to a builtin or internal function code. */
383 struct fn_id
: public id_base
385 fn_id (enum built_in_function fn_
, const char *id_
)
386 : id_base (id_base::FN
, id_
), fn (fn_
) {}
387 fn_id (enum internal_fn fn_
, const char *id_
)
388 : id_base (id_base::FN
, id_
), fn (int (END_BUILTINS
) + int (fn_
)) {}
394 /* Identifier that maps to a user-defined predicate. */
396 struct predicate_id
: public id_base
398 predicate_id (const char *id_
)
399 : id_base (id_base::PREDICATE
, id_
), matchers (vNULL
) {}
400 vec
<simplify
*> matchers
;
403 /* Identifier that maps to a operator defined by a 'for' directive. */
405 struct user_id
: public id_base
407 user_id (const char *id_
, bool is_oper_list_
= false)
408 : id_base (id_base::USER
, id_
), substitutes (vNULL
),
409 used (false), is_oper_list (is_oper_list_
) {}
410 vec
<id_base
*> substitutes
;
418 is_a_helper
<fn_id
*>::test (id_base
*id
)
420 return id
->kind
== id_base::FN
;
426 is_a_helper
<operator_id
*>::test (id_base
*id
)
428 return id
->kind
== id_base::CODE
;
434 is_a_helper
<predicate_id
*>::test (id_base
*id
)
436 return id
->kind
== id_base::PREDICATE
;
442 is_a_helper
<user_id
*>::test (id_base
*id
)
444 return id
->kind
== id_base::USER
;
447 /* Add a predicate identifier to the hash. */
449 static predicate_id
*
450 add_predicate (const char *id
)
452 predicate_id
*p
= new predicate_id (id
);
453 id_base
**slot
= operators
->find_slot_with_hash (p
, p
->hashval
, INSERT
);
455 fatal ("duplicate id definition");
460 /* Add a tree code identifier to the hash. */
463 add_operator (enum tree_code code
, const char *id
,
464 const char *tcc
, unsigned nargs
)
466 if (strcmp (tcc
, "tcc_unary") != 0
467 && strcmp (tcc
, "tcc_binary") != 0
468 && strcmp (tcc
, "tcc_comparison") != 0
469 && strcmp (tcc
, "tcc_expression") != 0
470 /* For {REAL,IMAG}PART_EXPR and VIEW_CONVERT_EXPR. */
471 && strcmp (tcc
, "tcc_reference") != 0
472 /* To have INTEGER_CST and friends as "predicate operators". */
473 && strcmp (tcc
, "tcc_constant") != 0
474 /* And allow CONSTRUCTOR for vector initializers. */
475 && !(code
== CONSTRUCTOR
)
476 /* Allow SSA_NAME as predicate operator. */
477 && !(code
== SSA_NAME
))
479 /* Treat ADDR_EXPR as atom, thus don't allow matching its operand. */
480 if (code
== ADDR_EXPR
)
482 operator_id
*op
= new operator_id (code
, id
, nargs
, tcc
);
483 id_base
**slot
= operators
->find_slot_with_hash (op
, op
->hashval
, INSERT
);
485 fatal ("duplicate id definition");
489 /* Add a built-in or internal function identifier to the hash. ID is
490 the name of its CFN_* enumeration value. */
492 template <typename T
>
494 add_function (T code
, const char *id
)
496 fn_id
*fn
= new fn_id (code
, id
);
497 id_base
**slot
= operators
->find_slot_with_hash (fn
, fn
->hashval
, INSERT
);
499 fatal ("duplicate id definition");
503 /* Helper for easy comparing ID with tree code CODE. */
506 operator==(id_base
&id
, enum tree_code code
)
508 if (operator_id
*oid
= dyn_cast
<operator_id
*> (&id
))
509 return oid
->code
== code
;
513 /* Lookup the identifier ID. Allow "null" if ALLOW_NULL. */
516 get_operator (const char *id
, bool allow_null
= false)
518 if (allow_null
&& strcmp (id
, "null") == 0)
521 id_base
tem (id_base::CODE
, id
);
523 id_base
*op
= operators
->find_with_hash (&tem
, tem
.hashval
);
526 /* If this is a user-defined identifier track whether it was used. */
527 if (user_id
*uid
= dyn_cast
<user_id
*> (op
))
533 bool all_upper
= true;
534 bool all_lower
= true;
535 for (unsigned int i
= 0; id
[i
]; ++i
)
538 else if (ISLOWER (id
[i
]))
542 /* Try in caps with _EXPR appended. */
543 id2
= ACONCAT ((id
, "_EXPR", NULL
));
544 for (unsigned int i
= 0; id2
[i
]; ++i
)
545 id2
[i
] = TOUPPER (id2
[i
]);
547 else if (all_upper
&& strncmp (id
, "IFN_", 4) == 0)
548 /* Try CFN_ instead of IFN_. */
549 id2
= ACONCAT (("CFN_", id
+ 4, NULL
));
550 else if (all_upper
&& strncmp (id
, "BUILT_IN_", 9) == 0)
551 /* Try prepending CFN_. */
552 id2
= ACONCAT (("CFN_", id
, NULL
));
556 new (&tem
) id_base (id_base::CODE
, id2
);
557 return operators
->find_with_hash (&tem
, tem
.hashval
);
560 /* Return the comparison operators that results if the operands are
561 swapped. This is safe for floating-point. */
564 swap_tree_comparison (operator_id
*p
)
576 return get_operator ("LT_EXPR");
578 return get_operator ("LE_EXPR");
580 return get_operator ("GT_EXPR");
582 return get_operator ("GE_EXPR");
584 return get_operator ("UNLT_EXPR");
586 return get_operator ("UNLE_EXPR");
588 return get_operator ("UNGT_EXPR");
590 return get_operator ("UNGE_EXPR");
596 typedef hash_map
<nofree_string_hash
, unsigned> cid_map_t
;
599 /* The AST produced by parsing of the pattern definitions. */
604 /* The base class for operands. */
607 enum op_type
{ OP_PREDICATE
, OP_EXPR
, OP_CAPTURE
, OP_C_EXPR
, OP_IF
, OP_WITH
};
608 operand (enum op_type type_
, source_location loc_
)
609 : type (type_
), location (loc_
) {}
611 source_location location
;
612 virtual void gen_transform (FILE *, int, const char *, bool, int,
613 const char *, capture_info
*,
616 { gcc_unreachable (); }
619 /* A predicate operand. Predicates are leafs in the AST. */
621 struct predicate
: public operand
623 predicate (predicate_id
*p_
, source_location loc
)
624 : operand (OP_PREDICATE
, loc
), p (p_
) {}
628 /* An operand that constitutes an expression. Expressions include
629 function calls and user-defined predicate invocations. */
631 struct expr
: public operand
633 expr (id_base
*operation_
, source_location loc
, bool is_commutative_
= false)
634 : operand (OP_EXPR
, loc
), operation (operation_
),
635 ops (vNULL
), expr_type (NULL
), is_commutative (is_commutative_
),
636 is_generic (false), force_single_use (false) {}
638 : operand (OP_EXPR
, e
->location
), operation (e
->operation
),
639 ops (vNULL
), expr_type (e
->expr_type
), is_commutative (e
->is_commutative
),
640 is_generic (e
->is_generic
), force_single_use (e
->force_single_use
) {}
641 void append_op (operand
*op
) { ops
.safe_push (op
); }
642 /* The operator and its operands. */
645 /* An explicitely specified type - used exclusively for conversions. */
646 const char *expr_type
;
647 /* Whether the operation is to be applied commutatively. This is
648 later lowered to two separate patterns. */
650 /* Whether the expression is expected to be in GENERIC form. */
652 /* Whether pushing any stmt to the sequence should be conditional
653 on this expression having a single-use. */
654 bool force_single_use
;
655 virtual void gen_transform (FILE *f
, int, const char *, bool, int,
656 const char *, capture_info
*,
657 dt_operand
** = 0, int = 0);
660 /* An operator that is represented by native C code. This is always
661 a leaf operand in the AST. This class is also used to represent
662 the code to be generated for 'if' and 'with' expressions. */
664 struct c_expr
: public operand
666 /* A mapping of an identifier and its replacement. Used to apply
671 id_tab (const char *id_
, const char *oper_
): id (id_
), oper (oper_
) {}
674 c_expr (cpp_reader
*r_
, source_location loc
,
675 vec
<cpp_token
> code_
, unsigned nr_stmts_
,
676 vec
<id_tab
> ids_
, cid_map_t
*capture_ids_
)
677 : operand (OP_C_EXPR
, loc
), r (r_
), code (code_
),
678 capture_ids (capture_ids_
), nr_stmts (nr_stmts_
), ids (ids_
) {}
679 /* cpplib tokens and state to transform this back to source. */
682 cid_map_t
*capture_ids
;
683 /* The number of statements parsed (well, the number of ';'s). */
685 /* The identifier replacement vector. */
687 virtual void gen_transform (FILE *f
, int, const char *, bool, int,
688 const char *, capture_info
*,
689 dt_operand
** = 0, int = 0);
692 /* A wrapper around another operand that captures its value. */
694 struct capture
: public operand
696 capture (source_location loc
, unsigned where_
, operand
*what_
)
697 : operand (OP_CAPTURE
, loc
), where (where_
), what (what_
) {}
698 /* Identifier index for the value. */
700 /* The captured value. */
702 virtual void gen_transform (FILE *f
, int, const char *, bool, int,
703 const char *, capture_info
*,
704 dt_operand
** = 0, int = 0);
709 struct if_expr
: public operand
711 if_expr (source_location loc
)
712 : operand (OP_IF
, loc
), cond (NULL
), trueexpr (NULL
), falseexpr (NULL
) {}
718 /* with expression. */
720 struct with_expr
: public operand
722 with_expr (source_location loc
)
723 : operand (OP_WITH
, loc
), with (NULL
), subexpr (NULL
) {}
731 is_a_helper
<capture
*>::test (operand
*op
)
733 return op
->type
== operand::OP_CAPTURE
;
739 is_a_helper
<predicate
*>::test (operand
*op
)
741 return op
->type
== operand::OP_PREDICATE
;
747 is_a_helper
<c_expr
*>::test (operand
*op
)
749 return op
->type
== operand::OP_C_EXPR
;
755 is_a_helper
<expr
*>::test (operand
*op
)
757 return op
->type
== operand::OP_EXPR
;
763 is_a_helper
<if_expr
*>::test (operand
*op
)
765 return op
->type
== operand::OP_IF
;
771 is_a_helper
<with_expr
*>::test (operand
*op
)
773 return op
->type
== operand::OP_WITH
;
776 /* The main class of a pattern and its transform. This is used to
777 represent both (simplify ...) and (match ...) kinds. The AST
778 duplicates all outer 'if' and 'for' expressions here so each
779 simplify can exist in isolation. */
783 enum simplify_kind
{ SIMPLIFY
, MATCH
};
785 simplify (simplify_kind kind_
, operand
*match_
, operand
*result_
,
786 vec
<vec
<user_id
*> > for_vec_
, cid_map_t
*capture_ids_
)
787 : kind (kind_
), match (match_
), result (result_
),
788 for_vec (for_vec_
), for_subst_vec (vNULL
),
789 capture_ids (capture_ids_
), capture_max (capture_ids_
->elements () - 1) {}
792 /* The expression that is matched against the GENERIC or GIMPLE IL. */
794 /* For a (simplify ...) an expression with ifs and withs with the expression
795 produced when the pattern applies in the leafs.
796 For a (match ...) the leafs are either empty if it is a simple predicate
797 or the single expression specifying the matched operands. */
798 struct operand
*result
;
799 /* Collected 'for' expression operators that have to be replaced
800 in the lowering phase. */
801 vec
<vec
<user_id
*> > for_vec
;
802 vec
<std::pair
<user_id
*, id_base
*> > for_subst_vec
;
803 /* A map of capture identifiers to indexes. */
804 cid_map_t
*capture_ids
;
808 /* Debugging routines for dumping the AST. */
811 print_operand (operand
*o
, FILE *f
= stderr
, bool flattened
= false)
813 if (capture
*c
= dyn_cast
<capture
*> (o
))
815 if (c
->what
&& flattened
== false)
816 print_operand (c
->what
, f
, flattened
);
817 fprintf (f
, "@%u", c
->where
);
820 else if (predicate
*p
= dyn_cast
<predicate
*> (o
))
821 fprintf (f
, "%s", p
->p
->id
);
823 else if (is_a
<c_expr
*> (o
))
824 fprintf (f
, "c_expr");
826 else if (expr
*e
= dyn_cast
<expr
*> (o
))
828 if (e
->ops
.length () == 0)
829 fprintf (f
, "%s", e
->operation
->id
);
832 fprintf (f
, "(%s", e
->operation
->id
);
834 if (flattened
== false)
836 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
839 print_operand (e
->ops
[i
], f
, flattened
);
851 print_matches (struct simplify
*s
, FILE *f
= stderr
)
853 fprintf (f
, "for expression: ");
854 print_operand (s
->match
, f
);
861 /* Lowering of commutative operators. */
864 cartesian_product (const vec
< vec
<operand
*> >& ops_vector
,
865 vec
< vec
<operand
*> >& result
, vec
<operand
*>& v
, unsigned n
)
867 if (n
== ops_vector
.length ())
869 vec
<operand
*> xv
= v
.copy ();
870 result
.safe_push (xv
);
874 for (unsigned i
= 0; i
< ops_vector
[n
].length (); ++i
)
876 v
[n
] = ops_vector
[n
][i
];
877 cartesian_product (ops_vector
, result
, v
, n
+ 1);
881 /* Lower OP to two operands in case it is marked as commutative. */
883 static vec
<operand
*>
884 commutate (operand
*op
, vec
<vec
<user_id
*> > &for_vec
)
886 vec
<operand
*> ret
= vNULL
;
888 if (capture
*c
= dyn_cast
<capture
*> (op
))
895 vec
<operand
*> v
= commutate (c
->what
, for_vec
);
896 for (unsigned i
= 0; i
< v
.length (); ++i
)
898 capture
*nc
= new capture (c
->location
, c
->where
, v
[i
]);
904 expr
*e
= dyn_cast
<expr
*> (op
);
905 if (!e
|| e
->ops
.length () == 0)
911 vec
< vec
<operand
*> > ops_vector
= vNULL
;
912 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
913 ops_vector
.safe_push (commutate (e
->ops
[i
], for_vec
));
915 auto_vec
< vec
<operand
*> > result
;
916 auto_vec
<operand
*> v (e
->ops
.length ());
917 v
.quick_grow_cleared (e
->ops
.length ());
918 cartesian_product (ops_vector
, result
, v
, 0);
921 for (unsigned i
= 0; i
< result
.length (); ++i
)
923 expr
*ne
= new expr (e
);
924 ne
->is_commutative
= false;
925 for (unsigned j
= 0; j
< result
[i
].length (); ++j
)
926 ne
->append_op (result
[i
][j
]);
930 if (!e
->is_commutative
)
933 for (unsigned i
= 0; i
< result
.length (); ++i
)
935 expr
*ne
= new expr (e
);
936 if (operator_id
*p
= dyn_cast
<operator_id
*> (ne
->operation
))
938 if (comparison_code_p (p
->code
))
939 ne
->operation
= swap_tree_comparison (p
);
941 else if (user_id
*p
= dyn_cast
<user_id
*> (ne
->operation
))
943 bool found_compare
= false;
944 for (unsigned j
= 0; j
< p
->substitutes
.length (); ++j
)
945 if (operator_id
*q
= dyn_cast
<operator_id
*> (p
->substitutes
[j
]))
947 if (comparison_code_p (q
->code
)
948 && swap_tree_comparison (q
) != q
)
950 found_compare
= true;
956 user_id
*newop
= new user_id ("<internal>");
957 for (unsigned j
= 0; j
< p
->substitutes
.length (); ++j
)
959 id_base
*subst
= p
->substitutes
[j
];
960 if (operator_id
*q
= dyn_cast
<operator_id
*> (subst
))
962 if (comparison_code_p (q
->code
))
963 subst
= swap_tree_comparison (q
);
965 newop
->substitutes
.safe_push (subst
);
967 ne
->operation
= newop
;
968 /* Search for 'p' inside the for vector and push 'newop'
969 to the same level. */
970 for (unsigned j
= 0; newop
&& j
< for_vec
.length (); ++j
)
971 for (unsigned k
= 0; k
< for_vec
[j
].length (); ++k
)
972 if (for_vec
[j
][k
] == p
)
974 for_vec
[j
].safe_push (newop
);
980 ne
->is_commutative
= false;
981 // result[i].length () is 2 since e->operation is binary
982 for (unsigned j
= result
[i
].length (); j
; --j
)
983 ne
->append_op (result
[i
][j
-1]);
990 /* Lower operations marked as commutative in the AST of S and push
991 the resulting patterns to SIMPLIFIERS. */
994 lower_commutative (simplify
*s
, vec
<simplify
*>& simplifiers
)
996 vec
<operand
*> matchers
= commutate (s
->match
, s
->for_vec
);
997 for (unsigned i
= 0; i
< matchers
.length (); ++i
)
999 simplify
*ns
= new simplify (s
->kind
, matchers
[i
], s
->result
,
1000 s
->for_vec
, s
->capture_ids
);
1001 simplifiers
.safe_push (ns
);
1005 /* Strip conditional conversios using operator OPER from O and its
1006 children if STRIP, else replace them with an unconditional convert. */
1009 lower_opt_convert (operand
*o
, enum tree_code oper
,
1010 enum tree_code to_oper
, bool strip
)
1012 if (capture
*c
= dyn_cast
<capture
*> (o
))
1015 return new capture (c
->location
, c
->where
,
1016 lower_opt_convert (c
->what
, oper
, to_oper
, strip
));
1021 expr
*e
= dyn_cast
<expr
*> (o
);
1025 if (*e
->operation
== oper
)
1028 return lower_opt_convert (e
->ops
[0], oper
, to_oper
, strip
);
1030 expr
*ne
= new expr (e
);
1031 ne
->operation
= (to_oper
== CONVERT_EXPR
1032 ? get_operator ("CONVERT_EXPR")
1033 : get_operator ("VIEW_CONVERT_EXPR"));
1034 ne
->append_op (lower_opt_convert (e
->ops
[0], oper
, to_oper
, strip
));
1038 expr
*ne
= new expr (e
);
1039 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1040 ne
->append_op (lower_opt_convert (e
->ops
[i
], oper
, to_oper
, strip
));
1045 /* Determine whether O or its children uses the conditional conversion
1049 has_opt_convert (operand
*o
, enum tree_code oper
)
1051 if (capture
*c
= dyn_cast
<capture
*> (o
))
1054 return has_opt_convert (c
->what
, oper
);
1059 expr
*e
= dyn_cast
<expr
*> (o
);
1063 if (*e
->operation
== oper
)
1066 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1067 if (has_opt_convert (e
->ops
[i
], oper
))
1073 /* Lower conditional convert operators in O, expanding it to a vector
1076 static vec
<operand
*>
1077 lower_opt_convert (operand
*o
)
1079 vec
<operand
*> v1
= vNULL
, v2
;
1083 enum tree_code opers
[]
1084 = { CONVERT0
, CONVERT_EXPR
,
1085 CONVERT1
, CONVERT_EXPR
,
1086 CONVERT2
, CONVERT_EXPR
,
1087 VIEW_CONVERT0
, VIEW_CONVERT_EXPR
,
1088 VIEW_CONVERT1
, VIEW_CONVERT_EXPR
,
1089 VIEW_CONVERT2
, VIEW_CONVERT_EXPR
};
1091 /* Conditional converts are lowered to a pattern with the
1092 conversion and one without. The three different conditional
1093 convert codes are lowered separately. */
1095 for (unsigned i
= 0; i
< sizeof (opers
) / sizeof (enum tree_code
); i
+= 2)
1098 for (unsigned j
= 0; j
< v1
.length (); ++j
)
1099 if (has_opt_convert (v1
[j
], opers
[i
]))
1101 v2
.safe_push (lower_opt_convert (v1
[j
],
1102 opers
[i
], opers
[i
+1], false));
1103 v2
.safe_push (lower_opt_convert (v1
[j
],
1104 opers
[i
], opers
[i
+1], true));
1110 for (unsigned j
= 0; j
< v2
.length (); ++j
)
1111 v1
.safe_push (v2
[j
]);
1118 /* Lower conditional convert operators in the AST of S and push
1119 the resulting multiple patterns to SIMPLIFIERS. */
1122 lower_opt_convert (simplify
*s
, vec
<simplify
*>& simplifiers
)
1124 vec
<operand
*> matchers
= lower_opt_convert (s
->match
);
1125 for (unsigned i
= 0; i
< matchers
.length (); ++i
)
1127 simplify
*ns
= new simplify (s
->kind
, matchers
[i
], s
->result
,
1128 s
->for_vec
, s
->capture_ids
);
1129 simplifiers
.safe_push (ns
);
1133 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
1134 GENERIC and a GIMPLE variant. */
1136 static vec
<operand
*>
1137 lower_cond (operand
*o
)
1139 vec
<operand
*> ro
= vNULL
;
1141 if (capture
*c
= dyn_cast
<capture
*> (o
))
1145 vec
<operand
*> lop
= vNULL
;
1146 lop
= lower_cond (c
->what
);
1148 for (unsigned i
= 0; i
< lop
.length (); ++i
)
1149 ro
.safe_push (new capture (c
->location
, c
->where
, lop
[i
]));
1154 expr
*e
= dyn_cast
<expr
*> (o
);
1155 if (!e
|| e
->ops
.length () == 0)
1161 vec
< vec
<operand
*> > ops_vector
= vNULL
;
1162 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1163 ops_vector
.safe_push (lower_cond (e
->ops
[i
]));
1165 auto_vec
< vec
<operand
*> > result
;
1166 auto_vec
<operand
*> v (e
->ops
.length ());
1167 v
.quick_grow_cleared (e
->ops
.length ());
1168 cartesian_product (ops_vector
, result
, v
, 0);
1170 for (unsigned i
= 0; i
< result
.length (); ++i
)
1172 expr
*ne
= new expr (e
);
1173 for (unsigned j
= 0; j
< result
[i
].length (); ++j
)
1174 ne
->append_op (result
[i
][j
]);
1176 /* If this is a COND with a captured expression or an
1177 expression with two operands then also match a GENERIC
1178 form on the compare. */
1179 if ((*e
->operation
== COND_EXPR
1180 || *e
->operation
== VEC_COND_EXPR
)
1181 && ((is_a
<capture
*> (e
->ops
[0])
1182 && as_a
<capture
*> (e
->ops
[0])->what
1183 && is_a
<expr
*> (as_a
<capture
*> (e
->ops
[0])->what
)
1185 (as_a
<capture
*> (e
->ops
[0])->what
)->ops
.length () == 2)
1186 || (is_a
<expr
*> (e
->ops
[0])
1187 && as_a
<expr
*> (e
->ops
[0])->ops
.length () == 2)))
1189 expr
*ne
= new expr (e
);
1190 for (unsigned j
= 0; j
< result
[i
].length (); ++j
)
1191 ne
->append_op (result
[i
][j
]);
1192 if (capture
*c
= dyn_cast
<capture
*> (ne
->ops
[0]))
1194 expr
*ocmp
= as_a
<expr
*> (c
->what
);
1195 expr
*cmp
= new expr (ocmp
);
1196 for (unsigned j
= 0; j
< ocmp
->ops
.length (); ++j
)
1197 cmp
->append_op (ocmp
->ops
[j
]);
1198 cmp
->is_generic
= true;
1199 ne
->ops
[0] = new capture (c
->location
, c
->where
, cmp
);
1203 expr
*ocmp
= as_a
<expr
*> (ne
->ops
[0]);
1204 expr
*cmp
= new expr (ocmp
);
1205 for (unsigned j
= 0; j
< ocmp
->ops
.length (); ++j
)
1206 cmp
->append_op (ocmp
->ops
[j
]);
1207 cmp
->is_generic
= true;
1217 /* Lower the compare operand of COND_EXPRs and VEC_COND_EXPRs to a
1218 GENERIC and a GIMPLE variant. */
1221 lower_cond (simplify
*s
, vec
<simplify
*>& simplifiers
)
1223 vec
<operand
*> matchers
= lower_cond (s
->match
);
1224 for (unsigned i
= 0; i
< matchers
.length (); ++i
)
1226 simplify
*ns
= new simplify (s
->kind
, matchers
[i
], s
->result
,
1227 s
->for_vec
, s
->capture_ids
);
1228 simplifiers
.safe_push (ns
);
1232 /* Return true if O refers to ID. */
1235 contains_id (operand
*o
, user_id
*id
)
1237 if (capture
*c
= dyn_cast
<capture
*> (o
))
1238 return c
->what
&& contains_id (c
->what
, id
);
1240 if (expr
*e
= dyn_cast
<expr
*> (o
))
1242 if (e
->operation
== id
)
1244 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1245 if (contains_id (e
->ops
[i
], id
))
1250 if (with_expr
*w
= dyn_cast
<with_expr
*> (o
))
1251 return (contains_id (w
->with
, id
)
1252 || contains_id (w
->subexpr
, id
));
1254 if (if_expr
*ife
= dyn_cast
<if_expr
*> (o
))
1255 return (contains_id (ife
->cond
, id
)
1256 || contains_id (ife
->trueexpr
, id
)
1257 || (ife
->falseexpr
&& contains_id (ife
->falseexpr
, id
)));
1259 if (c_expr
*ce
= dyn_cast
<c_expr
*> (o
))
1260 return ce
->capture_ids
&& ce
->capture_ids
->get (id
->id
);
1266 /* In AST operand O replace operator ID with operator WITH. */
1269 replace_id (operand
*o
, user_id
*id
, id_base
*with
)
1271 /* Deep-copy captures and expressions, replacing operations as
1273 if (capture
*c
= dyn_cast
<capture
*> (o
))
1277 return new capture (c
->location
, c
->where
,
1278 replace_id (c
->what
, id
, with
));
1280 else if (expr
*e
= dyn_cast
<expr
*> (o
))
1282 expr
*ne
= new expr (e
);
1283 if (e
->operation
== id
)
1284 ne
->operation
= with
;
1285 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1286 ne
->append_op (replace_id (e
->ops
[i
], id
, with
));
1289 else if (with_expr
*w
= dyn_cast
<with_expr
*> (o
))
1291 with_expr
*nw
= new with_expr (w
->location
);
1292 nw
->with
= as_a
<c_expr
*> (replace_id (w
->with
, id
, with
));
1293 nw
->subexpr
= replace_id (w
->subexpr
, id
, with
);
1296 else if (if_expr
*ife
= dyn_cast
<if_expr
*> (o
))
1298 if_expr
*nife
= new if_expr (ife
->location
);
1299 nife
->cond
= as_a
<c_expr
*> (replace_id (ife
->cond
, id
, with
));
1300 nife
->trueexpr
= replace_id (ife
->trueexpr
, id
, with
);
1302 nife
->falseexpr
= replace_id (ife
->falseexpr
, id
, with
);
1306 /* For c_expr we simply record a string replacement table which is
1307 applied at code-generation time. */
1308 if (c_expr
*ce
= dyn_cast
<c_expr
*> (o
))
1310 vec
<c_expr::id_tab
> ids
= ce
->ids
.copy ();
1311 ids
.safe_push (c_expr::id_tab (id
->id
, with
->id
));
1312 return new c_expr (ce
->r
, ce
->location
,
1313 ce
->code
, ce
->nr_stmts
, ids
, ce
->capture_ids
);
1319 /* Return true if the binary operator OP is ok for delayed substitution
1320 during for lowering. */
1323 binary_ok (operator_id
*op
)
1330 case TRUNC_DIV_EXPR
:
1332 case FLOOR_DIV_EXPR
:
1333 case ROUND_DIV_EXPR
:
1334 case TRUNC_MOD_EXPR
:
1336 case FLOOR_MOD_EXPR
:
1337 case ROUND_MOD_EXPR
:
1339 case EXACT_DIV_EXPR
:
1351 /* Lower recorded fors for SIN and output to SIMPLIFIERS. */
1354 lower_for (simplify
*sin
, vec
<simplify
*>& simplifiers
)
1356 vec
<vec
<user_id
*> >& for_vec
= sin
->for_vec
;
1357 unsigned worklist_start
= 0;
1358 auto_vec
<simplify
*> worklist
;
1359 worklist
.safe_push (sin
);
1361 /* Lower each recorded for separately, operating on the
1362 set of simplifiers created by the previous one.
1363 Lower inner-to-outer so inner for substitutes can refer
1364 to operators replaced by outer fors. */
1365 for (int fi
= for_vec
.length () - 1; fi
>= 0; --fi
)
1367 vec
<user_id
*>& ids
= for_vec
[fi
];
1368 unsigned n_ids
= ids
.length ();
1369 unsigned max_n_opers
= 0;
1370 bool can_delay_subst
= (sin
->kind
== simplify::SIMPLIFY
);
1371 for (unsigned i
= 0; i
< n_ids
; ++i
)
1373 if (ids
[i
]->substitutes
.length () > max_n_opers
)
1374 max_n_opers
= ids
[i
]->substitutes
.length ();
1375 /* Require that all substitutes are of the same kind so that
1376 if we delay substitution to the result op code generation
1377 can look at the first substitute for deciding things like
1378 types of operands. */
1379 enum id_base::id_kind kind
= ids
[i
]->substitutes
[0]->kind
;
1380 for (unsigned j
= 0; j
< ids
[i
]->substitutes
.length (); ++j
)
1381 if (ids
[i
]->substitutes
[j
]->kind
!= kind
)
1382 can_delay_subst
= false;
1383 else if (operator_id
*op
1384 = dyn_cast
<operator_id
*> (ids
[i
]->substitutes
[j
]))
1387 = as_a
<operator_id
*> (ids
[i
]->substitutes
[0]);
1388 if (strcmp (op
->tcc
, "tcc_comparison") == 0
1389 && strcmp (op0
->tcc
, "tcc_comparison") == 0)
1391 /* Unfortunately we can't just allow all tcc_binary. */
1392 else if (strcmp (op
->tcc
, "tcc_binary") == 0
1393 && strcmp (op0
->tcc
, "tcc_binary") == 0
1397 else if ((strcmp (op
->id
+ 1, "SHIFT_EXPR") == 0
1398 || strcmp (op
->id
+ 1, "ROTATE_EXPR") == 0)
1399 && (strcmp (op0
->id
+ 1, "SHIFT_EXPR") == 0
1400 || strcmp (op0
->id
+ 1, "ROTATE_EXPR") == 0))
1403 can_delay_subst
= false;
1405 else if (is_a
<fn_id
*> (ids
[i
]->substitutes
[j
]))
1408 can_delay_subst
= false;
1411 unsigned worklist_end
= worklist
.length ();
1412 for (unsigned si
= worklist_start
; si
< worklist_end
; ++si
)
1414 simplify
*s
= worklist
[si
];
1415 for (unsigned j
= 0; j
< max_n_opers
; ++j
)
1417 operand
*match_op
= s
->match
;
1418 operand
*result_op
= s
->result
;
1419 vec
<std::pair
<user_id
*, id_base
*> > subst
;
1420 subst
.create (n_ids
);
1422 for (unsigned i
= 0; i
< n_ids
; ++i
)
1424 user_id
*id
= ids
[i
];
1425 id_base
*oper
= id
->substitutes
[j
% id
->substitutes
.length ()];
1427 && (contains_id (match_op
, id
)
1428 || contains_id (result_op
, id
)))
1433 subst
.quick_push (std::make_pair (id
, oper
));
1434 match_op
= replace_id (match_op
, id
, oper
);
1436 && !can_delay_subst
)
1437 result_op
= replace_id (result_op
, id
, oper
);
1444 simplify
*ns
= new simplify (s
->kind
, match_op
, result_op
,
1445 vNULL
, s
->capture_ids
);
1446 ns
->for_subst_vec
.safe_splice (s
->for_subst_vec
);
1449 ns
->for_subst_vec
.safe_splice (subst
);
1452 worklist
.safe_push (ns
);
1455 worklist_start
= worklist_end
;
1458 /* Copy out the result from the last for lowering. */
1459 for (unsigned i
= worklist_start
; i
< worklist
.length (); ++i
)
1460 simplifiers
.safe_push (worklist
[i
]);
1463 /* Lower the AST for everything in SIMPLIFIERS. */
1466 lower (vec
<simplify
*>& simplifiers
, bool gimple
)
1468 auto_vec
<simplify
*> out_simplifiers
;
1469 for (unsigned i
= 0; i
< simplifiers
.length (); ++i
)
1470 lower_opt_convert (simplifiers
[i
], out_simplifiers
);
1472 simplifiers
.truncate (0);
1473 for (unsigned i
= 0; i
< out_simplifiers
.length (); ++i
)
1474 lower_commutative (out_simplifiers
[i
], simplifiers
);
1476 out_simplifiers
.truncate (0);
1478 for (unsigned i
= 0; i
< simplifiers
.length (); ++i
)
1479 lower_cond (simplifiers
[i
], out_simplifiers
);
1481 out_simplifiers
.safe_splice (simplifiers
);
1484 simplifiers
.truncate (0);
1485 for (unsigned i
= 0; i
< out_simplifiers
.length (); ++i
)
1486 lower_for (out_simplifiers
[i
], simplifiers
);
1492 /* The decision tree built for generating GIMPLE and GENERIC pattern
1493 matching code. It represents the 'match' expression of all
1494 simplifies and has those as its leafs. */
1498 /* A hash-map collecting semantically equivalent leafs in the decision
1499 tree for splitting out to separate functions. */
1508 struct sinfo_hashmap_traits
: simple_hashmap_traits
<pointer_hash
<dt_simplify
>,
1511 static inline hashval_t
hash (const key_type
&);
1512 static inline bool equal_keys (const key_type
&, const key_type
&);
1513 template <typename T
> static inline void remove (T
&) {}
1516 typedef hash_map
<void * /* unused */, sinfo
*, sinfo_hashmap_traits
>
1520 /* Decision tree base class, used for DT_TRUE and DT_NODE. */
1524 enum dt_type
{ DT_NODE
, DT_OPERAND
, DT_TRUE
, DT_MATCH
, DT_SIMPLIFY
};
1528 vec
<dt_node
*> kids
;
1532 unsigned total_size
;
1535 dt_node (enum dt_type type_
): type (type_
), level (0), kids (vNULL
) {}
1537 dt_node
*append_node (dt_node
*);
1538 dt_node
*append_op (operand
*, dt_node
*parent
= 0, unsigned pos
= 0);
1539 dt_node
*append_true_op (dt_node
*parent
= 0, unsigned pos
= 0);
1540 dt_node
*append_match_op (dt_operand
*, dt_node
*parent
= 0, unsigned pos
= 0);
1541 dt_node
*append_simplify (simplify
*, unsigned, dt_operand
**);
1543 virtual void gen (FILE *, int, bool) {}
1545 void gen_kids (FILE *, int, bool);
1546 void gen_kids_1 (FILE *, int, bool,
1547 vec
<dt_operand
*>, vec
<dt_operand
*>, vec
<dt_operand
*>,
1548 vec
<dt_operand
*>, vec
<dt_operand
*>, vec
<dt_node
*>);
1550 void analyze (sinfo_map_t
&);
1553 /* Generic decision tree node used for DT_OPERAND and DT_MATCH. */
1555 struct dt_operand
: public dt_node
1558 dt_operand
*match_dop
;
1562 dt_operand (enum dt_type type
, operand
*op_
, dt_operand
*match_dop_
,
1563 dt_operand
*parent_
= 0, unsigned pos_
= 0)
1564 : dt_node (type
), op (op_
), match_dop (match_dop_
),
1565 parent (parent_
), pos (pos_
) {}
1567 void gen (FILE *, int, bool);
1568 unsigned gen_predicate (FILE *, int, const char *, bool);
1569 unsigned gen_match_op (FILE *, int, const char *);
1571 unsigned gen_gimple_expr (FILE *, int);
1572 unsigned gen_generic_expr (FILE *, int, const char *);
1574 char *get_name (char *);
1575 void gen_opname (char *, unsigned);
1578 /* Leaf node of the decision tree, used for DT_SIMPLIFY. */
1580 struct dt_simplify
: public dt_node
1583 unsigned pattern_no
;
1584 dt_operand
**indexes
;
1587 dt_simplify (simplify
*s_
, unsigned pattern_no_
, dt_operand
**indexes_
)
1588 : dt_node (DT_SIMPLIFY
), s (s_
), pattern_no (pattern_no_
),
1589 indexes (indexes_
), info (NULL
) {}
1591 void gen_1 (FILE *, int, bool, operand
*);
1592 void gen (FILE *f
, int, bool);
1598 is_a_helper
<dt_operand
*>::test (dt_node
*n
)
1600 return (n
->type
== dt_node::DT_OPERAND
1601 || n
->type
== dt_node::DT_MATCH
);
1607 is_a_helper
<dt_simplify
*>::test (dt_node
*n
)
1609 return n
->type
== dt_node::DT_SIMPLIFY
;
1614 /* A container for the actual decision tree. */
1616 struct decision_tree
1620 void insert (struct simplify
*, unsigned);
1621 void gen (FILE *f
, bool gimple
);
1622 void print (FILE *f
= stderr
);
1624 decision_tree () { root
= new dt_node (dt_node::DT_NODE
); }
1626 static dt_node
*insert_operand (dt_node
*, operand
*, dt_operand
**indexes
,
1627 unsigned pos
= 0, dt_node
*parent
= 0);
1628 static dt_node
*find_node (vec
<dt_node
*>&, dt_node
*);
1629 static bool cmp_node (dt_node
*, dt_node
*);
1630 static void print_node (dt_node
*, FILE *f
= stderr
, unsigned = 0);
1633 /* Compare two AST operands O1 and O2 and return true if they are equal. */
1636 cmp_operand (operand
*o1
, operand
*o2
)
1638 if (!o1
|| !o2
|| o1
->type
!= o2
->type
)
1641 if (o1
->type
== operand::OP_PREDICATE
)
1643 predicate
*p1
= as_a
<predicate
*>(o1
);
1644 predicate
*p2
= as_a
<predicate
*>(o2
);
1645 return p1
->p
== p2
->p
;
1647 else if (o1
->type
== operand::OP_EXPR
)
1649 expr
*e1
= static_cast<expr
*>(o1
);
1650 expr
*e2
= static_cast<expr
*>(o2
);
1651 return (e1
->operation
== e2
->operation
1652 && e1
->is_generic
== e2
->is_generic
);
1658 /* Compare two decision tree nodes N1 and N2 and return true if they
1662 decision_tree::cmp_node (dt_node
*n1
, dt_node
*n2
)
1664 if (!n1
|| !n2
|| n1
->type
!= n2
->type
)
1670 if (n1
->type
== dt_node::DT_TRUE
)
1673 if (n1
->type
== dt_node::DT_OPERAND
)
1674 return cmp_operand ((as_a
<dt_operand
*> (n1
))->op
,
1675 (as_a
<dt_operand
*> (n2
))->op
);
1676 else if (n1
->type
== dt_node::DT_MATCH
)
1677 return ((as_a
<dt_operand
*> (n1
))->match_dop
1678 == (as_a
<dt_operand
*> (n2
))->match_dop
);
1682 /* Search OPS for a decision tree node like P and return it if found. */
1685 decision_tree::find_node (vec
<dt_node
*>& ops
, dt_node
*p
)
1687 /* We can merge adjacent DT_TRUE. */
1688 if (p
->type
== dt_node::DT_TRUE
1690 && ops
.last ()->type
== dt_node::DT_TRUE
)
1692 for (int i
= ops
.length () - 1; i
>= 0; --i
)
1694 /* But we can't merge across DT_TRUE nodes as they serve as
1695 pattern order barriers to make sure that patterns apply
1696 in order of appearance in case multiple matches are possible. */
1697 if (ops
[i
]->type
== dt_node::DT_TRUE
)
1699 if (decision_tree::cmp_node (ops
[i
], p
))
1705 /* Append N to the decision tree if it there is not already an existing
1709 dt_node::append_node (dt_node
*n
)
1713 kid
= decision_tree::find_node (kids
, n
);
1718 n
->level
= this->level
+ 1;
1723 /* Append OP to the decision tree. */
1726 dt_node::append_op (operand
*op
, dt_node
*parent
, unsigned pos
)
1728 dt_operand
*parent_
= safe_as_a
<dt_operand
*> (parent
);
1729 dt_operand
*n
= new dt_operand (DT_OPERAND
, op
, 0, parent_
, pos
);
1730 return append_node (n
);
1733 /* Append a DT_TRUE decision tree node. */
1736 dt_node::append_true_op (dt_node
*parent
, unsigned pos
)
1738 dt_operand
*parent_
= safe_as_a
<dt_operand
*> (parent
);
1739 dt_operand
*n
= new dt_operand (DT_TRUE
, 0, 0, parent_
, pos
);
1740 return append_node (n
);
1743 /* Append a DT_MATCH decision tree node. */
1746 dt_node::append_match_op (dt_operand
*match_dop
, dt_node
*parent
, unsigned pos
)
1748 dt_operand
*parent_
= as_a
<dt_operand
*> (parent
);
1749 dt_operand
*n
= new dt_operand (DT_MATCH
, 0, match_dop
, parent_
, pos
);
1750 return append_node (n
);
1753 /* Append S to the decision tree. */
1756 dt_node::append_simplify (simplify
*s
, unsigned pattern_no
,
1757 dt_operand
**indexes
)
1759 dt_simplify
*n
= new dt_simplify (s
, pattern_no
, indexes
);
1760 for (unsigned i
= 0; i
< kids
.length (); ++i
)
1761 if (dt_simplify
*s2
= dyn_cast
<dt_simplify
*> (kids
[i
]))
1763 warning_at (s
->match
->location
, "duplicate pattern");
1764 warning_at (s2
->s
->match
->location
, "previous pattern defined here");
1765 print_operand (s
->match
, stderr
);
1766 fprintf (stderr
, "\n");
1768 return append_node (n
);
1771 /* Analyze the node and its children. */
1774 dt_node::analyze (sinfo_map_t
&map
)
1780 if (type
== DT_SIMPLIFY
)
1782 /* Populate the map of equivalent simplifies. */
1783 dt_simplify
*s
= as_a
<dt_simplify
*> (this);
1785 sinfo
*&si
= map
.get_or_insert (s
, &existed
);
1800 for (unsigned i
= 0; i
< kids
.length (); ++i
)
1802 kids
[i
]->analyze (map
);
1803 num_leafs
+= kids
[i
]->num_leafs
;
1804 total_size
+= kids
[i
]->total_size
;
1805 max_level
= MAX (max_level
, kids
[i
]->max_level
);
1809 /* Insert O into the decision tree and return the decision tree node found
1813 decision_tree::insert_operand (dt_node
*p
, operand
*o
, dt_operand
**indexes
,
1814 unsigned pos
, dt_node
*parent
)
1816 dt_node
*q
, *elm
= 0;
1818 if (capture
*c
= dyn_cast
<capture
*> (o
))
1820 unsigned capt_index
= c
->where
;
1822 if (indexes
[capt_index
] == 0)
1825 q
= insert_operand (p
, c
->what
, indexes
, pos
, parent
);
1828 q
= elm
= p
->append_true_op (parent
, pos
);
1831 // get to the last capture
1832 for (operand
*what
= c
->what
;
1833 what
&& is_a
<capture
*> (what
);
1834 c
= as_a
<capture
*> (what
), what
= c
->what
)
1839 unsigned cc_index
= c
->where
;
1840 dt_operand
*match_op
= indexes
[cc_index
];
1842 dt_operand
temp (dt_node::DT_TRUE
, 0, 0);
1843 elm
= decision_tree::find_node (p
->kids
, &temp
);
1847 dt_operand
temp (dt_node::DT_MATCH
, 0, match_op
);
1848 elm
= decision_tree::find_node (p
->kids
, &temp
);
1853 dt_operand
temp (dt_node::DT_OPERAND
, c
->what
, 0);
1854 elm
= decision_tree::find_node (p
->kids
, &temp
);
1858 gcc_assert (elm
->type
== dt_node::DT_TRUE
1859 || elm
->type
== dt_node::DT_OPERAND
1860 || elm
->type
== dt_node::DT_MATCH
);
1861 indexes
[capt_index
] = static_cast<dt_operand
*> (elm
);
1866 p
= p
->append_match_op (indexes
[capt_index
], parent
, pos
);
1868 return insert_operand (p
, c
->what
, indexes
, 0, p
);
1873 p
= p
->append_op (o
, parent
, pos
);
1876 if (expr
*e
= dyn_cast
<expr
*>(o
))
1878 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1879 q
= decision_tree::insert_operand (q
, e
->ops
[i
], indexes
, i
, p
);
1885 /* Insert S into the decision tree. */
1888 decision_tree::insert (struct simplify
*s
, unsigned pattern_no
)
1890 dt_operand
**indexes
= XCNEWVEC (dt_operand
*, s
->capture_max
+ 1);
1891 dt_node
*p
= decision_tree::insert_operand (root
, s
->match
, indexes
);
1892 p
->append_simplify (s
, pattern_no
, indexes
);
1895 /* Debug functions to dump the decision tree. */
1898 decision_tree::print_node (dt_node
*p
, FILE *f
, unsigned indent
)
1900 if (p
->type
== dt_node::DT_NODE
)
1901 fprintf (f
, "root");
1905 for (unsigned i
= 0; i
< indent
; i
++)
1908 if (p
->type
== dt_node::DT_OPERAND
)
1910 dt_operand
*dop
= static_cast<dt_operand
*>(p
);
1911 print_operand (dop
->op
, f
, true);
1913 else if (p
->type
== dt_node::DT_TRUE
)
1914 fprintf (f
, "true");
1915 else if (p
->type
== dt_node::DT_MATCH
)
1916 fprintf (f
, "match (%p)", (void *)((as_a
<dt_operand
*>(p
))->match_dop
));
1917 else if (p
->type
== dt_node::DT_SIMPLIFY
)
1919 dt_simplify
*s
= static_cast<dt_simplify
*> (p
);
1920 fprintf (f
, "simplify_%u { ", s
->pattern_no
);
1921 for (int i
= 0; i
<= s
->s
->capture_max
; ++i
)
1922 fprintf (f
, "%p, ", (void *) s
->indexes
[i
]);
1927 fprintf (stderr
, " (%p), %u, %u\n", (void *) p
, p
->level
, p
->kids
.length ());
1929 for (unsigned i
= 0; i
< p
->kids
.length (); ++i
)
1930 decision_tree::print_node (p
->kids
[i
], f
, indent
+ 2);
1934 decision_tree::print (FILE *f
)
1936 return decision_tree::print_node (root
, f
);
1940 /* For GENERIC we have to take care of wrapping multiple-used
1941 expressions with side-effects in save_expr and preserve side-effects
1942 of expressions with omit_one_operand. Analyze captures in
1943 match, result and with expressions and perform early-outs
1944 on the outermost match expression operands for cases we cannot
1949 capture_info (simplify
*s
, operand
*, bool);
1950 void walk_match (operand
*o
, unsigned toplevel_arg
, bool, bool);
1951 bool walk_result (operand
*o
, bool, operand
*);
1952 void walk_c_expr (c_expr
*);
1958 bool force_no_side_effects_p
;
1959 bool force_single_use
;
1960 bool cond_expr_cond_p
;
1961 unsigned long toplevel_msk
;
1962 unsigned match_use_count
;
1963 unsigned result_use_count
;
1968 auto_vec
<cinfo
> info
;
1969 unsigned long force_no_side_effects
;
1973 /* Analyze captures in S. */
1975 capture_info::capture_info (simplify
*s
, operand
*result
, bool gimple_
)
1980 if (s
->kind
== simplify::MATCH
)
1982 force_no_side_effects
= -1;
1986 force_no_side_effects
= 0;
1987 info
.safe_grow_cleared (s
->capture_max
+ 1);
1988 for (int i
= 0; i
<= s
->capture_max
; ++i
)
1989 info
[i
].same_as
= i
;
1991 e
= as_a
<expr
*> (s
->match
);
1992 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
1993 walk_match (e
->ops
[i
], i
,
1994 (i
!= 0 && *e
->operation
== COND_EXPR
)
1995 || *e
->operation
== TRUTH_ANDIF_EXPR
1996 || *e
->operation
== TRUTH_ORIF_EXPR
,
1998 && (*e
->operation
== COND_EXPR
1999 || *e
->operation
== VEC_COND_EXPR
));
2001 walk_result (s
->result
, false, result
);
2004 /* Analyze captures in the match expression piece O. */
2007 capture_info::walk_match (operand
*o
, unsigned toplevel_arg
,
2008 bool conditional_p
, bool cond_expr_cond_p
)
2010 if (capture
*c
= dyn_cast
<capture
*> (o
))
2012 unsigned where
= c
->where
;
2013 info
[where
].match_use_count
++;
2014 info
[where
].toplevel_msk
|= 1 << toplevel_arg
;
2015 info
[where
].force_no_side_effects_p
|= conditional_p
;
2016 info
[where
].cond_expr_cond_p
|= cond_expr_cond_p
;
2021 /* Recurse to exprs and captures. */
2022 if (is_a
<capture
*> (c
->what
)
2023 || is_a
<expr
*> (c
->what
))
2024 walk_match (c
->what
, toplevel_arg
, conditional_p
, false);
2025 /* We need to look past multiple captures to find a captured
2026 expression as with conditional converts two captures
2027 can be collapsed onto the same expression. Also collect
2028 what captures capture the same thing. */
2029 while (c
->what
&& is_a
<capture
*> (c
->what
))
2031 c
= as_a
<capture
*> (c
->what
);
2032 if (info
[c
->where
].same_as
!= c
->where
2033 && info
[c
->where
].same_as
!= info
[where
].same_as
)
2034 fatal_at (c
->location
, "cannot handle this collapsed capture");
2035 info
[c
->where
].same_as
= info
[where
].same_as
;
2037 /* Mark expr (non-leaf) captures and forced single-use exprs. */
2040 && (e
= dyn_cast
<expr
*> (c
->what
)))
2042 info
[where
].expr_p
= true;
2043 info
[where
].force_single_use
|= e
->force_single_use
;
2046 else if (expr
*e
= dyn_cast
<expr
*> (o
))
2048 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
2050 bool cond_p
= conditional_p
;
2051 bool cond_expr_cond_p
= false;
2052 if (i
!= 0 && *e
->operation
== COND_EXPR
)
2054 else if (*e
->operation
== TRUTH_ANDIF_EXPR
2055 || *e
->operation
== TRUTH_ORIF_EXPR
)
2058 && (*e
->operation
== COND_EXPR
2059 || *e
->operation
== VEC_COND_EXPR
))
2060 cond_expr_cond_p
= true;
2061 walk_match (e
->ops
[i
], toplevel_arg
, cond_p
, cond_expr_cond_p
);
2064 else if (is_a
<predicate
*> (o
))
2066 /* Mark non-captured leafs toplevel arg for checking. */
2067 force_no_side_effects
|= 1 << toplevel_arg
;
2070 warning_at (o
->location
,
2071 "forcing no side-effects on possibly lost leaf");
2077 /* Analyze captures in the result expression piece O. Return true
2078 if RESULT was visited in one of the children. Only visit
2079 non-if/with children if they are rooted on RESULT. */
2082 capture_info::walk_result (operand
*o
, bool conditional_p
, operand
*result
)
2084 if (capture
*c
= dyn_cast
<capture
*> (o
))
2086 unsigned where
= info
[c
->where
].same_as
;
2087 info
[where
].result_use_count
++;
2088 /* If we substitute an expression capture we don't know
2089 which captures this will end up using (well, we don't
2090 compute that). Force the uses to be side-effect free
2091 which means forcing the toplevels that reach the
2092 expression side-effect free. */
2093 if (info
[where
].expr_p
)
2094 force_no_side_effects
|= info
[where
].toplevel_msk
;
2095 /* Mark CSE capture uses as forced to have no side-effects. */
2097 && is_a
<expr
*> (c
->what
))
2099 info
[where
].cse_p
= true;
2100 walk_result (c
->what
, true, result
);
2103 else if (expr
*e
= dyn_cast
<expr
*> (o
))
2105 id_base
*opr
= e
->operation
;
2106 if (user_id
*uid
= dyn_cast
<user_id
*> (opr
))
2107 opr
= uid
->substitutes
[0];
2108 for (unsigned i
= 0; i
< e
->ops
.length (); ++i
)
2110 bool cond_p
= conditional_p
;
2111 if (i
!= 0 && *e
->operation
== COND_EXPR
)
2113 else if (*e
->operation
== TRUTH_ANDIF_EXPR
2114 || *e
->operation
== TRUTH_ORIF_EXPR
)
2116 walk_result (e
->ops
[i
], cond_p
, result
);
2119 else if (if_expr
*e
= dyn_cast
<if_expr
*> (o
))
2121 /* 'if' conditions should be all fine. */
2122 if (e
->trueexpr
== result
)
2124 walk_result (e
->trueexpr
, false, result
);
2127 if (e
->falseexpr
== result
)
2129 walk_result (e
->falseexpr
, false, result
);
2133 if (is_a
<if_expr
*> (e
->trueexpr
)
2134 || is_a
<with_expr
*> (e
->trueexpr
))
2135 res
|= walk_result (e
->trueexpr
, false, result
);
2137 && (is_a
<if_expr
*> (e
->falseexpr
)
2138 || is_a
<with_expr
*> (e
->falseexpr
)))
2139 res
|= walk_result (e
->falseexpr
, false, result
);
2142 else if (with_expr
*e
= dyn_cast
<with_expr
*> (o
))
2144 bool res
= (e
->subexpr
== result
);
2146 || is_a
<if_expr
*> (e
->subexpr
)
2147 || is_a
<with_expr
*> (e
->subexpr
))
2148 res
|= walk_result (e
->subexpr
, false, result
);
2150 walk_c_expr (e
->with
);
2153 else if (c_expr
*e
= dyn_cast
<c_expr
*> (o
))
2161 /* Look for captures in the C expr E. */
2164 capture_info::walk_c_expr (c_expr
*e
)
2166 /* Give up for C exprs mentioning captures not inside TREE_TYPE,
2167 TREE_REAL_CST, TREE_CODE or a predicate where they cannot
2168 really escape through. */
2169 unsigned p_depth
= 0;
2170 for (unsigned i
= 0; i
< e
->code
.length (); ++i
)
2172 const cpp_token
*t
= &e
->code
[i
];
2173 const cpp_token
*n
= i
< e
->code
.length () - 1 ? &e
->code
[i
+1] : NULL
;
2175 if (t
->type
== CPP_NAME
2176 && (strcmp ((const char *)CPP_HASHNODE
2177 (t
->val
.node
.node
)->ident
.str
, "TREE_TYPE") == 0
2178 || strcmp ((const char *)CPP_HASHNODE
2179 (t
->val
.node
.node
)->ident
.str
, "TREE_CODE") == 0
2180 || strcmp ((const char *)CPP_HASHNODE
2181 (t
->val
.node
.node
)->ident
.str
, "TREE_REAL_CST") == 0
2182 || ((id
= get_operator ((const char *)CPP_HASHNODE
2183 (t
->val
.node
.node
)->ident
.str
))
2184 && is_a
<predicate_id
*> (id
)))
2185 && n
->type
== CPP_OPEN_PAREN
)
2187 else if (t
->type
== CPP_CLOSE_PAREN
2190 else if (p_depth
== 0
2191 && t
->type
== CPP_ATSIGN
2192 && (n
->type
== CPP_NUMBER
2193 || n
->type
== CPP_NAME
)
2194 && !(n
->flags
& PREV_WHITE
))
2197 if (n
->type
== CPP_NUMBER
)
2198 id
= (const char *)n
->val
.str
.text
;
2200 id
= (const char *)CPP_HASHNODE (n
->val
.node
.node
)->ident
.str
;
2201 unsigned where
= *e
->capture_ids
->get(id
);
2202 info
[info
[where
].same_as
].force_no_side_effects_p
= true;
2205 warning_at (t
, "capture escapes");
2211 /* Code generation off the decision tree and the refered AST nodes. */
2214 is_conversion (id_base
*op
)
2216 return (*op
== CONVERT_EXPR
2218 || *op
== FLOAT_EXPR
2219 || *op
== FIX_TRUNC_EXPR
2220 || *op
== VIEW_CONVERT_EXPR
);
2223 /* Get the type to be used for generating operands of OP from the
2227 get_operand_type (id_base
*op
, const char *in_type
,
2228 const char *expr_type
,
2229 const char *other_oprnd_type
)
2231 /* Generally operands whose type does not match the type of the
2232 expression generated need to know their types but match and
2233 thus can fall back to 'other_oprnd_type'. */
2234 if (is_conversion (op
))
2235 return other_oprnd_type
;
2236 else if (*op
== REALPART_EXPR
2237 || *op
== IMAGPART_EXPR
)
2238 return other_oprnd_type
;
2239 else if (is_a
<operator_id
*> (op
)
2240 && strcmp (as_a
<operator_id
*> (op
)->tcc
, "tcc_comparison") == 0)
2241 return other_oprnd_type
;
2244 /* Otherwise all types should match - choose one in order of
2251 return other_oprnd_type
;
2255 /* Generate transform code for an expression. */
2258 expr::gen_transform (FILE *f
, int indent
, const char *dest
, bool gimple
,
2259 int depth
, const char *in_type
, capture_info
*cinfo
,
2260 dt_operand
**indexes
, int)
2262 id_base
*opr
= operation
;
2263 /* When we delay operator substituting during lowering of fors we
2264 make sure that for code-gen purposes the effects of each substitute
2265 are the same. Thus just look at that. */
2266 if (user_id
*uid
= dyn_cast
<user_id
*> (opr
))
2267 opr
= uid
->substitutes
[0];
2269 bool conversion_p
= is_conversion (opr
);
2270 const char *type
= expr_type
;
2273 /* If there was a type specification in the pattern use it. */
2275 else if (conversion_p
)
2276 /* For conversions we need to build the expression using the
2277 outer type passed in. */
2279 else if (*opr
== REALPART_EXPR
2280 || *opr
== IMAGPART_EXPR
)
2282 /* __real and __imag use the component type of its operand. */
2283 sprintf (optype
, "TREE_TYPE (TREE_TYPE (ops%d[0]))", depth
);
2286 else if (is_a
<operator_id
*> (opr
)
2287 && !strcmp (as_a
<operator_id
*> (opr
)->tcc
, "tcc_comparison"))
2289 /* comparisons use boolean_type_node (or what gets in), but
2290 their operands need to figure out the types themselves. */
2295 sprintf (optype
, "boolean_type_node");
2300 else if (*opr
== COND_EXPR
2301 || *opr
== VEC_COND_EXPR
)
2303 /* Conditions are of the same type as their first alternative. */
2304 sprintf (optype
, "TREE_TYPE (ops%d[1])", depth
);
2309 /* Other operations are of the same type as their first operand. */
2310 sprintf (optype
, "TREE_TYPE (ops%d[0])", depth
);
2314 fatal_at (location
, "cannot determine type of operand");
2316 fprintf_indent (f
, indent
, "{\n");
2318 fprintf_indent (f
, indent
, "tree ops%d[%u], res;\n", depth
, ops
.length ());
2320 snprintf (op0type
, 64, "TREE_TYPE (ops%d[0])", depth
);
2321 for (unsigned i
= 0; i
< ops
.length (); ++i
)
2324 snprintf (dest
, 32, "ops%d[%u]", depth
, i
);
2326 = get_operand_type (opr
, in_type
, expr_type
,
2327 i
== 0 ? NULL
: op0type
);
2328 ops
[i
]->gen_transform (f
, indent
, dest
, gimple
, depth
+ 1, optype
,
2331 || *opr
== VEC_COND_EXPR
) && i
== 0 ? 1 : 2);
2334 const char *opr_name
;
2335 if (*operation
== CONVERT_EXPR
)
2336 opr_name
= "NOP_EXPR";
2338 opr_name
= operation
->id
;
2342 if (*opr
== CONVERT_EXPR
)
2344 fprintf_indent (f
, indent
,
2345 "if (%s != TREE_TYPE (ops%d[0])\n",
2347 fprintf_indent (f
, indent
,
2348 " && !useless_type_conversion_p (%s, TREE_TYPE (ops%d[0])))\n",
2350 fprintf_indent (f
, indent
+ 2, "{\n");
2353 /* ??? Building a stmt can fail for various reasons here, seq being
2354 NULL or the stmt referencing SSA names occuring in abnormal PHIs.
2355 So if we fail here we should continue matching other patterns. */
2356 fprintf_indent (f
, indent
, "code_helper tem_code = %s;\n", opr_name
);
2357 fprintf_indent (f
, indent
, "tree tem_ops[3] = { ");
2358 for (unsigned i
= 0; i
< ops
.length (); ++i
)
2359 fprintf (f
, "ops%d[%u]%s", depth
, i
,
2360 i
== ops
.length () - 1 ? " };\n" : ", ");
2361 fprintf_indent (f
, indent
,
2362 "gimple_resimplify%d (lseq, &tem_code, %s, tem_ops, valueize);\n",
2363 ops
.length (), type
);
2364 fprintf_indent (f
, indent
,
2365 "res = maybe_push_res_to_seq (tem_code, %s, tem_ops, lseq);\n",
2367 fprintf_indent (f
, indent
,
2368 "if (!res) return false;\n");
2369 if (*opr
== CONVERT_EXPR
)
2372 fprintf_indent (f
, indent
, " }\n");
2373 fprintf_indent (f
, indent
, "else\n");
2374 fprintf_indent (f
, indent
, " res = ops%d[0];\n", depth
);
2379 if (*opr
== CONVERT_EXPR
)
2381 fprintf_indent (f
, indent
, "if (TREE_TYPE (ops%d[0]) != %s)\n",
2385 if (opr
->kind
== id_base::CODE
)
2386 fprintf_indent (f
, indent
, "res = fold_build%d_loc (loc, %s, %s",
2387 ops
.length(), opr_name
, type
);
2390 fprintf_indent (f
, indent
, "{\n");
2391 fprintf_indent (f
, indent
, " res = maybe_build_call_expr_loc (loc, "
2392 "%s, %s, %d", opr_name
, type
, ops
.length());
2394 for (unsigned i
= 0; i
< ops
.length (); ++i
)
2395 fprintf (f
, ", ops%d[%u]", depth
, i
);
2396 fprintf (f
, ");\n");
2397 if (opr
->kind
!= id_base::CODE
)
2399 fprintf_indent (f
, indent
, " if (!res)\n");
2400 fprintf_indent (f
, indent
, " return NULL_TREE;\n");
2401 fprintf_indent (f
, indent
, "}\n");
2403 if (*opr
== CONVERT_EXPR
)
2406 fprintf_indent (f
, indent
, "else\n");
2407 fprintf_indent (f
, indent
, " res = ops%d[0];\n", depth
);
2410 fprintf_indent (f
, indent
, "%s = res;\n", dest
);
2412 fprintf_indent (f
, indent
, "}\n");
2415 /* Generate code for a c_expr which is either the expression inside
2416 an if statement or a sequence of statements which computes a
2417 result to be stored to DEST. */
2420 c_expr::gen_transform (FILE *f
, int indent
, const char *dest
,
2421 bool, int, const char *, capture_info
*,
2424 if (dest
&& nr_stmts
== 1)
2425 fprintf_indent (f
, indent
, "%s = ", dest
);
2427 unsigned stmt_nr
= 1;
2428 for (unsigned i
= 0; i
< code
.length (); ++i
)
2430 const cpp_token
*token
= &code
[i
];
2432 /* Replace captures for code-gen. */
2433 if (token
->type
== CPP_ATSIGN
)
2435 const cpp_token
*n
= &code
[i
+1];
2436 if ((n
->type
== CPP_NUMBER
2437 || n
->type
== CPP_NAME
)
2438 && !(n
->flags
& PREV_WHITE
))
2440 if (token
->flags
& PREV_WHITE
)
2443 if (n
->type
== CPP_NUMBER
)
2444 id
= (const char *)n
->val
.str
.text
;
2446 id
= (const char *)CPP_HASHNODE (n
->val
.node
.node
)->ident
.str
;
2447 unsigned *cid
= capture_ids
->get (id
);
2449 fatal_at (token
, "unknown capture id");
2450 fprintf (f
, "captures[%u]", *cid
);
2456 if (token
->flags
& PREV_WHITE
)
2459 if (token
->type
== CPP_NAME
)
2461 const char *id
= (const char *) NODE_NAME (token
->val
.node
.node
);
2463 for (j
= 0; j
< ids
.length (); ++j
)
2465 if (strcmp (id
, ids
[j
].id
) == 0)
2467 fprintf (f
, "%s", ids
[j
].oper
);
2471 if (j
< ids
.length ())
2475 /* Output the token as string. */
2476 char *tk
= (char *)cpp_token_as_text (r
, token
);
2479 if (token
->type
== CPP_SEMICOLON
)
2483 if (dest
&& stmt_nr
== nr_stmts
)
2484 fprintf_indent (f
, indent
, "%s = ", dest
);
2489 /* Generate transform code for a capture. */
2492 capture::gen_transform (FILE *f
, int indent
, const char *dest
, bool gimple
,
2493 int depth
, const char *in_type
, capture_info
*cinfo
,
2494 dt_operand
**indexes
, int cond_handling
)
2496 if (what
&& is_a
<expr
*> (what
))
2498 if (indexes
[where
] == 0)
2501 sprintf (buf
, "captures[%u]", where
);
2502 what
->gen_transform (f
, indent
, buf
, gimple
, depth
, in_type
,
2507 fprintf_indent (f
, indent
, "%s = captures[%u];\n", dest
, where
);
2509 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
2510 with substituting a capture of that. */
2512 && cond_handling
!= 0
2513 && cinfo
->info
[where
].cond_expr_cond_p
)
2515 /* If substituting into a cond_expr condition, unshare. */
2516 if (cond_handling
== 1)
2517 fprintf_indent (f
, indent
, "%s = unshare_expr (%s);\n", dest
, dest
);
2518 /* If substituting elsewhere we might need to decompose it. */
2519 else if (cond_handling
== 2)
2521 /* ??? Returning false here will also not allow any other patterns
2522 to match unless this generator was split out. */
2523 fprintf_indent (f
, indent
, "if (COMPARISON_CLASS_P (%s))\n", dest
);
2524 fprintf_indent (f
, indent
, " {\n");
2525 fprintf_indent (f
, indent
, " if (!seq) return false;\n");
2526 fprintf_indent (f
, indent
, " %s = gimple_build (seq,"
2528 " TREE_TYPE (%s), TREE_OPERAND (%s, 0),"
2529 " TREE_OPERAND (%s, 1));\n",
2530 dest
, dest
, dest
, dest
, dest
);
2531 fprintf_indent (f
, indent
, " }\n");
2536 /* Return the name of the operand representing the decision tree node.
2537 Use NAME as space to generate it. */
2540 dt_operand::get_name (char *name
)
2543 sprintf (name
, "t");
2544 else if (parent
->level
== 1)
2545 sprintf (name
, "op%u", pos
);
2546 else if (parent
->type
== dt_node::DT_MATCH
)
2547 return parent
->get_name (name
);
2549 sprintf (name
, "o%u%u", parent
->level
, pos
);
2553 /* Fill NAME with the operand name at position POS. */
2556 dt_operand::gen_opname (char *name
, unsigned pos
)
2559 sprintf (name
, "op%u", pos
);
2561 sprintf (name
, "o%u%u", level
, pos
);
2564 /* Generate matching code for the decision tree operand which is
2568 dt_operand::gen_predicate (FILE *f
, int indent
, const char *opname
, bool gimple
)
2570 predicate
*p
= as_a
<predicate
*> (op
);
2572 if (p
->p
->matchers
.exists ())
2574 /* If this is a predicate generated from a pattern mangle its
2575 name and pass on the valueize hook. */
2577 fprintf_indent (f
, indent
, "if (gimple_%s (%s, valueize))\n",
2580 fprintf_indent (f
, indent
, "if (tree_%s (%s))\n", p
->p
->id
, opname
);
2583 fprintf_indent (f
, indent
, "if (%s (%s))\n", p
->p
->id
, opname
);
2584 fprintf_indent (f
, indent
+ 2, "{\n");
2588 /* Generate matching code for the decision tree operand which is
2592 dt_operand::gen_match_op (FILE *f
, int indent
, const char *opname
)
2594 char match_opname
[20];
2595 match_dop
->get_name (match_opname
);
2596 fprintf_indent (f
, indent
, "if (%s == %s || operand_equal_p (%s, %s, 0))\n",
2597 opname
, match_opname
, opname
, match_opname
);
2598 fprintf_indent (f
, indent
+ 2, "{\n");
2602 /* Generate GIMPLE matching code for the decision tree operand. */
2605 dt_operand::gen_gimple_expr (FILE *f
, int indent
)
2607 expr
*e
= static_cast<expr
*> (op
);
2608 id_base
*id
= e
->operation
;
2609 unsigned n_ops
= e
->ops
.length ();
2611 for (unsigned i
= 0; i
< n_ops
; ++i
)
2613 char child_opname
[20];
2614 gen_opname (child_opname
, i
);
2616 if (id
->kind
== id_base::CODE
)
2619 || *id
== REALPART_EXPR
|| *id
== IMAGPART_EXPR
2620 || *id
== BIT_FIELD_REF
|| *id
== VIEW_CONVERT_EXPR
)
2622 /* ??? If this is a memory operation we can't (and should not)
2623 match this. The only sensible operand types are
2624 SSA names and invariants. */
2625 fprintf_indent (f
, indent
,
2626 "tree %s = TREE_OPERAND (gimple_assign_rhs1 (def), %i);\n",
2628 fprintf_indent (f
, indent
,
2629 "if ((TREE_CODE (%s) == SSA_NAME\n",
2631 fprintf_indent (f
, indent
,
2632 " || is_gimple_min_invariant (%s))\n",
2634 fprintf_indent (f
, indent
,
2635 " && (%s = do_valueize (valueize, %s)))\n",
2636 child_opname
, child_opname
);
2637 fprintf_indent (f
, indent
,
2643 fprintf_indent (f
, indent
,
2644 "tree %s = gimple_assign_rhs%u (def);\n",
2645 child_opname
, i
+ 1);
2648 fprintf_indent (f
, indent
,
2649 "tree %s = gimple_call_arg (def, %u);\n",
2651 fprintf_indent (f
, indent
,
2652 "if ((%s = do_valueize (valueize, %s)))\n",
2653 child_opname
, child_opname
);
2654 fprintf_indent (f
, indent
, " {\n");
2657 /* While the toplevel operands are canonicalized by the caller
2658 after valueizing operands of sub-expressions we have to
2659 re-canonicalize operand order. */
2660 if (operator_id
*code
= dyn_cast
<operator_id
*> (id
))
2662 /* ??? We can't canonicalize tcc_comparison operands here
2663 because that requires changing the comparison code which
2664 we already matched... */
2665 if (commutative_tree_code (code
->code
)
2666 || commutative_ternary_tree_code (code
->code
))
2668 char child_opname0
[20], child_opname1
[20];
2669 gen_opname (child_opname0
, 0);
2670 gen_opname (child_opname1
, 1);
2671 fprintf_indent (f
, indent
,
2672 "if (tree_swap_operands_p (%s, %s, false))\n",
2673 child_opname0
, child_opname1
);
2674 fprintf_indent (f
, indent
,
2675 " std::swap (%s, %s);\n",
2676 child_opname0
, child_opname1
);
2683 /* Generate GENERIC matching code for the decision tree operand. */
2686 dt_operand::gen_generic_expr (FILE *f
, int indent
, const char *opname
)
2688 expr
*e
= static_cast<expr
*> (op
);
2689 unsigned n_ops
= e
->ops
.length ();
2691 for (unsigned i
= 0; i
< n_ops
; ++i
)
2693 char child_opname
[20];
2694 gen_opname (child_opname
, i
);
2696 if (e
->operation
->kind
== id_base::CODE
)
2697 fprintf_indent (f
, indent
, "tree %s = TREE_OPERAND (%s, %u);\n",
2698 child_opname
, opname
, i
);
2700 fprintf_indent (f
, indent
, "tree %s = CALL_EXPR_ARG (%s, %u);\n",
2701 child_opname
, opname
, i
);
2707 /* Generate matching code for the children of the decision tree node. */
2710 dt_node::gen_kids (FILE *f
, int indent
, bool gimple
)
2712 auto_vec
<dt_operand
*> gimple_exprs
;
2713 auto_vec
<dt_operand
*> generic_exprs
;
2714 auto_vec
<dt_operand
*> fns
;
2715 auto_vec
<dt_operand
*> generic_fns
;
2716 auto_vec
<dt_operand
*> preds
;
2717 auto_vec
<dt_node
*> others
;
2719 for (unsigned i
= 0; i
< kids
.length (); ++i
)
2721 if (kids
[i
]->type
== dt_node::DT_OPERAND
)
2723 dt_operand
*op
= as_a
<dt_operand
*> (kids
[i
]);
2724 if (expr
*e
= dyn_cast
<expr
*> (op
->op
))
2726 if (e
->ops
.length () == 0
2727 && (!gimple
|| !(*e
->operation
== CONSTRUCTOR
)))
2728 generic_exprs
.safe_push (op
);
2729 else if (e
->operation
->kind
== id_base::FN
)
2734 generic_fns
.safe_push (op
);
2736 else if (e
->operation
->kind
== id_base::PREDICATE
)
2737 preds
.safe_push (op
);
2740 if (gimple
&& !e
->is_generic
)
2741 gimple_exprs
.safe_push (op
);
2743 generic_exprs
.safe_push (op
);
2746 else if (op
->op
->type
== operand::OP_PREDICATE
)
2747 others
.safe_push (kids
[i
]);
2751 else if (kids
[i
]->type
== dt_node::DT_SIMPLIFY
)
2752 others
.safe_push (kids
[i
]);
2753 else if (kids
[i
]->type
== dt_node::DT_MATCH
2754 || kids
[i
]->type
== dt_node::DT_TRUE
)
2756 /* A DT_TRUE operand serves as a barrier - generate code now
2757 for what we have collected sofar.
2758 Like DT_TRUE, DT_MATCH serves as a barrier as it can cause
2759 dependent matches to get out-of-order. Generate code now
2760 for what we have collected sofar. */
2761 gen_kids_1 (f
, indent
, gimple
, gimple_exprs
, generic_exprs
,
2762 fns
, generic_fns
, preds
, others
);
2763 /* And output the true operand itself. */
2764 kids
[i
]->gen (f
, indent
, gimple
);
2765 gimple_exprs
.truncate (0);
2766 generic_exprs
.truncate (0);
2768 generic_fns
.truncate (0);
2770 others
.truncate (0);
2776 /* Generate code for the remains. */
2777 gen_kids_1 (f
, indent
, gimple
, gimple_exprs
, generic_exprs
,
2778 fns
, generic_fns
, preds
, others
);
2781 /* Generate matching code for the children of the decision tree node. */
2784 dt_node::gen_kids_1 (FILE *f
, int indent
, bool gimple
,
2785 vec
<dt_operand
*> gimple_exprs
,
2786 vec
<dt_operand
*> generic_exprs
,
2787 vec
<dt_operand
*> fns
,
2788 vec
<dt_operand
*> generic_fns
,
2789 vec
<dt_operand
*> preds
,
2790 vec
<dt_node
*> others
)
2793 char *kid_opname
= buf
;
2795 unsigned exprs_len
= gimple_exprs
.length ();
2796 unsigned gexprs_len
= generic_exprs
.length ();
2797 unsigned fns_len
= fns
.length ();
2798 unsigned gfns_len
= generic_fns
.length ();
2800 if (exprs_len
|| fns_len
|| gexprs_len
|| gfns_len
)
2803 gimple_exprs
[0]->get_name (kid_opname
);
2805 fns
[0]->get_name (kid_opname
);
2807 generic_fns
[0]->get_name (kid_opname
);
2809 generic_exprs
[0]->get_name (kid_opname
);
2811 fprintf_indent (f
, indent
, "switch (TREE_CODE (%s))\n", kid_opname
);
2812 fprintf_indent (f
, indent
, " {\n");
2816 if (exprs_len
|| fns_len
)
2818 fprintf_indent (f
, indent
,
2819 "case SSA_NAME:\n");
2820 fprintf_indent (f
, indent
,
2821 " if (do_valueize (valueize, %s) != NULL_TREE)\n",
2823 fprintf_indent (f
, indent
,
2825 fprintf_indent (f
, indent
,
2826 " gimple *def_stmt = SSA_NAME_DEF_STMT (%s);\n",
2832 fprintf_indent (f
, indent
,
2833 "if (gassign *def = dyn_cast <gassign *> (def_stmt))\n");
2834 fprintf_indent (f
, indent
,
2835 " switch (gimple_assign_rhs_code (def))\n");
2837 fprintf_indent (f
, indent
, "{\n");
2838 for (unsigned i
= 0; i
< exprs_len
; ++i
)
2840 expr
*e
= as_a
<expr
*> (gimple_exprs
[i
]->op
);
2841 id_base
*op
= e
->operation
;
2842 if (*op
== CONVERT_EXPR
|| *op
== NOP_EXPR
)
2843 fprintf_indent (f
, indent
, "CASE_CONVERT:\n");
2845 fprintf_indent (f
, indent
, "case %s:\n", op
->id
);
2846 fprintf_indent (f
, indent
, " {\n");
2847 gimple_exprs
[i
]->gen (f
, indent
+ 4, true);
2848 fprintf_indent (f
, indent
, " break;\n");
2849 fprintf_indent (f
, indent
, " }\n");
2851 fprintf_indent (f
, indent
, "default:;\n");
2852 fprintf_indent (f
, indent
, "}\n");
2858 fprintf_indent (f
, indent
,
2859 "%sif (gcall *def = dyn_cast <gcall *>"
2861 exprs_len
? "else " : "");
2862 fprintf_indent (f
, indent
,
2863 " switch (gimple_call_combined_fn (def))\n");
2866 fprintf_indent (f
, indent
, "{\n");
2867 for (unsigned i
= 0; i
< fns_len
; ++i
)
2869 expr
*e
= as_a
<expr
*>(fns
[i
]->op
);
2870 fprintf_indent (f
, indent
, "case %s:\n", e
->operation
->id
);
2871 fprintf_indent (f
, indent
, " {\n");
2872 fns
[i
]->gen (f
, indent
+ 4, true);
2873 fprintf_indent (f
, indent
, " break;\n");
2874 fprintf_indent (f
, indent
, " }\n");
2877 fprintf_indent (f
, indent
, "default:;\n");
2878 fprintf_indent (f
, indent
, "}\n");
2883 fprintf_indent (f
, indent
, " }\n");
2884 fprintf_indent (f
, indent
, " break;\n");
2887 for (unsigned i
= 0; i
< generic_exprs
.length (); ++i
)
2889 expr
*e
= as_a
<expr
*>(generic_exprs
[i
]->op
);
2890 id_base
*op
= e
->operation
;
2891 if (*op
== CONVERT_EXPR
|| *op
== NOP_EXPR
)
2892 fprintf_indent (f
, indent
, "CASE_CONVERT:\n");
2894 fprintf_indent (f
, indent
, "case %s:\n", op
->id
);
2895 fprintf_indent (f
, indent
, " {\n");
2896 generic_exprs
[i
]->gen (f
, indent
+ 4, gimple
);
2897 fprintf_indent (f
, indent
, " break;\n");
2898 fprintf_indent (f
, indent
, " }\n");
2903 fprintf_indent (f
, indent
,
2904 "case CALL_EXPR:\n");
2905 fprintf_indent (f
, indent
,
2906 " switch (get_call_combined_fn (%s))\n",
2908 fprintf_indent (f
, indent
,
2912 for (unsigned j
= 0; j
< generic_fns
.length (); ++j
)
2914 expr
*e
= as_a
<expr
*>(generic_fns
[j
]->op
);
2915 gcc_assert (e
->operation
->kind
== id_base::FN
);
2917 fprintf_indent (f
, indent
, "case %s:\n", e
->operation
->id
);
2918 fprintf_indent (f
, indent
, " {\n");
2919 generic_fns
[j
]->gen (f
, indent
+ 4, false);
2920 fprintf_indent (f
, indent
, " break;\n");
2921 fprintf_indent (f
, indent
, " }\n");
2923 fprintf_indent (f
, indent
, "default:;\n");
2926 fprintf_indent (f
, indent
, " }\n");
2927 fprintf_indent (f
, indent
, " break;\n");
2930 /* Close switch (TREE_CODE ()). */
2931 if (exprs_len
|| fns_len
|| gexprs_len
|| gfns_len
)
2934 fprintf_indent (f
, indent
, " default:;\n");
2935 fprintf_indent (f
, indent
, " }\n");
2938 for (unsigned i
= 0; i
< preds
.length (); ++i
)
2940 expr
*e
= as_a
<expr
*> (preds
[i
]->op
);
2941 predicate_id
*p
= as_a
<predicate_id
*> (e
->operation
);
2942 preds
[i
]->get_name (kid_opname
);
2943 fprintf_indent (f
, indent
, "tree %s_pops[%d];\n", kid_opname
, p
->nargs
);
2944 fprintf_indent (f
, indent
, "if (%s_%s (%s, %s_pops%s))\n",
2945 gimple
? "gimple" : "tree",
2946 p
->id
, kid_opname
, kid_opname
,
2947 gimple
? ", valueize" : "");
2948 fprintf_indent (f
, indent
, " {\n");
2949 for (int j
= 0; j
< p
->nargs
; ++j
)
2951 char child_opname
[20];
2952 preds
[i
]->gen_opname (child_opname
, j
);
2953 fprintf_indent (f
, indent
+ 4, "tree %s = %s_pops[%d];\n",
2954 child_opname
, kid_opname
, j
);
2956 preds
[i
]->gen_kids (f
, indent
+ 4, gimple
);
2960 for (unsigned i
= 0; i
< others
.length (); ++i
)
2961 others
[i
]->gen (f
, indent
, gimple
);
2964 /* Generate matching code for the decision tree operand. */
2967 dt_operand::gen (FILE *f
, int indent
, bool gimple
)
2972 unsigned n_braces
= 0;
2974 if (type
== DT_OPERAND
)
2977 case operand::OP_PREDICATE
:
2978 n_braces
= gen_predicate (f
, indent
, opname
, gimple
);
2981 case operand::OP_EXPR
:
2983 n_braces
= gen_gimple_expr (f
, indent
);
2985 n_braces
= gen_generic_expr (f
, indent
, opname
);
2991 else if (type
== DT_TRUE
)
2993 else if (type
== DT_MATCH
)
2994 n_braces
= gen_match_op (f
, indent
, opname
);
2998 indent
+= 4 * n_braces
;
2999 gen_kids (f
, indent
, gimple
);
3001 for (unsigned i
= 0; i
< n_braces
; ++i
)
3006 fprintf_indent (f
, indent
, " }\n");
3011 /* Generate code for the '(if ...)', '(with ..)' and actual transform
3012 step of a '(simplify ...)' or '(match ...)'. This handles everything
3013 that is not part of the decision tree (simplify->match).
3014 Main recursive worker. */
3017 dt_simplify::gen_1 (FILE *f
, int indent
, bool gimple
, operand
*result
)
3021 if (with_expr
*w
= dyn_cast
<with_expr
*> (result
))
3023 fprintf_indent (f
, indent
, "{\n");
3025 output_line_directive (f
, w
->location
);
3026 w
->with
->gen_transform (f
, indent
, NULL
, true, 1, "type", NULL
);
3027 gen_1 (f
, indent
, gimple
, w
->subexpr
);
3029 fprintf_indent (f
, indent
, "}\n");
3032 else if (if_expr
*ife
= dyn_cast
<if_expr
*> (result
))
3034 output_line_directive (f
, ife
->location
);
3035 fprintf_indent (f
, indent
, "if (");
3036 ife
->cond
->gen_transform (f
, indent
, NULL
, true, 1, "type", NULL
);
3038 fprintf_indent (f
, indent
+ 2, "{\n");
3040 gen_1 (f
, indent
, gimple
, ife
->trueexpr
);
3042 fprintf_indent (f
, indent
+ 2, "}\n");
3045 fprintf_indent (f
, indent
, "else\n");
3046 fprintf_indent (f
, indent
+ 2, "{\n");
3048 gen_1 (f
, indent
, gimple
, ife
->falseexpr
);
3050 fprintf_indent (f
, indent
+ 2, "}\n");
3056 /* Analyze captures and perform early-outs on the incoming arguments
3057 that cover cases we cannot handle. */
3058 capture_info
cinfo (s
, result
, gimple
);
3059 if (s
->kind
== simplify::SIMPLIFY
)
3063 for (unsigned i
= 0; i
< as_a
<expr
*> (s
->match
)->ops
.length (); ++i
)
3064 if (cinfo
.force_no_side_effects
& (1 << i
))
3066 fprintf_indent (f
, indent
,
3067 "if (TREE_SIDE_EFFECTS (op%d)) return NULL_TREE;\n",
3070 warning_at (as_a
<expr
*> (s
->match
)->ops
[i
]->location
,
3071 "forcing toplevel operand to have no "
3074 for (int i
= 0; i
<= s
->capture_max
; ++i
)
3075 if (cinfo
.info
[i
].cse_p
)
3077 else if (cinfo
.info
[i
].force_no_side_effects_p
3078 && (cinfo
.info
[i
].toplevel_msk
3079 & cinfo
.force_no_side_effects
) == 0)
3081 fprintf_indent (f
, indent
,
3082 "if (TREE_SIDE_EFFECTS (captures[%d])) "
3083 "return NULL_TREE;\n", i
);
3085 warning_at (cinfo
.info
[i
].c
->location
,
3086 "forcing captured operand to have no "
3089 else if ((cinfo
.info
[i
].toplevel_msk
3090 & cinfo
.force_no_side_effects
) != 0)
3091 /* Mark capture as having no side-effects if we had to verify
3092 that via forced toplevel operand checks. */
3093 cinfo
.info
[i
].force_no_side_effects_p
= true;
3097 /* Force single-use restriction by only allowing simple
3098 results via setting seq to NULL. */
3099 fprintf_indent (f
, indent
, "gimple_seq *lseq = seq;\n");
3100 bool first_p
= true;
3101 for (int i
= 0; i
<= s
->capture_max
; ++i
)
3102 if (cinfo
.info
[i
].force_single_use
)
3106 fprintf_indent (f
, indent
, "if (lseq\n");
3107 fprintf_indent (f
, indent
, " && (");
3113 fprintf_indent (f
, indent
, " || ");
3115 fprintf (f
, "!single_use (captures[%d])", i
);
3119 fprintf (f
, "))\n");
3120 fprintf_indent (f
, indent
, " lseq = NULL;\n");
3125 fprintf_indent (f
, indent
, "if (dump_file && (dump_flags & TDF_DETAILS)) "
3126 "fprintf (dump_file, \"Applying pattern ");
3127 output_line_directive (f
,
3128 result
? result
->location
: s
->match
->location
, true);
3129 fprintf (f
, ", %%s:%%d\\n\", __FILE__, __LINE__);\n");
3133 /* If there is no result then this is a predicate implementation. */
3134 fprintf_indent (f
, indent
, "return true;\n");
3138 /* For GIMPLE simply drop NON_LVALUE_EXPR (which only appears
3139 in outermost position). */
3140 if (result
->type
== operand::OP_EXPR
3141 && *as_a
<expr
*> (result
)->operation
== NON_LVALUE_EXPR
)
3142 result
= as_a
<expr
*> (result
)->ops
[0];
3143 if (result
->type
== operand::OP_EXPR
)
3145 expr
*e
= as_a
<expr
*> (result
);
3146 id_base
*opr
= e
->operation
;
3147 bool is_predicate
= false;
3148 /* When we delay operator substituting during lowering of fors we
3149 make sure that for code-gen purposes the effects of each substitute
3150 are the same. Thus just look at that. */
3151 if (user_id
*uid
= dyn_cast
<user_id
*> (opr
))
3152 opr
= uid
->substitutes
[0];
3153 else if (is_a
<predicate_id
*> (opr
))
3154 is_predicate
= true;
3156 fprintf_indent (f
, indent
, "*res_code = %s;\n",
3157 *e
->operation
== CONVERT_EXPR
3158 ? "NOP_EXPR" : e
->operation
->id
);
3159 for (unsigned j
= 0; j
< e
->ops
.length (); ++j
)
3162 snprintf (dest
, 32, "res_ops[%d]", j
);
3164 = get_operand_type (opr
,
3165 "type", e
->expr_type
,
3166 j
== 0 ? NULL
: "TREE_TYPE (res_ops[0])");
3167 /* We need to expand GENERIC conditions we captured from
3168 COND_EXPRs and we need to unshare them when substituting
3170 int cond_handling
= 0;
3172 cond_handling
= ((*opr
== COND_EXPR
3173 || *opr
== VEC_COND_EXPR
) && j
== 0) ? 1 : 2;
3174 e
->ops
[j
]->gen_transform (f
, indent
, dest
, true, 1, optype
,
3175 &cinfo
, indexes
, cond_handling
);
3178 /* Re-fold the toplevel result. It's basically an embedded
3179 gimple_build w/o actually building the stmt. */
3181 fprintf_indent (f
, indent
,
3182 "gimple_resimplify%d (lseq, res_code, type, "
3183 "res_ops, valueize);\n", e
->ops
.length ());
3185 else if (result
->type
== operand::OP_CAPTURE
3186 || result
->type
== operand::OP_C_EXPR
)
3188 result
->gen_transform (f
, indent
, "res_ops[0]", true, 1, "type",
3190 fprintf_indent (f
, indent
, "*res_code = TREE_CODE (res_ops[0]);\n");
3191 if (is_a
<capture
*> (result
)
3192 && cinfo
.info
[as_a
<capture
*> (result
)->where
].cond_expr_cond_p
)
3194 /* ??? Stupid tcc_comparison GENERIC trees in COND_EXPRs. Deal
3195 with substituting a capture of that. */
3196 fprintf_indent (f
, indent
,
3197 "if (COMPARISON_CLASS_P (res_ops[0]))\n");
3198 fprintf_indent (f
, indent
,
3200 fprintf_indent (f
, indent
,
3201 " tree tem = res_ops[0];\n");
3202 fprintf_indent (f
, indent
,
3203 " res_ops[0] = TREE_OPERAND (tem, 0);\n");
3204 fprintf_indent (f
, indent
,
3205 " res_ops[1] = TREE_OPERAND (tem, 1);\n");
3206 fprintf_indent (f
, indent
,
3212 fprintf_indent (f
, indent
, "return true;\n");
3216 bool is_predicate
= false;
3217 if (result
->type
== operand::OP_EXPR
)
3219 expr
*e
= as_a
<expr
*> (result
);
3220 id_base
*opr
= e
->operation
;
3221 /* When we delay operator substituting during lowering of fors we
3222 make sure that for code-gen purposes the effects of each substitute
3223 are the same. Thus just look at that. */
3224 if (user_id
*uid
= dyn_cast
<user_id
*> (opr
))
3225 opr
= uid
->substitutes
[0];
3226 else if (is_a
<predicate_id
*> (opr
))
3227 is_predicate
= true;
3228 /* Search for captures used multiple times in the result expression
3229 and wrap them in a SAVE_EXPR. Allow as many uses as in the
3230 original expression. */
3232 for (int i
= 0; i
< s
->capture_max
+ 1; ++i
)
3234 if (cinfo
.info
[i
].same_as
!= (unsigned)i
3235 || cinfo
.info
[i
].cse_p
)
3237 if (cinfo
.info
[i
].result_use_count
3238 > cinfo
.info
[i
].match_use_count
)
3239 fprintf_indent (f
, indent
,
3240 "if (! tree_invariant_p (captures[%d])) "
3241 "return NULL_TREE;\n", i
);
3243 for (unsigned j
= 0; j
< e
->ops
.length (); ++j
)
3247 snprintf (dest
, 32, "res_ops[%d]", j
);
3250 fprintf_indent (f
, indent
, "tree res_op%d;\n", j
);
3251 snprintf (dest
, 32, "res_op%d", j
);
3254 = get_operand_type (opr
,
3255 "type", e
->expr_type
,
3257 ? NULL
: "TREE_TYPE (res_op0)");
3258 e
->ops
[j
]->gen_transform (f
, indent
, dest
, false, 1, optype
,
3262 fprintf_indent (f
, indent
, "return true;\n");
3265 fprintf_indent (f
, indent
, "tree res;\n");
3266 /* Re-fold the toplevel result. Use non_lvalue to
3267 build NON_LVALUE_EXPRs so they get properly
3268 ignored when in GIMPLE form. */
3269 if (*opr
== NON_LVALUE_EXPR
)
3270 fprintf_indent (f
, indent
,
3271 "res = non_lvalue_loc (loc, res_op0);\n");
3274 if (is_a
<operator_id
*> (opr
))
3275 fprintf_indent (f
, indent
,
3276 "res = fold_build%d_loc (loc, %s, type",
3278 *e
->operation
== CONVERT_EXPR
3279 ? "NOP_EXPR" : e
->operation
->id
);
3281 fprintf_indent (f
, indent
,
3282 "res = maybe_build_call_expr_loc (loc, "
3283 "%s, type, %d", e
->operation
->id
,
3285 for (unsigned j
= 0; j
< e
->ops
.length (); ++j
)
3286 fprintf (f
, ", res_op%d", j
);
3287 fprintf (f
, ");\n");
3288 if (!is_a
<operator_id
*> (opr
))
3290 fprintf_indent (f
, indent
, "if (!res)\n");
3291 fprintf_indent (f
, indent
, " return NULL_TREE;\n");
3296 else if (result
->type
== operand::OP_CAPTURE
3297 || result
->type
== operand::OP_C_EXPR
)
3300 fprintf_indent (f
, indent
, "tree res;\n");
3301 result
->gen_transform (f
, indent
, "res", false, 1, "type",
3308 /* Search for captures not used in the result expression and dependent
3309 on TREE_SIDE_EFFECTS emit omit_one_operand. */
3310 for (int i
= 0; i
< s
->capture_max
+ 1; ++i
)
3312 if (cinfo
.info
[i
].same_as
!= (unsigned)i
)
3314 if (!cinfo
.info
[i
].force_no_side_effects_p
3315 && !cinfo
.info
[i
].expr_p
3316 && cinfo
.info
[i
].result_use_count
== 0)
3318 fprintf_indent (f
, indent
,
3319 "if (TREE_SIDE_EFFECTS (captures[%d]))\n",
3321 fprintf_indent (f
, indent
+ 2,
3322 "res = build2_loc (loc, COMPOUND_EXPR, type, "
3323 "fold_ignored_result (captures[%d]), res);\n",
3327 fprintf_indent (f
, indent
, "return res;\n");
3332 /* Generate code for the '(if ...)', '(with ..)' and actual transform
3333 step of a '(simplify ...)' or '(match ...)'. This handles everything
3334 that is not part of the decision tree (simplify->match). */
3337 dt_simplify::gen (FILE *f
, int indent
, bool gimple
)
3339 fprintf_indent (f
, indent
, "{\n");
3341 output_line_directive (f
,
3342 s
->result
? s
->result
->location
: s
->match
->location
);
3343 if (s
->capture_max
>= 0)
3346 fprintf_indent (f
, indent
, "tree captures[%u] ATTRIBUTE_UNUSED = { %s",
3347 s
->capture_max
+ 1, indexes
[0]->get_name (opname
));
3349 for (int i
= 1; i
<= s
->capture_max
; ++i
)
3353 fprintf (f
, ", %s", indexes
[i
]->get_name (opname
));
3355 fprintf (f
, " };\n");
3358 /* If we have a split-out function for the actual transform, call it. */
3359 if (info
&& info
->fname
)
3363 fprintf_indent (f
, indent
, "if (%s (res_code, res_ops, seq, "
3364 "valueize, type, captures", info
->fname
);
3365 for (unsigned i
= 0; i
< s
->for_subst_vec
.length (); ++i
)
3366 if (s
->for_subst_vec
[i
].first
->used
)
3367 fprintf (f
, ", %s", s
->for_subst_vec
[i
].second
->id
);
3368 fprintf (f
, "))\n");
3369 fprintf_indent (f
, indent
, " return true;\n");
3373 fprintf_indent (f
, indent
, "tree res = %s (loc, type",
3375 for (unsigned i
= 0; i
< as_a
<expr
*> (s
->match
)->ops
.length (); ++i
)
3376 fprintf (f
, ", op%d", i
);
3377 fprintf (f
, ", captures");
3378 for (unsigned i
= 0; i
< s
->for_subst_vec
.length (); ++i
)
3380 if (s
->for_subst_vec
[i
].first
->used
)
3381 fprintf (f
, ", %s", s
->for_subst_vec
[i
].second
->id
);
3383 fprintf (f
, ");\n");
3384 fprintf_indent (f
, indent
, "if (res) return res;\n");
3389 for (unsigned i
= 0; i
< s
->for_subst_vec
.length (); ++i
)
3391 if (! s
->for_subst_vec
[i
].first
->used
)
3393 if (is_a
<operator_id
*> (s
->for_subst_vec
[i
].second
))
3394 fprintf_indent (f
, indent
, "enum tree_code %s = %s;\n",
3395 s
->for_subst_vec
[i
].first
->id
,
3396 s
->for_subst_vec
[i
].second
->id
);
3397 else if (is_a
<fn_id
*> (s
->for_subst_vec
[i
].second
))
3398 fprintf_indent (f
, indent
, "combined_fn %s = %s;\n",
3399 s
->for_subst_vec
[i
].first
->id
,
3400 s
->for_subst_vec
[i
].second
->id
);
3404 gen_1 (f
, indent
, gimple
, s
->result
);
3408 fprintf_indent (f
, indent
, "}\n");
3412 /* Hash function for finding equivalent transforms. */
3415 sinfo_hashmap_traits::hash (const key_type
&v
)
3417 /* Only bother to compare those originating from the same source pattern. */
3418 return v
->s
->result
->location
;
3421 /* Compare function for finding equivalent transforms. */
3424 compare_op (operand
*o1
, simplify
*s1
, operand
*o2
, simplify
*s2
)
3426 if (o1
->type
!= o2
->type
)
3431 case operand::OP_IF
:
3433 if_expr
*if1
= as_a
<if_expr
*> (o1
);
3434 if_expr
*if2
= as_a
<if_expr
*> (o2
);
3435 /* ??? Properly compare c-exprs. */
3436 if (if1
->cond
!= if2
->cond
)
3438 if (!compare_op (if1
->trueexpr
, s1
, if2
->trueexpr
, s2
))
3440 if (if1
->falseexpr
!= if2
->falseexpr
3442 && !compare_op (if1
->falseexpr
, s1
, if2
->falseexpr
, s2
)))
3446 case operand::OP_WITH
:
3448 with_expr
*with1
= as_a
<with_expr
*> (o1
);
3449 with_expr
*with2
= as_a
<with_expr
*> (o2
);
3450 if (with1
->with
!= with2
->with
)
3452 return compare_op (with1
->subexpr
, s1
, with2
->subexpr
, s2
);
3457 /* We've hit a result. Time to compare capture-infos - this is required
3458 in addition to the conservative pointer-equivalency of the result IL. */
3459 capture_info
cinfo1 (s1
, o1
, true);
3460 capture_info
cinfo2 (s2
, o2
, true);
3462 if (cinfo1
.force_no_side_effects
!= cinfo2
.force_no_side_effects
3463 || cinfo1
.info
.length () != cinfo2
.info
.length ())
3466 for (unsigned i
= 0; i
< cinfo1
.info
.length (); ++i
)
3468 if (cinfo1
.info
[i
].expr_p
!= cinfo2
.info
[i
].expr_p
3469 || cinfo1
.info
[i
].cse_p
!= cinfo2
.info
[i
].cse_p
3470 || (cinfo1
.info
[i
].force_no_side_effects_p
3471 != cinfo2
.info
[i
].force_no_side_effects_p
)
3472 || cinfo1
.info
[i
].force_single_use
!= cinfo2
.info
[i
].force_single_use
3473 || cinfo1
.info
[i
].cond_expr_cond_p
!= cinfo2
.info
[i
].cond_expr_cond_p
3474 /* toplevel_msk is an optimization */
3475 || cinfo1
.info
[i
].result_use_count
!= cinfo2
.info
[i
].result_use_count
3476 || cinfo1
.info
[i
].same_as
!= cinfo2
.info
[i
].same_as
3477 /* the pointer back to the capture is for diagnostics only */)
3481 /* ??? Deep-compare the actual result. */
3486 sinfo_hashmap_traits::equal_keys (const key_type
&v
,
3487 const key_type
&candidate
)
3489 return compare_op (v
->s
->result
, v
->s
, candidate
->s
->result
, candidate
->s
);
3493 /* Main entry to generate code for matching GIMPLE IL off the decision
3497 decision_tree::gen (FILE *f
, bool gimple
)
3503 fprintf (stderr
, "%s decision tree has %u leafs, maximum depth %u and "
3504 "a total number of %u nodes\n",
3505 gimple
? "GIMPLE" : "GENERIC",
3506 root
->num_leafs
, root
->max_level
, root
->total_size
);
3508 /* First split out the transform part of equal leafs. */
3511 for (sinfo_map_t::iterator iter
= si
.begin ();
3512 iter
!= si
.end (); ++iter
)
3514 sinfo
*s
= (*iter
).second
;
3515 /* Do not split out single uses. */
3522 fprintf (stderr
, "found %u uses of", s
->cnt
);
3523 output_line_directive (stderr
, s
->s
->s
->result
->location
);
3526 /* Generate a split out function with the leaf transform code. */
3527 s
->fname
= xasprintf ("%s_simplify_%u", gimple
? "gimple" : "generic",
3530 fprintf (f
, "\nstatic bool\n"
3531 "%s (code_helper *res_code, tree *res_ops,\n"
3532 " gimple_seq *seq, tree (*valueize)(tree) "
3533 "ATTRIBUTE_UNUSED,\n"
3534 " tree ARG_UNUSED (type), tree *ARG_UNUSED "
3539 fprintf (f
, "\nstatic tree\n"
3540 "%s (location_t ARG_UNUSED (loc), tree ARG_UNUSED (type),\n",
3541 (*iter
).second
->fname
);
3542 for (unsigned i
= 0;
3543 i
< as_a
<expr
*>(s
->s
->s
->match
)->ops
.length (); ++i
)
3544 fprintf (f
, " tree ARG_UNUSED (op%d),", i
);
3545 fprintf (f
, " tree *captures\n");
3547 for (unsigned i
= 0; i
< s
->s
->s
->for_subst_vec
.length (); ++i
)
3549 if (! s
->s
->s
->for_subst_vec
[i
].first
->used
)
3551 if (is_a
<operator_id
*> (s
->s
->s
->for_subst_vec
[i
].second
))
3552 fprintf (f
, ", enum tree_code ARG_UNUSED (%s)",
3553 s
->s
->s
->for_subst_vec
[i
].first
->id
);
3554 else if (is_a
<fn_id
*> (s
->s
->s
->for_subst_vec
[i
].second
))
3555 fprintf (f
, ", combined_fn ARG_UNUSED (%s)",
3556 s
->s
->s
->for_subst_vec
[i
].first
->id
);
3559 fprintf (f
, ")\n{\n");
3560 s
->s
->gen_1 (f
, 2, gimple
, s
->s
->s
->result
);
3562 fprintf (f
, " return false;\n");
3564 fprintf (f
, " return NULL_TREE;\n");
3567 fprintf (stderr
, "removed %u duplicate tails\n", rcnt
);
3569 for (unsigned n
= 1; n
<= 3; ++n
)
3571 /* First generate split-out functions. */
3572 for (unsigned i
= 0; i
< root
->kids
.length (); i
++)
3574 dt_operand
*dop
= static_cast<dt_operand
*>(root
->kids
[i
]);
3575 expr
*e
= static_cast<expr
*>(dop
->op
);
3576 if (e
->ops
.length () != n
3577 /* Builtin simplifications are somewhat premature on
3578 GENERIC. The following drops patterns with outermost
3579 calls. It's easy to emit overloads for function code
3580 though if necessary. */
3582 && e
->operation
->kind
!= id_base::CODE
))
3586 fprintf (f
, "\nstatic bool\n"
3587 "gimple_simplify_%s (code_helper *res_code, tree *res_ops,\n"
3588 " gimple_seq *seq, tree (*valueize)(tree) "
3589 "ATTRIBUTE_UNUSED,\n"
3590 " code_helper ARG_UNUSED (code), tree "
3591 "ARG_UNUSED (type)\n",
3594 fprintf (f
, "\nstatic tree\n"
3595 "generic_simplify_%s (location_t ARG_UNUSED (loc), enum "
3596 "tree_code ARG_UNUSED (code), tree ARG_UNUSED (type)",
3598 for (unsigned i
= 0; i
< n
; ++i
)
3599 fprintf (f
, ", tree op%d", i
);
3602 dop
->gen_kids (f
, 2, gimple
);
3604 fprintf (f
, " return false;\n");
3606 fprintf (f
, " return NULL_TREE;\n");
3610 /* Then generate the main entry with the outermost switch and
3611 tail-calls to the split-out functions. */
3613 fprintf (f
, "\nstatic bool\n"
3614 "gimple_simplify (code_helper *res_code, tree *res_ops,\n"
3615 " gimple_seq *seq, tree (*valueize)(tree),\n"
3616 " code_helper code, tree type");
3618 fprintf (f
, "\ntree\n"
3619 "generic_simplify (location_t loc, enum tree_code code, "
3620 "tree type ATTRIBUTE_UNUSED");
3621 for (unsigned i
= 0; i
< n
; ++i
)
3622 fprintf (f
, ", tree op%d", i
);
3627 fprintf (f
, " switch (code.get_rep())\n"
3630 fprintf (f
, " switch (code)\n"
3632 for (unsigned i
= 0; i
< root
->kids
.length (); i
++)
3634 dt_operand
*dop
= static_cast<dt_operand
*>(root
->kids
[i
]);
3635 expr
*e
= static_cast<expr
*>(dop
->op
);
3636 if (e
->ops
.length () != n
3637 /* Builtin simplifications are somewhat premature on
3638 GENERIC. The following drops patterns with outermost
3639 calls. It's easy to emit overloads for function code
3640 though if necessary. */
3642 && e
->operation
->kind
!= id_base::CODE
))
3645 if (*e
->operation
== CONVERT_EXPR
3646 || *e
->operation
== NOP_EXPR
)
3647 fprintf (f
, " CASE_CONVERT:\n");
3649 fprintf (f
, " case %s%s:\n",
3650 is_a
<fn_id
*> (e
->operation
) ? "-" : "",
3653 fprintf (f
, " return gimple_simplify_%s (res_code, res_ops, "
3654 "seq, valueize, code, type", e
->operation
->id
);
3656 fprintf (f
, " return generic_simplify_%s (loc, code, type",
3658 for (unsigned i
= 0; i
< n
; ++i
)
3659 fprintf (f
, ", op%d", i
);
3660 fprintf (f
, ");\n");
3662 fprintf (f
, " default:;\n"
3666 fprintf (f
, " return false;\n");
3668 fprintf (f
, " return NULL_TREE;\n");
3673 /* Output code to implement the predicate P from the decision tree DT. */
3676 write_predicate (FILE *f
, predicate_id
*p
, decision_tree
&dt
, bool gimple
)
3678 fprintf (f
, "\nbool\n"
3679 "%s%s (tree t%s%s)\n"
3680 "{\n", gimple
? "gimple_" : "tree_", p
->id
,
3681 p
->nargs
> 0 ? ", tree *res_ops" : "",
3682 gimple
? ", tree (*valueize)(tree) ATTRIBUTE_UNUSED" : "");
3683 /* Conveniently make 'type' available. */
3684 fprintf_indent (f
, 2, "tree type = TREE_TYPE (t);\n");
3687 fprintf_indent (f
, 2, "if (TREE_SIDE_EFFECTS (t)) return false;\n");
3688 dt
.root
->gen_kids (f
, 2, gimple
);
3690 fprintf_indent (f
, 2, "return false;\n"
3694 /* Write the common header for the GIMPLE/GENERIC IL matching routines. */
3697 write_header (FILE *f
, const char *head
)
3699 fprintf (f
, "/* Generated automatically by the program `genmatch' from\n");
3700 fprintf (f
, " a IL pattern matching and simplification description. */\n");
3702 /* Include the header instead of writing it awkwardly quoted here. */
3703 fprintf (f
, "\n#include \"%s\"\n", head
);
3713 parser (cpp_reader
*);
3716 const cpp_token
*next ();
3717 const cpp_token
*peek (unsigned = 1);
3718 const cpp_token
*peek_ident (const char * = NULL
, unsigned = 1);
3719 const cpp_token
*expect (enum cpp_ttype
);
3720 const cpp_token
*eat_token (enum cpp_ttype
);
3721 const char *get_string ();
3722 const char *get_ident ();
3723 const cpp_token
*eat_ident (const char *);
3724 const char *get_number ();
3726 id_base
*parse_operation ();
3727 operand
*parse_capture (operand
*, bool);
3728 operand
*parse_expr ();
3729 c_expr
*parse_c_expr (cpp_ttype
);
3730 operand
*parse_op ();
3732 void record_operlist (source_location
, user_id
*);
3734 void parse_pattern ();
3735 operand
*parse_result (operand
*, predicate_id
*);
3736 void push_simplify (simplify::simplify_kind
,
3737 vec
<simplify
*>&, operand
*, operand
*);
3738 void parse_simplify (simplify::simplify_kind
,
3739 vec
<simplify
*>&, predicate_id
*, operand
*);
3740 void parse_for (source_location
);
3741 void parse_if (source_location
);
3742 void parse_predicates (source_location
);
3743 void parse_operator_list (source_location
);
3746 vec
<c_expr
*> active_ifs
;
3747 vec
<vec
<user_id
*> > active_fors
;
3748 hash_set
<user_id
*> *oper_lists_set
;
3749 vec
<user_id
*> oper_lists
;
3751 cid_map_t
*capture_ids
;
3754 vec
<simplify
*> simplifiers
;
3755 vec
<predicate_id
*> user_predicates
;
3756 bool parsing_match_operand
;
3759 /* Lexing helpers. */
3761 /* Read the next non-whitespace token from R. */
3766 const cpp_token
*token
;
3769 token
= cpp_get_token (r
);
3771 while (token
->type
== CPP_PADDING
3772 && token
->type
!= CPP_EOF
);
3776 /* Peek at the next non-whitespace token from R. */
3779 parser::peek (unsigned num
)
3781 const cpp_token
*token
;
3785 token
= cpp_peek_token (r
, i
++);
3787 while ((token
->type
== CPP_PADDING
3788 && token
->type
!= CPP_EOF
)
3790 /* If we peek at EOF this is a fatal error as it leaves the
3791 cpp_reader in unusable state. Assume we really wanted a
3792 token and thus this EOF is unexpected. */
3793 if (token
->type
== CPP_EOF
)
3794 fatal_at (token
, "unexpected end of file");
3798 /* Peek at the next identifier token (or return NULL if the next
3799 token is not an identifier or equal to ID if supplied). */
3802 parser::peek_ident (const char *id
, unsigned num
)
3804 const cpp_token
*token
= peek (num
);
3805 if (token
->type
!= CPP_NAME
)
3811 const char *t
= (const char *) CPP_HASHNODE (token
->val
.node
.node
)->ident
.str
;
3812 if (strcmp (id
, t
) == 0)
3818 /* Read the next token from R and assert it is of type TK. */
3821 parser::expect (enum cpp_ttype tk
)
3823 const cpp_token
*token
= next ();
3824 if (token
->type
!= tk
)
3825 fatal_at (token
, "expected %s, got %s",
3826 cpp_type2name (tk
, 0), cpp_type2name (token
->type
, 0));
3831 /* Consume the next token from R and assert it is of type TK. */
3834 parser::eat_token (enum cpp_ttype tk
)
3839 /* Read the next token from R and assert it is of type CPP_STRING and
3840 return its value. */
3843 parser::get_string ()
3845 const cpp_token
*token
= expect (CPP_STRING
);
3846 return (const char *)token
->val
.str
.text
;
3849 /* Read the next token from R and assert it is of type CPP_NAME and
3850 return its value. */
3853 parser::get_ident ()
3855 const cpp_token
*token
= expect (CPP_NAME
);
3856 return (const char *)CPP_HASHNODE (token
->val
.node
.node
)->ident
.str
;
3859 /* Eat an identifier token with value S from R. */
3862 parser::eat_ident (const char *s
)
3864 const cpp_token
*token
= peek ();
3865 const char *t
= get_ident ();
3866 if (strcmp (s
, t
) != 0)
3867 fatal_at (token
, "expected '%s' got '%s'\n", s
, t
);
3871 /* Read the next token from R and assert it is of type CPP_NUMBER and
3872 return its value. */
3875 parser::get_number ()
3877 const cpp_token
*token
= expect (CPP_NUMBER
);
3878 return (const char *)token
->val
.str
.text
;
3882 /* Record an operator-list use for transparent for handling. */
3885 parser::record_operlist (source_location loc
, user_id
*p
)
3887 if (!oper_lists_set
->add (p
))
3889 if (!oper_lists
.is_empty ()
3890 && oper_lists
[0]->substitutes
.length () != p
->substitutes
.length ())
3891 fatal_at (loc
, "User-defined operator list does not have the "
3892 "same number of entries as others used in the pattern");
3893 oper_lists
.safe_push (p
);
3897 /* Parse the operator ID, special-casing convert?, convert1? and
3901 parser::parse_operation ()
3903 const cpp_token
*id_tok
= peek ();
3904 const char *id
= get_ident ();
3905 const cpp_token
*token
= peek ();
3906 if (strcmp (id
, "convert0") == 0)
3907 fatal_at (id_tok
, "use 'convert?' here");
3908 else if (strcmp (id
, "view_convert0") == 0)
3909 fatal_at (id_tok
, "use 'view_convert?' here");
3910 if (token
->type
== CPP_QUERY
3911 && !(token
->flags
& PREV_WHITE
))
3913 if (strcmp (id
, "convert") == 0)
3915 else if (strcmp (id
, "convert1") == 0)
3917 else if (strcmp (id
, "convert2") == 0)
3919 else if (strcmp (id
, "view_convert") == 0)
3920 id
= "view_convert0";
3921 else if (strcmp (id
, "view_convert1") == 0)
3923 else if (strcmp (id
, "view_convert2") == 0)
3926 fatal_at (id_tok
, "non-convert operator conditionalized");
3928 if (!parsing_match_operand
)
3929 fatal_at (id_tok
, "conditional convert can only be used in "
3930 "match expression");
3931 eat_token (CPP_QUERY
);
3933 else if (strcmp (id
, "convert1") == 0
3934 || strcmp (id
, "convert2") == 0
3935 || strcmp (id
, "view_convert1") == 0
3936 || strcmp (id
, "view_convert2") == 0)
3937 fatal_at (id_tok
, "expected '?' after conditional operator");
3938 id_base
*op
= get_operator (id
);
3940 fatal_at (id_tok
, "unknown operator %s", id
);
3942 user_id
*p
= dyn_cast
<user_id
*> (op
);
3943 if (p
&& p
->is_oper_list
)
3945 if (active_fors
.length() == 0)
3946 record_operlist (id_tok
->src_loc
, p
);
3948 fatal_at (id_tok
, "operator-list %s cannot be exapnded inside 'for'", id
);
3954 capture = '@'<number> */
3957 parser::parse_capture (operand
*op
, bool require_existing
)
3959 source_location src_loc
= eat_token (CPP_ATSIGN
)->src_loc
;
3960 const cpp_token
*token
= peek ();
3961 const char *id
= NULL
;
3962 if (token
->type
== CPP_NUMBER
)
3964 else if (token
->type
== CPP_NAME
)
3967 fatal_at (token
, "expected number or identifier");
3968 unsigned next_id
= capture_ids
->elements ();
3970 unsigned &num
= capture_ids
->get_or_insert (id
, &existed
);
3973 if (require_existing
)
3974 fatal_at (src_loc
, "unknown capture id");
3977 return new capture (src_loc
, num
, op
);
3980 /* Parse an expression
3981 expr = '(' <operation>[capture][flag][type] <operand>... ')' */
3984 parser::parse_expr ()
3986 const cpp_token
*token
= peek ();
3987 expr
*e
= new expr (parse_operation (), token
->src_loc
);
3990 bool is_commutative
= false;
3991 bool force_capture
= false;
3992 const char *expr_type
= NULL
;
3994 if (token
->type
== CPP_COLON
3995 && !(token
->flags
& PREV_WHITE
))
3997 eat_token (CPP_COLON
);
3999 if (token
->type
== CPP_NAME
4000 && !(token
->flags
& PREV_WHITE
))
4002 const char *s
= get_ident ();
4003 if (!parsing_match_operand
)
4013 = dyn_cast
<operator_id
*> (e
->operation
))
4015 if (!commutative_tree_code (p
->code
)
4016 && !comparison_code_p (p
->code
))
4017 fatal_at (token
, "operation is not commutative");
4019 else if (user_id
*p
= dyn_cast
<user_id
*> (e
->operation
))
4020 for (unsigned i
= 0;
4021 i
< p
->substitutes
.length (); ++i
)
4024 = dyn_cast
<operator_id
*> (p
->substitutes
[i
]))
4026 if (!commutative_tree_code (q
->code
)
4027 && !comparison_code_p (q
->code
))
4028 fatal_at (token
, "operation %s is not "
4029 "commutative", q
->id
);
4032 is_commutative
= true;
4034 else if (*sp
== 'C')
4035 is_commutative
= true;
4036 else if (*sp
== 's')
4038 e
->force_single_use
= true;
4039 force_capture
= true;
4042 fatal_at (token
, "flag %c not recognized", *sp
);
4049 fatal_at (token
, "expected flag or type specifying identifier");
4052 if (token
->type
== CPP_ATSIGN
4053 && !(token
->flags
& PREV_WHITE
))
4054 op
= parse_capture (e
, false);
4055 else if (force_capture
)
4057 unsigned num
= capture_ids
->elements ();
4060 sprintf (id
, "__%u", num
);
4061 capture_ids
->get_or_insert (xstrdup (id
), &existed
);
4063 fatal_at (token
, "reserved capture id '%s' already used", id
);
4064 op
= new capture (token
->src_loc
, num
, e
);
4070 const cpp_token
*token
= peek ();
4071 if (token
->type
== CPP_CLOSE_PAREN
)
4073 if (e
->operation
->nargs
!= -1
4074 && e
->operation
->nargs
!= (int) e
->ops
.length ())
4075 fatal_at (token
, "'%s' expects %u operands, not %u",
4076 e
->operation
->id
, e
->operation
->nargs
, e
->ops
.length ());
4079 if (e
->ops
.length () == 2)
4080 e
->is_commutative
= true;
4082 fatal_at (token
, "only binary operators or function with "
4083 "two arguments can be marked commutative");
4085 e
->expr_type
= expr_type
;
4088 else if (!(token
->flags
& PREV_WHITE
))
4089 fatal_at (token
, "expected expression operand");
4091 e
->append_op (parse_op ());
4096 /* Lex native C code delimited by START recording the preprocessing tokens
4097 for later processing.
4098 c_expr = ('{'|'(') <pp token>... ('}'|')') */
4101 parser::parse_c_expr (cpp_ttype start
)
4103 const cpp_token
*token
;
4106 vec
<cpp_token
> code
= vNULL
;
4107 unsigned nr_stmts
= 0;
4108 source_location loc
= eat_token (start
)->src_loc
;
4109 if (start
== CPP_OPEN_PAREN
)
4110 end
= CPP_CLOSE_PAREN
;
4111 else if (start
== CPP_OPEN_BRACE
)
4112 end
= CPP_CLOSE_BRACE
;
4120 /* Count brace pairs to find the end of the expr to match. */
4121 if (token
->type
== start
)
4123 else if (token
->type
== end
4127 /* This is a lame way of counting the number of statements. */
4128 if (token
->type
== CPP_SEMICOLON
)
4131 /* If this is possibly a user-defined identifier mark it used. */
4132 if (token
->type
== CPP_NAME
)
4134 id_base
*idb
= get_operator ((const char *)CPP_HASHNODE
4135 (token
->val
.node
.node
)->ident
.str
);
4137 if (idb
&& (p
= dyn_cast
<user_id
*> (idb
)) && p
->is_oper_list
)
4138 record_operlist (token
->src_loc
, p
);
4141 /* Record the token. */
4142 code
.safe_push (*token
);
4145 return new c_expr (r
, loc
, code
, nr_stmts
, vNULL
, capture_ids
);
4148 /* Parse an operand which is either an expression, a predicate or
4149 a standalone capture.
4150 op = predicate | expr | c_expr | capture */
4155 const cpp_token
*token
= peek ();
4156 struct operand
*op
= NULL
;
4157 if (token
->type
== CPP_OPEN_PAREN
)
4159 eat_token (CPP_OPEN_PAREN
);
4161 eat_token (CPP_CLOSE_PAREN
);
4163 else if (token
->type
== CPP_OPEN_BRACE
)
4165 op
= parse_c_expr (CPP_OPEN_BRACE
);
4169 /* Remaining ops are either empty or predicates */
4170 if (token
->type
== CPP_NAME
)
4172 const char *id
= get_ident ();
4173 id_base
*opr
= get_operator (id
);
4175 fatal_at (token
, "expected predicate name");
4176 if (operator_id
*code
= dyn_cast
<operator_id
*> (opr
))
4178 if (code
->nargs
!= 0)
4179 fatal_at (token
, "using an operator with operands as predicate");
4180 /* Parse the zero-operand operator "predicates" as
4182 op
= new expr (opr
, token
->src_loc
);
4184 else if (user_id
*code
= dyn_cast
<user_id
*> (opr
))
4186 if (code
->nargs
!= 0)
4187 fatal_at (token
, "using an operator with operands as predicate");
4188 /* Parse the zero-operand operator "predicates" as
4190 op
= new expr (opr
, token
->src_loc
);
4192 else if (predicate_id
*p
= dyn_cast
<predicate_id
*> (opr
))
4193 op
= new predicate (p
, token
->src_loc
);
4195 fatal_at (token
, "using an unsupported operator as predicate");
4196 if (!parsing_match_operand
)
4197 fatal_at (token
, "predicates are only allowed in match expression");
4199 if (token
->flags
& PREV_WHITE
)
4202 else if (token
->type
!= CPP_COLON
4203 && token
->type
!= CPP_ATSIGN
)
4204 fatal_at (token
, "expected expression or predicate");
4205 /* optionally followed by a capture and a predicate. */
4206 if (token
->type
== CPP_COLON
)
4207 fatal_at (token
, "not implemented: predicate on leaf operand");
4208 if (token
->type
== CPP_ATSIGN
)
4209 op
= parse_capture (op
, !parsing_match_operand
);
4215 /* Create a new simplify from the current parsing state and MATCH,
4216 MATCH_LOC, RESULT and RESULT_LOC and push it to SIMPLIFIERS. */
4219 parser::push_simplify (simplify::simplify_kind kind
,
4220 vec
<simplify
*>& simplifiers
,
4221 operand
*match
, operand
*result
)
4223 /* Build and push a temporary for operator list uses in expressions. */
4224 if (!oper_lists
.is_empty ())
4225 active_fors
.safe_push (oper_lists
);
4227 simplifiers
.safe_push
4228 (new simplify (kind
, match
, result
,
4229 active_fors
.copy (), capture_ids
));
4231 if (!oper_lists
.is_empty ())
4236 <result-op> = <op> | <if> | <with>
4237 <if> = '(' 'if' '(' <c-expr> ')' <result-op> ')'
4238 <with> = '(' 'with' '{' <c-expr> '}' <result-op> ')'
4242 parser::parse_result (operand
*result
, predicate_id
*matcher
)
4244 const cpp_token
*token
= peek ();
4245 if (token
->type
!= CPP_OPEN_PAREN
)
4248 eat_token (CPP_OPEN_PAREN
);
4249 if (peek_ident ("if"))
4252 if_expr
*ife
= new if_expr (token
->src_loc
);
4253 ife
->cond
= parse_c_expr (CPP_OPEN_PAREN
);
4254 if (peek ()->type
== CPP_OPEN_PAREN
)
4256 ife
->trueexpr
= parse_result (result
, matcher
);
4257 if (peek ()->type
== CPP_OPEN_PAREN
)
4258 ife
->falseexpr
= parse_result (result
, matcher
);
4259 else if (peek ()->type
!= CPP_CLOSE_PAREN
)
4260 ife
->falseexpr
= parse_op ();
4262 else if (peek ()->type
!= CPP_CLOSE_PAREN
)
4264 ife
->trueexpr
= parse_op ();
4265 if (peek ()->type
== CPP_OPEN_PAREN
)
4266 ife
->falseexpr
= parse_result (result
, matcher
);
4267 else if (peek ()->type
!= CPP_CLOSE_PAREN
)
4268 ife
->falseexpr
= parse_op ();
4270 /* If this if is immediately closed then it contains a
4271 manual matcher or is part of a predicate definition. */
4272 else /* if (peek ()->type == CPP_CLOSE_PAREN) */
4275 fatal_at (peek (), "manual transform not implemented");
4276 ife
->trueexpr
= result
;
4278 eat_token (CPP_CLOSE_PAREN
);
4281 else if (peek_ident ("with"))
4284 with_expr
*withe
= new with_expr (token
->src_loc
);
4285 /* Parse (with c-expr expr) as (if-with (true) expr). */
4286 withe
->with
= parse_c_expr (CPP_OPEN_BRACE
);
4287 withe
->with
->nr_stmts
= 0;
4288 withe
->subexpr
= parse_result (result
, matcher
);
4289 eat_token (CPP_CLOSE_PAREN
);
4292 else if (peek_ident ("switch"))
4294 token
= eat_ident ("switch");
4295 source_location ifloc
= eat_token (CPP_OPEN_PAREN
)->src_loc
;
4297 if_expr
*ife
= new if_expr (ifloc
);
4299 ife
->cond
= parse_c_expr (CPP_OPEN_PAREN
);
4300 if (peek ()->type
== CPP_OPEN_PAREN
)
4301 ife
->trueexpr
= parse_result (result
, matcher
);
4303 ife
->trueexpr
= parse_op ();
4304 eat_token (CPP_CLOSE_PAREN
);
4305 if (peek ()->type
!= CPP_OPEN_PAREN
4306 || !peek_ident ("if", 2))
4307 fatal_at (token
, "switch can be implemented with a single if");
4308 while (peek ()->type
!= CPP_CLOSE_PAREN
)
4310 if (peek ()->type
== CPP_OPEN_PAREN
)
4312 if (peek_ident ("if", 2))
4314 ifloc
= eat_token (CPP_OPEN_PAREN
)->src_loc
;
4316 ife
->falseexpr
= new if_expr (ifloc
);
4317 ife
= as_a
<if_expr
*> (ife
->falseexpr
);
4318 ife
->cond
= parse_c_expr (CPP_OPEN_PAREN
);
4319 if (peek ()->type
== CPP_OPEN_PAREN
)
4320 ife
->trueexpr
= parse_result (result
, matcher
);
4322 ife
->trueexpr
= parse_op ();
4323 eat_token (CPP_CLOSE_PAREN
);
4327 /* switch default clause */
4328 ife
->falseexpr
= parse_result (result
, matcher
);
4329 eat_token (CPP_CLOSE_PAREN
);
4335 /* switch default clause */
4336 ife
->falseexpr
= parse_op ();
4337 eat_token (CPP_CLOSE_PAREN
);
4341 eat_token (CPP_CLOSE_PAREN
);
4346 operand
*op
= result
;
4349 eat_token (CPP_CLOSE_PAREN
);
4355 simplify = 'simplify' <expr> <result-op>
4357 match = 'match' <ident> <expr> [<result-op>]
4358 and fill SIMPLIFIERS with the results. */
4361 parser::parse_simplify (simplify::simplify_kind kind
,
4362 vec
<simplify
*>& simplifiers
, predicate_id
*matcher
,
4365 /* Reset the capture map. */
4367 capture_ids
= new cid_map_t
;
4368 /* Reset oper_lists and set. */
4369 hash_set
<user_id
*> olist
;
4370 oper_lists_set
= &olist
;
4373 const cpp_token
*loc
= peek ();
4374 parsing_match_operand
= true;
4375 struct operand
*match
= parse_op ();
4376 parsing_match_operand
= false;
4377 if (match
->type
== operand::OP_CAPTURE
&& !matcher
)
4378 fatal_at (loc
, "outermost expression cannot be captured");
4379 if (match
->type
== operand::OP_EXPR
4380 && is_a
<predicate_id
*> (as_a
<expr
*> (match
)->operation
))
4381 fatal_at (loc
, "outermost expression cannot be a predicate");
4383 /* Splice active_ifs onto result and continue parsing the
4385 if_expr
*active_if
= NULL
;
4386 for (int i
= active_ifs
.length (); i
> 0; --i
)
4388 if_expr
*ifc
= new if_expr (active_ifs
[i
-1]->location
);
4389 ifc
->cond
= active_ifs
[i
-1];
4390 ifc
->trueexpr
= active_if
;
4393 if_expr
*outermost_if
= active_if
;
4394 while (active_if
&& active_if
->trueexpr
)
4395 active_if
= as_a
<if_expr
*> (active_if
->trueexpr
);
4397 const cpp_token
*token
= peek ();
4399 /* If this if is immediately closed then it is part of a predicate
4400 definition. Push it. */
4401 if (token
->type
== CPP_CLOSE_PAREN
)
4404 fatal_at (token
, "expected transform expression");
4407 active_if
->trueexpr
= result
;
4408 result
= outermost_if
;
4410 push_simplify (kind
, simplifiers
, match
, result
);
4414 operand
*tem
= parse_result (result
, matcher
);
4417 active_if
->trueexpr
= tem
;
4418 result
= outermost_if
;
4423 push_simplify (kind
, simplifiers
, match
, result
);
4426 /* Parsing of the outer control structures. */
4428 /* Parse a for expression
4429 for = '(' 'for' <subst>... <pattern> ')'
4430 subst = <ident> '(' <ident>... ')' */
4433 parser::parse_for (source_location
)
4435 auto_vec
<const cpp_token
*> user_id_tokens
;
4436 vec
<user_id
*> user_ids
= vNULL
;
4437 const cpp_token
*token
;
4438 unsigned min_n_opers
= 0, max_n_opers
= 0;
4443 if (token
->type
!= CPP_NAME
)
4446 /* Insert the user defined operators into the operator hash. */
4447 const char *id
= get_ident ();
4448 if (get_operator (id
, true) != NULL
)
4449 fatal_at (token
, "operator already defined");
4450 user_id
*op
= new user_id (id
);
4451 id_base
**slot
= operators
->find_slot_with_hash (op
, op
->hashval
, INSERT
);
4453 user_ids
.safe_push (op
);
4454 user_id_tokens
.safe_push (token
);
4456 eat_token (CPP_OPEN_PAREN
);
4459 while ((token
= peek_ident ()) != 0)
4461 const char *oper
= get_ident ();
4462 id_base
*idb
= get_operator (oper
, true);
4464 fatal_at (token
, "no such operator '%s'", oper
);
4465 if (*idb
== CONVERT0
|| *idb
== CONVERT1
|| *idb
== CONVERT2
4466 || *idb
== VIEW_CONVERT0
|| *idb
== VIEW_CONVERT1
4467 || *idb
== VIEW_CONVERT2
)
4468 fatal_at (token
, "conditional operators cannot be used inside for");
4472 else if (idb
->nargs
== -1)
4474 else if (idb
->nargs
!= arity
)
4475 fatal_at (token
, "operator '%s' with arity %d does not match "
4476 "others with arity %d", oper
, idb
->nargs
, arity
);
4478 user_id
*p
= dyn_cast
<user_id
*> (idb
);
4481 if (p
->is_oper_list
)
4482 op
->substitutes
.safe_splice (p
->substitutes
);
4484 fatal_at (token
, "iterator cannot be used as operator-list");
4487 op
->substitutes
.safe_push (idb
);
4490 token
= expect (CPP_CLOSE_PAREN
);
4492 unsigned nsubstitutes
= op
->substitutes
.length ();
4493 if (nsubstitutes
== 0)
4494 fatal_at (token
, "A user-defined operator must have at least "
4495 "one substitution");
4496 if (max_n_opers
== 0)
4498 min_n_opers
= nsubstitutes
;
4499 max_n_opers
= nsubstitutes
;
4503 if (nsubstitutes
% min_n_opers
!= 0
4504 && min_n_opers
% nsubstitutes
!= 0)
4505 fatal_at (token
, "All user-defined identifiers must have a "
4506 "multiple number of operator substitutions of the "
4507 "smallest number of substitutions");
4508 if (nsubstitutes
< min_n_opers
)
4509 min_n_opers
= nsubstitutes
;
4510 else if (nsubstitutes
> max_n_opers
)
4511 max_n_opers
= nsubstitutes
;
4515 unsigned n_ids
= user_ids
.length ();
4517 fatal_at (token
, "for requires at least one user-defined identifier");
4520 if (token
->type
== CPP_CLOSE_PAREN
)
4521 fatal_at (token
, "no pattern defined in for");
4523 active_fors
.safe_push (user_ids
);
4527 if (token
->type
== CPP_CLOSE_PAREN
)
4533 /* Remove user-defined operators from the hash again. */
4534 for (unsigned i
= 0; i
< user_ids
.length (); ++i
)
4536 if (!user_ids
[i
]->used
)
4537 warning_at (user_id_tokens
[i
],
4538 "operator %s defined but not used", user_ids
[i
]->id
);
4539 operators
->remove_elt (user_ids
[i
]);
4543 /* Parse an identifier associated with a list of operators.
4544 oprs = '(' 'define_operator_list' <ident> <ident>... ')' */
4547 parser::parse_operator_list (source_location
)
4549 const cpp_token
*token
= peek ();
4550 const char *id
= get_ident ();
4552 if (get_operator (id
, true) != 0)
4553 fatal_at (token
, "operator %s already defined", id
);
4555 user_id
*op
= new user_id (id
, true);
4558 while ((token
= peek_ident ()) != 0)
4561 const char *oper
= get_ident ();
4562 id_base
*idb
= get_operator (oper
, true);
4565 fatal_at (token
, "no such operator '%s'", oper
);
4569 else if (idb
->nargs
== -1)
4571 else if (arity
!= idb
->nargs
)
4572 fatal_at (token
, "operator '%s' with arity %d does not match "
4573 "others with arity %d", oper
, idb
->nargs
, arity
);
4575 /* We allow composition of multiple operator lists. */
4576 if (user_id
*p
= dyn_cast
<user_id
*> (idb
))
4577 op
->substitutes
.safe_splice (p
->substitutes
);
4579 op
->substitutes
.safe_push (idb
);
4582 // Check that there is no junk after id-list
4584 if (token
->type
!= CPP_CLOSE_PAREN
)
4585 fatal_at (token
, "expected identifier got %s", cpp_type2name (token
->type
, 0));
4587 if (op
->substitutes
.length () == 0)
4588 fatal_at (token
, "operator-list cannot be empty");
4591 id_base
**slot
= operators
->find_slot_with_hash (op
, op
->hashval
, INSERT
);
4595 /* Parse an outer if expression.
4596 if = '(' 'if' '(' <c-expr> ')' <pattern> ')' */
4599 parser::parse_if (source_location
)
4601 c_expr
*ifexpr
= parse_c_expr (CPP_OPEN_PAREN
);
4603 const cpp_token
*token
= peek ();
4604 if (token
->type
== CPP_CLOSE_PAREN
)
4605 fatal_at (token
, "no pattern defined in if");
4607 active_ifs
.safe_push (ifexpr
);
4610 const cpp_token
*token
= peek ();
4611 if (token
->type
== CPP_CLOSE_PAREN
)
4619 /* Parse a list of predefined predicate identifiers.
4620 preds = '(' 'define_predicates' <ident>... ')' */
4623 parser::parse_predicates (source_location
)
4627 const cpp_token
*token
= peek ();
4628 if (token
->type
!= CPP_NAME
)
4631 add_predicate (get_ident ());
4636 /* Parse outer control structures.
4637 pattern = <preds>|<for>|<if>|<simplify>|<match> */
4640 parser::parse_pattern ()
4642 /* All clauses start with '('. */
4643 eat_token (CPP_OPEN_PAREN
);
4644 const cpp_token
*token
= peek ();
4645 const char *id
= get_ident ();
4646 if (strcmp (id
, "simplify") == 0)
4648 parse_simplify (simplify::SIMPLIFY
, simplifiers
, NULL
, NULL
);
4651 else if (strcmp (id
, "match") == 0)
4653 bool with_args
= false;
4654 source_location e_loc
= peek ()->src_loc
;
4655 if (peek ()->type
== CPP_OPEN_PAREN
)
4657 eat_token (CPP_OPEN_PAREN
);
4660 const char *name
= get_ident ();
4661 id_base
*id
= get_operator (name
);
4665 p
= add_predicate (name
);
4666 user_predicates
.safe_push (p
);
4668 else if ((p
= dyn_cast
<predicate_id
*> (id
)))
4671 fatal_at (token
, "cannot add a match to a non-predicate ID");
4672 /* Parse (match <id> <arg>... (match-expr)) here. */
4676 capture_ids
= new cid_map_t
;
4677 e
= new expr (p
, e_loc
);
4678 while (peek ()->type
== CPP_ATSIGN
)
4679 e
->append_op (parse_capture (NULL
, false));
4680 eat_token (CPP_CLOSE_PAREN
);
4683 && ((e
&& e
->ops
.length () != (unsigned)p
->nargs
)
4684 || (!e
&& p
->nargs
!= 0)))
4685 fatal_at (token
, "non-matching number of match operands");
4686 p
->nargs
= e
? e
->ops
.length () : 0;
4687 parse_simplify (simplify::MATCH
, p
->matchers
, p
, e
);
4690 else if (strcmp (id
, "for") == 0)
4691 parse_for (token
->src_loc
);
4692 else if (strcmp (id
, "if") == 0)
4693 parse_if (token
->src_loc
);
4694 else if (strcmp (id
, "define_predicates") == 0)
4696 if (active_ifs
.length () > 0
4697 || active_fors
.length () > 0)
4698 fatal_at (token
, "define_predicates inside if or for is not supported");
4699 parse_predicates (token
->src_loc
);
4701 else if (strcmp (id
, "define_operator_list") == 0)
4703 if (active_ifs
.length () > 0
4704 || active_fors
.length () > 0)
4705 fatal_at (token
, "operator-list inside if or for is not supported");
4706 parse_operator_list (token
->src_loc
);
4709 fatal_at (token
, "expected %s'simplify', 'match', 'for' or 'if'",
4710 active_ifs
.length () == 0 && active_fors
.length () == 0
4711 ? "'define_predicates', " : "");
4713 eat_token (CPP_CLOSE_PAREN
);
4716 /* Main entry of the parser. Repeatedly parse outer control structures. */
4718 parser::parser (cpp_reader
*r_
)
4722 active_fors
= vNULL
;
4723 simplifiers
= vNULL
;
4724 oper_lists_set
= NULL
;
4727 user_predicates
= vNULL
;
4728 parsing_match_operand
= false;
4730 const cpp_token
*token
= next ();
4731 while (token
->type
!= CPP_EOF
)
4733 _cpp_backup_tokens (r
, 1);
4740 /* Helper for the linemap code. */
4743 round_alloc_size (size_t s
)
4749 /* The genmatch generator progam. It reads from a pattern description
4750 and outputs GIMPLE or GENERIC IL matching and simplification routines. */
4753 main (int argc
, char **argv
)
4757 progname
= "genmatch";
4763 char *input
= argv
[argc
-1];
4764 for (int i
= 1; i
< argc
- 1; ++i
)
4766 if (strcmp (argv
[i
], "--gimple") == 0)
4768 else if (strcmp (argv
[i
], "--generic") == 0)
4770 else if (strcmp (argv
[i
], "-v") == 0)
4772 else if (strcmp (argv
[i
], "-vv") == 0)
4776 fprintf (stderr
, "Usage: genmatch "
4777 "[--gimple] [--generic] [-v[v]] input\n");
4782 line_table
= XCNEW (struct line_maps
);
4783 linemap_init (line_table
, 0);
4784 line_table
->reallocator
= xrealloc
;
4785 line_table
->round_alloc_size
= round_alloc_size
;
4787 r
= cpp_create_reader (CLK_GNUC99
, NULL
, line_table
);
4788 cpp_callbacks
*cb
= cpp_get_callbacks (r
);
4789 cb
->error
= error_cb
;
4791 /* Add the build directory to the #include "" search path. */
4792 cpp_dir
*dir
= XCNEW (cpp_dir
);
4793 dir
->name
= getpwd ();
4795 dir
->name
= ASTRDUP (".");
4796 cpp_set_include_chains (r
, dir
, NULL
, false);
4798 if (!cpp_read_main_file (r
, input
))
4800 cpp_define (r
, gimple
? "GIMPLE=1": "GENERIC=1");
4801 cpp_define (r
, gimple
? "GENERIC=0": "GIMPLE=0");
4803 null_id
= new id_base (id_base::NULL_ID
, "null");
4805 /* Pre-seed operators. */
4806 operators
= new hash_table
<id_base
> (1024);
4807 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \
4808 add_operator (SYM, # SYM, # TYPE, NARGS);
4809 #define END_OF_BASE_TREE_CODES
4811 add_operator (CONVERT0
, "convert0", "tcc_unary", 1);
4812 add_operator (CONVERT1
, "convert1", "tcc_unary", 1);
4813 add_operator (CONVERT2
, "convert2", "tcc_unary", 1);
4814 add_operator (VIEW_CONVERT0
, "view_convert0", "tcc_unary", 1);
4815 add_operator (VIEW_CONVERT1
, "view_convert1", "tcc_unary", 1);
4816 add_operator (VIEW_CONVERT2
, "view_convert2", "tcc_unary", 1);
4817 #undef END_OF_BASE_TREE_CODES
4820 /* Pre-seed builtin functions.
4821 ??? Cannot use N (name) as that is targetm.emultls.get_address
4822 for BUILT_IN_EMUTLS_GET_ADDRESS ... */
4823 #define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM, COND) \
4824 add_function (ENUM, "CFN_" # ENUM);
4825 #include "builtins.def"
4827 #define DEF_INTERNAL_FN(CODE, NAME, FNSPEC) \
4828 add_function (IFN_##CODE, "CFN_" #CODE);
4829 #include "internal-fn.def"
4835 write_header (stdout
, "gimple-match-head.c");
4837 write_header (stdout
, "generic-match-head.c");
4839 /* Go over all predicates defined with patterns and perform
4840 lowering and code generation. */
4841 for (unsigned i
= 0; i
< p
.user_predicates
.length (); ++i
)
4843 predicate_id
*pred
= p
.user_predicates
[i
];
4844 lower (pred
->matchers
, gimple
);
4847 for (unsigned i
= 0; i
< pred
->matchers
.length (); ++i
)
4848 print_matches (pred
->matchers
[i
]);
4851 for (unsigned i
= 0; i
< pred
->matchers
.length (); ++i
)
4852 dt
.insert (pred
->matchers
[i
], i
);
4857 write_predicate (stdout
, pred
, dt
, gimple
);
4860 /* Lower the main simplifiers and generate code for them. */
4861 lower (p
.simplifiers
, gimple
);
4864 for (unsigned i
= 0; i
< p
.simplifiers
.length (); ++i
)
4865 print_matches (p
.simplifiers
[i
]);
4868 for (unsigned i
= 0; i
< p
.simplifiers
.length (); ++i
)
4869 dt
.insert (p
.simplifiers
[i
], i
);
4874 dt
.gen (stdout
, gimple
);
4877 cpp_finish (r
, NULL
);