xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/doc/match-and-simplify.texi (revision 4d342c046e3288fb5a1edcd33cfec48c41c80664)
1@c Copyright (C) 2014-2018 Free Software Foundation, Inc.
2@c Free Software Foundation, Inc.
3@c This is part of the GCC manual.
4@c For copying conditions, see the file gcc.texi.
5
6@node Match and Simplify
7@chapter Match and Simplify
8@cindex Match and Simplify
9
10The GIMPLE and GENERIC pattern matching project match-and-simplify
11tries to address several issues.
12
13@enumerate
14@item unify expression simplifications currently spread and duplicated
15    over separate files like fold-const.c, gimple-fold.c and builtins.c
16@item allow for a cheap way to implement building and simplifying
17    non-trivial GIMPLE expressions, avoiding the need to go through
18    building and simplifying GENERIC via fold_buildN and then
19    gimplifying via force_gimple_operand
20@end enumerate
21
22To address these the project introduces a simple domain specific language
23to write expression simplifications from which code targeting GIMPLE
24and GENERIC is auto-generated.  The GENERIC variant follows the
25fold_buildN API while for the GIMPLE variant and to address 2) new
26APIs are introduced.
27
28@menu
29* GIMPLE API::
30* The Language::
31@end menu
32
33@node GIMPLE API
34@section GIMPLE API
35@cindex GIMPLE API
36
37@deftypefn {GIMPLE function} tree gimple_simplify (enum tree_code, tree, tree, gimple_seq *, tree (*)(tree))
38@deftypefnx {GIMPLE function} tree gimple_simplify (enum tree_code, tree, tree, tree, gimple_seq *, tree (*)(tree))
39@deftypefnx {GIMPLE function} tree gimple_simplify (enum tree_code, tree, tree, tree, tree, gimple_seq *, tree (*)(tree))
40@deftypefnx {GIMPLE function} tree gimple_simplify (enum built_in_function, tree, tree, gimple_seq *, tree (*)(tree))
41@deftypefnx {GIMPLE function} tree gimple_simplify (enum built_in_function, tree, tree, tree, gimple_seq *, tree (*)(tree))
42@deftypefnx {GIMPLE function} tree gimple_simplify (enum built_in_function, tree, tree, tree, tree, gimple_seq *, tree (*)(tree))
43The main GIMPLE API entry to the expression simplifications mimicing
44that of the GENERIC fold_@{unary,binary,ternary@} functions.
45@end deftypefn
46
47thus providing n-ary overloads for operation or function.  The
48additional arguments are a gimple_seq where built statements are
49inserted on (if @code{NULL} then simplifications requiring new statements
50are not performed) and a valueization hook that can be used to
51tie simplifications to a SSA lattice.
52
53In addition to those APIs @code{fold_stmt} is overloaded with
54a valueization hook:
55
56@deftypefn bool fold_stmt (gimple_stmt_iterator *, tree (*)(tree));
57@end deftypefn
58
59
60Ontop of these a @code{fold_buildN}-like API for GIMPLE is introduced:
61
62@deftypefn {GIMPLE function} tree gimple_build (gimple_seq *, location_t, enum tree_code, tree, tree, tree (*valueize) (tree) = NULL);
63@deftypefnx {GIMPLE function} tree gimple_build (gimple_seq *, location_t, enum tree_code, tree, tree, tree, tree (*valueize) (tree) = NULL);
64@deftypefnx {GIMPLE function} tree gimple_build (gimple_seq *, location_t, enum tree_code, tree, tree, tree, tree, tree (*valueize) (tree) = NULL);
65@deftypefnx {GIMPLE function} tree gimple_build (gimple_seq *, location_t, enum built_in_function, tree, tree, tree (*valueize) (tree) = NULL);
66@deftypefnx {GIMPLE function} tree gimple_build (gimple_seq *, location_t, enum built_in_function, tree, tree, tree, tree (*valueize) (tree) = NULL);
67@deftypefnx {GIMPLE function} tree gimple_build (gimple_seq *, location_t, enum built_in_function, tree, tree, tree, tree, tree (*valueize) (tree) = NULL);
68@deftypefnx {GIMPLE function} tree gimple_convert (gimple_seq *, location_t, tree, tree);
69@end deftypefn
70
71which is supposed to replace @code{force_gimple_operand (fold_buildN (...), ...)}
72and calls to @code{fold_convert}.  Overloads without the @code{location_t}
73argument exist.  Built statements are inserted on the provided sequence
74and simplification is performed using the optional valueization hook.
75
76
77@node The Language
78@section The Language
79@cindex The Language
80
81The language to write expression simplifications in resembles other
82domain-specific languages GCC uses.  Thus it is lispy.  Lets start
83with an example from the match.pd file:
84
85@smallexample
86(simplify
87  (bit_and @@0 integer_all_onesp)
88  @@0)
89@end smallexample
90
91This example contains all required parts of an expression simplification.
92A simplification is wrapped inside a @code{(simplify ...)} expression.
93That contains at least two operands - an expression that is matched
94with the GIMPLE or GENERIC IL and a replacement expression that is
95returned if the match was successful.
96
97Expressions have an operator ID, @code{bit_and} in this case.  Expressions can
98be lower-case tree codes with @code{_expr} stripped off or builtin
99function code names in all-caps, like @code{BUILT_IN_SQRT}.
100
101@code{@@n} denotes a so-called capture.  It captures the operand and lets
102you refer to it in other places of the match-and-simplify.  In the
103above example it is refered to in the replacement expression.  Captures
104are @code{@@} followed by a number or an identifier.
105
106@smallexample
107(simplify
108  (bit_xor @@0 @@0)
109  @{ build_zero_cst (type); @})
110@end smallexample
111
112In this example @code{@@0} is mentioned twice which constrains the matched
113expression to have two equal operands.  Usually matches are constraint
114to equal types.  If operands may be constants and conversions are involved
115matching by value might be preferred in which case use @code{@@@@0} to
116denote a by value match and the specific operand you want to refer to
117in the result part.  This example also introduces
118operands written in C code.  These can be used in the expression
119replacements and are supposed to evaluate to a tree node which has to
120be a valid GIMPLE operand (so you cannot generate expressions in C code).
121
122@smallexample
123(simplify
124  (trunc_mod integer_zerop@@0 @@1)
125  (if (!integer_zerop (@@1))
126   @@0))
127@end smallexample
128
129Here @code{@@0} captures the first operand of the trunc_mod expression
130which is also predicated with @code{integer_zerop}.  Expression operands
131may be either expressions, predicates or captures.  Captures
132can be unconstrained or capture expresions or predicates.
133
134This example introduces an optional operand of simplify,
135the if-expression.  This condition is evaluated after the
136expression matched in the IL and is required to evaluate to true
137to enable the replacement expression in the second operand
138position.  The expression operand of the @code{if} is a standard C
139expression which may contain references to captures.  The @code{if}
140has an optional third operand which may contain the replacement
141expression that is enabled when the condition evaluates to false.
142
143A @code{if} expression can be used to specify a common condition
144for multiple simplify patterns, avoiding the need
145to repeat that multiple times:
146
147@smallexample
148(if (!TYPE_SATURATING (type)
149     && !FLOAT_TYPE_P (type) && !FIXED_POINT_TYPE_P (type))
150  (simplify
151    (minus (plus @@0 @@1) @@0)
152    @@1)
153  (simplify
154    (minus (minus @@0 @@1) @@0)
155    (negate @@1)))
156@end smallexample
157
158Note that @code{if}s in outer position do not have the optional
159else clause but instead have multiple then clauses.
160
161Ifs can be nested.
162
163There exists a @code{switch} expression which can be used to
164chain conditions avoiding nesting @code{if}s too much:
165
166@smallexample
167(simplify
168 (simple_comparison @@0 REAL_CST@@1)
169 (switch
170  /* a CMP (-0) -> a CMP 0  */
171  (if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (@@1)))
172   (cmp @@0 @{ build_real (TREE_TYPE (@@1), dconst0); @}))
173  /* x != NaN is always true, other ops are always false.  */
174  (if (REAL_VALUE_ISNAN (TREE_REAL_CST (@@1))
175       && ! HONOR_SNANS (@@1))
176   @{ constant_boolean_node (cmp == NE_EXPR, type); @})))
177@end smallexample
178
179Is equal to
180
181@smallexample
182(simplify
183 (simple_comparison @@0 REAL_CST@@1)
184 (switch
185  /* a CMP (-0) -> a CMP 0  */
186  (if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (@@1)))
187   (cmp @@0 @{ build_real (TREE_TYPE (@@1), dconst0); @})
188   /* x != NaN is always true, other ops are always false.  */
189   (if (REAL_VALUE_ISNAN (TREE_REAL_CST (@@1))
190        && ! HONOR_SNANS (@@1))
191    @{ constant_boolean_node (cmp == NE_EXPR, type); @}))))
192@end smallexample
193
194which has the second @code{if} in the else operand of the first.
195The @code{switch} expression takes @code{if} expressions as
196operands (which may not have else clauses) and as a last operand
197a replacement expression which should be enabled by default if
198no other condition evaluated to true.
199
200Captures can also be used for capturing results of sub-expressions.
201
202@smallexample
203#if GIMPLE
204(simplify
205  (pointer_plus (addr@@2 @@0) INTEGER_CST_P@@1)
206  (if (is_gimple_min_invariant (@@2)))
207  @{
208    poly_int64 off;
209    tree base = get_addr_base_and_unit_offset (@@0, &off);
210    off += tree_to_uhwi (@@1);
211    /* Now with that we should be able to simply write
212       (addr (mem_ref (addr @@base) (plus @@off @@1)))  */
213    build1 (ADDR_EXPR, type,
214            build2 (MEM_REF, TREE_TYPE (TREE_TYPE (@@2)),
215                    build_fold_addr_expr (base),
216                    build_int_cst (ptr_type_node, off)));
217  @})
218#endif
219@end smallexample
220
221In the above example, @code{@@2} captures the result of the expression
222@code{(addr @@0)}.  For outermost expression only its type can be captured,
223and the keyword @code{type} is reserved for this purpose.  The above
224example also gives a way to conditionalize patterns to only apply
225to @code{GIMPLE} or @code{GENERIC} by means of using the pre-defined
226preprocessor macros @code{GIMPLE} and @code{GENERIC} and using
227preprocessor directives.
228
229@smallexample
230(simplify
231  (bit_and:c integral_op_p@@0 (bit_ior:c (bit_not @@0) @@1))
232  (bit_and @@1 @@0))
233@end smallexample
234
235Here we introduce flags on match expressions.  The flag used
236above, @code{c}, denotes that the expression should
237be also matched commutated.  Thus the above match expression
238is really the following four match expressions:
239
240@smallexample
241  (bit_and integral_op_p@@0 (bit_ior (bit_not @@0) @@1))
242  (bit_and (bit_ior (bit_not @@0) @@1) integral_op_p@@0)
243  (bit_and integral_op_p@@0 (bit_ior @@1 (bit_not @@0)))
244  (bit_and (bit_ior @@1 (bit_not @@0)) integral_op_p@@0)
245@end smallexample
246
247Usual canonicalizations you know from GENERIC expressions are
248applied before matching, so for example constant operands always
249come second in commutative expressions.
250
251The second supported flag is @code{s} which tells the code
252generator to fail the pattern if the expression marked with
253@code{s} does have more than one use.  For example in
254
255@smallexample
256(simplify
257  (pointer_plus (pointer_plus:s @@0 @@1) @@3)
258  (pointer_plus @@0 (plus @@1 @@3)))
259@end smallexample
260
261this avoids the association if @code{(pointer_plus @@0 @@1)} is
262used outside of the matched expression and thus it would stay
263live and not trivially removed by dead code elimination.
264
265More features exist to avoid too much repetition.
266
267@smallexample
268(for op (plus pointer_plus minus bit_ior bit_xor)
269  (simplify
270    (op @@0 integer_zerop)
271    @@0))
272@end smallexample
273
274A @code{for} expression can be used to repeat a pattern for each
275operator specified, substituting @code{op}.  @code{for} can be
276nested and a @code{for} can have multiple operators to iterate.
277
278@smallexample
279(for opa (plus minus)
280     opb (minus plus)
281  (for opc (plus minus)
282    (simplify...
283@end smallexample
284
285In this example the pattern will be repeated four times with
286@code{opa, opb, opc} being @code{plus, minus, plus},
287@code{plus, minus, minus}, @code{minus, plus, plus},
288@code{minus, plus, minus}.
289
290To avoid repeating operator lists in @code{for} you can name
291them via
292
293@smallexample
294(define_operator_list pmm plus minus mult)
295@end smallexample
296
297and use them in @code{for} operator lists where they get expanded.
298
299@smallexample
300(for opa (pmm trunc_div)
301 (simplify...
302@end smallexample
303
304So this example iterates over @code{plus}, @code{minus}, @code{mult}
305and @code{trunc_div}.
306
307Using operator lists can also remove the need to explicitely write
308a @code{for}.  All operator list uses that appear in a @code{simplify}
309or @code{match} pattern in operator positions will implicitely
310be added to a new @code{for}.  For example
311
312@smallexample
313(define_operator_list SQRT BUILT_IN_SQRTF BUILT_IN_SQRT BUILT_IN_SQRTL)
314(define_operator_list POW BUILT_IN_POWF BUILT_IN_POW BUILT_IN_POWL)
315(simplify
316 (SQRT (POW @@0 @@1))
317 (POW (abs @@0) (mult @@1 @{ built_real (TREE_TYPE (@@1), dconsthalf); @})))
318@end smallexample
319
320is the same as
321
322@smallexample
323(for SQRT (BUILT_IN_SQRTF BUILT_IN_SQRT BUILT_IN_SQRTL)
324     POW (BUILT_IN_POWF BUILT_IN_POW BUILT_IN_POWL)
325 (simplify
326  (SQRT (POW @@0 @@1))
327  (POW (abs @@0) (mult @@1 @{ built_real (TREE_TYPE (@@1), dconsthalf); @}))))
328@end smallexample
329
330@code{for}s and operator lists can include the special identifier
331@code{null} that matches nothing and can never be generated.  This can
332be used to pad an operator list so that it has a standard form,
333even if there isn't a suitable operator for every form.
334
335Another building block are @code{with} expressions in the
336result expression which nest the generated code in a new C block
337followed by its argument:
338
339@smallexample
340(simplify
341 (convert (mult @@0 @@1))
342 (with @{ tree utype = unsigned_type_for (type); @}
343  (convert (mult (convert:utype @@0) (convert:utype @@1)))))
344@end smallexample
345
346This allows code nested in the @code{with} to refer to the declared
347variables.  In the above case we use the feature to specify the
348type of a generated expression with the @code{:type} syntax where
349@code{type} needs to be an identifier that refers to the desired type.
350Usually the types of the generated result expressions are
351determined from the context, but sometimes like in the above case
352it is required that you specify them explicitely.
353
354As intermediate conversions are often optional there is a way to
355avoid the need to repeat patterns both with and without such
356conversions.  Namely you can mark a conversion as being optional
357with a @code{?}:
358
359@smallexample
360(simplify
361 (eq (convert@@0 @@1) (convert@? @@2))
362 (eq @@1 (convert @@2)))
363@end smallexample
364
365which will match both @code{(eq (convert @@1) (convert @@2))} and
366@code{(eq (convert @@1) @@2)}.  The optional converts are supposed
367to be all either present or not, thus
368@code{(eq (convert@? @@1) (convert@? @@2))} will result in two
369patterns only.  If you want to match all four combinations you
370have access to two additional conditional converts as in
371@code{(eq (convert1@? @@1) (convert2@? @@2))}.
372
373Predicates available from the GCC middle-end need to be made
374available explicitely via @code{define_predicates}:
375
376@smallexample
377(define_predicates
378 integer_onep integer_zerop integer_all_onesp)
379@end smallexample
380
381You can also define predicates using the pattern matching language
382and the @code{match} form:
383
384@smallexample
385(match negate_expr_p
386 INTEGER_CST
387 (if (TYPE_OVERFLOW_WRAPS (type)
388      || may_negate_without_overflow_p (t))))
389(match negate_expr_p
390 (negate @@0))
391@end smallexample
392
393This shows that for @code{match} expressions there is @code{t}
394available which captures the outermost expression (something
395not possible in the @code{simplify} context).  As you can see
396@code{match} has an identifier as first operand which is how
397you refer to the predicate in patterns.  Multiple @code{match}
398for the same identifier add additional cases where the predicate
399matches.
400
401Predicates can also match an expression in which case you need
402to provide a template specifying the identifier and where to
403get its operands from:
404
405@smallexample
406(match (logical_inverted_value @@0)
407 (eq @@0 integer_zerop))
408(match (logical_inverted_value @@0)
409 (bit_not truth_valued_p@@0))
410@end smallexample
411
412You can use the above predicate like
413
414@smallexample
415(simplify
416 (bit_and @@0 (logical_inverted_value @@0))
417 @{ build_zero_cst (type); @})
418@end smallexample
419
420Which will match a bitwise and of an operand with its logical
421inverted value.
422
423