Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

446 lines
17KB

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1988-2020 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation; with the
  7. Invariant Sections being "Funding Free Software", the Front-Cover
  8. Texts being (a) (see below), and with the Back-Cover Texts being (b)
  9. (see below). A copy of the license is included in the section entitled
  10. "GNU Free Documentation License".
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  20. <title>The Language (GNU Compiler Collection (GCC) Internals)</title>
  21. <meta name="description" content="The Language (GNU Compiler Collection (GCC) Internals)">
  22. <meta name="keywords" content="The Language (GNU Compiler Collection (GCC) Internals)">
  23. <meta name="resource-type" content="document">
  24. <meta name="distribution" content="global">
  25. <meta name="Generator" content="makeinfo">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="Match-and-Simplify.html#Match-and-Simplify" rel="up" title="Match and Simplify">
  30. <link href="Static-Analyzer.html#Static-Analyzer" rel="next" title="Static Analyzer">
  31. <link href="GIMPLE-API.html#GIMPLE-API" rel="prev" title="GIMPLE API">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.indentedblock {margin-right: 0em}
  36. blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
  37. blockquote.smallquotation {font-size: smaller}
  38. div.display {margin-left: 3.2em}
  39. div.example {margin-left: 3.2em}
  40. div.lisp {margin-left: 3.2em}
  41. div.smalldisplay {margin-left: 3.2em}
  42. div.smallexample {margin-left: 3.2em}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style: oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nolinebreak {white-space: nowrap}
  54. span.roman {font-family: initial; font-weight: normal}
  55. span.sansserif {font-family: sans-serif; font-weight: normal}
  56. ul.no-bullet {list-style: none}
  57. -->
  58. </style>
  59. </head>
  60. <body lang="en">
  61. <a name="The-Language"></a>
  62. <div class="header">
  63. <p>
  64. Previous: <a href="GIMPLE-API.html#GIMPLE-API" accesskey="p" rel="prev">GIMPLE API</a>, Up: <a href="Match-and-Simplify.html#Match-and-Simplify" accesskey="u" rel="up">Match and Simplify</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  65. </div>
  66. <hr>
  67. <a name="The-Language-1"></a>
  68. <h3 class="section">26.2 The Language</h3>
  69. <a name="index-The-Language"></a>
  70. <p>The language to write expression simplifications in resembles other
  71. domain-specific languages GCC uses. Thus it is lispy. Lets start
  72. with an example from the match.pd file:
  73. </p>
  74. <div class="smallexample">
  75. <pre class="smallexample">(simplify
  76. (bit_and @0 integer_all_onesp)
  77. @0)
  78. </pre></div>
  79. <p>This example contains all required parts of an expression simplification.
  80. A simplification is wrapped inside a <code>(simplify ...)</code> expression.
  81. That contains at least two operands - an expression that is matched
  82. with the GIMPLE or GENERIC IL and a replacement expression that is
  83. returned if the match was successful.
  84. </p>
  85. <p>Expressions have an operator ID, <code>bit_and</code> in this case. Expressions can
  86. be lower-case tree codes with <code>_expr</code> stripped off or builtin
  87. function code names in all-caps, like <code>BUILT_IN_SQRT</code>.
  88. </p>
  89. <p><code>@n</code> denotes a so-called capture. It captures the operand and lets
  90. you refer to it in other places of the match-and-simplify. In the
  91. above example it is refered to in the replacement expression. Captures
  92. are <code>@</code> followed by a number or an identifier.
  93. </p>
  94. <div class="smallexample">
  95. <pre class="smallexample">(simplify
  96. (bit_xor @0 @0)
  97. { build_zero_cst (type); })
  98. </pre></div>
  99. <p>In this example <code>@0</code> is mentioned twice which constrains the matched
  100. expression to have two equal operands. Usually matches are constraint
  101. to equal types. If operands may be constants and conversions are involved
  102. matching by value might be preferred in which case use <code>@@0</code> to
  103. denote a by value match and the specific operand you want to refer to
  104. in the result part. This example also introduces
  105. operands written in C code. These can be used in the expression
  106. replacements and are supposed to evaluate to a tree node which has to
  107. be a valid GIMPLE operand (so you cannot generate expressions in C code).
  108. </p>
  109. <div class="smallexample">
  110. <pre class="smallexample">(simplify
  111. (trunc_mod integer_zerop@0 @1)
  112. (if (!integer_zerop (@1))
  113. @0))
  114. </pre></div>
  115. <p>Here <code>@0</code> captures the first operand of the trunc_mod expression
  116. which is also predicated with <code>integer_zerop</code>. Expression operands
  117. may be either expressions, predicates or captures. Captures
  118. can be unconstrained or capture expresions or predicates.
  119. </p>
  120. <p>This example introduces an optional operand of simplify,
  121. the if-expression. This condition is evaluated after the
  122. expression matched in the IL and is required to evaluate to true
  123. to enable the replacement expression in the second operand
  124. position. The expression operand of the <code>if</code> is a standard C
  125. expression which may contain references to captures. The <code>if</code>
  126. has an optional third operand which may contain the replacement
  127. expression that is enabled when the condition evaluates to false.
  128. </p>
  129. <p>A <code>if</code> expression can be used to specify a common condition
  130. for multiple simplify patterns, avoiding the need
  131. to repeat that multiple times:
  132. </p>
  133. <div class="smallexample">
  134. <pre class="smallexample">(if (!TYPE_SATURATING (type)
  135. &amp;&amp; !FLOAT_TYPE_P (type) &amp;&amp; !FIXED_POINT_TYPE_P (type))
  136. (simplify
  137. (minus (plus @0 @1) @0)
  138. @1)
  139. (simplify
  140. (minus (minus @0 @1) @0)
  141. (negate @1)))
  142. </pre></div>
  143. <p>Note that <code>if</code>s in outer position do not have the optional
  144. else clause but instead have multiple then clauses.
  145. </p>
  146. <p>Ifs can be nested.
  147. </p>
  148. <p>There exists a <code>switch</code> expression which can be used to
  149. chain conditions avoiding nesting <code>if</code>s too much:
  150. </p>
  151. <div class="smallexample">
  152. <pre class="smallexample">(simplify
  153. (simple_comparison @0 REAL_CST@1)
  154. (switch
  155. /* a CMP (-0) -&gt; a CMP 0 */
  156. (if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (@1)))
  157. (cmp @0 { build_real (TREE_TYPE (@1), dconst0); }))
  158. /* x != NaN is always true, other ops are always false. */
  159. (if (REAL_VALUE_ISNAN (TREE_REAL_CST (@1))
  160. &amp;&amp; ! HONOR_SNANS (@1))
  161. { constant_boolean_node (cmp == NE_EXPR, type); })))
  162. </pre></div>
  163. <p>Is equal to
  164. </p>
  165. <div class="smallexample">
  166. <pre class="smallexample">(simplify
  167. (simple_comparison @0 REAL_CST@1)
  168. (switch
  169. /* a CMP (-0) -&gt; a CMP 0 */
  170. (if (REAL_VALUE_MINUS_ZERO (TREE_REAL_CST (@1)))
  171. (cmp @0 { build_real (TREE_TYPE (@1), dconst0); })
  172. /* x != NaN is always true, other ops are always false. */
  173. (if (REAL_VALUE_ISNAN (TREE_REAL_CST (@1))
  174. &amp;&amp; ! HONOR_SNANS (@1))
  175. { constant_boolean_node (cmp == NE_EXPR, type); }))))
  176. </pre></div>
  177. <p>which has the second <code>if</code> in the else operand of the first.
  178. The <code>switch</code> expression takes <code>if</code> expressions as
  179. operands (which may not have else clauses) and as a last operand
  180. a replacement expression which should be enabled by default if
  181. no other condition evaluated to true.
  182. </p>
  183. <p>Captures can also be used for capturing results of sub-expressions.
  184. </p>
  185. <div class="smallexample">
  186. <pre class="smallexample">#if GIMPLE
  187. (simplify
  188. (pointer_plus (addr@2 @0) INTEGER_CST_P@1)
  189. (if (is_gimple_min_invariant (@2)))
  190. {
  191. poly_int64 off;
  192. tree base = get_addr_base_and_unit_offset (@0, &amp;off);
  193. off += tree_to_uhwi (@1);
  194. /* Now with that we should be able to simply write
  195. (addr (mem_ref (addr @base) (plus @off @1))) */
  196. build1 (ADDR_EXPR, type,
  197. build2 (MEM_REF, TREE_TYPE (TREE_TYPE (@2)),
  198. build_fold_addr_expr (base),
  199. build_int_cst (ptr_type_node, off)));
  200. })
  201. #endif
  202. </pre></div>
  203. <p>In the above example, <code>@2</code> captures the result of the expression
  204. <code>(addr @0)</code>. For outermost expression only its type can be captured,
  205. and the keyword <code>type</code> is reserved for this purpose. The above
  206. example also gives a way to conditionalize patterns to only apply
  207. to <code>GIMPLE</code> or <code>GENERIC</code> by means of using the pre-defined
  208. preprocessor macros <code>GIMPLE</code> and <code>GENERIC</code> and using
  209. preprocessor directives.
  210. </p>
  211. <div class="smallexample">
  212. <pre class="smallexample">(simplify
  213. (bit_and:c integral_op_p@0 (bit_ior:c (bit_not @0) @1))
  214. (bit_and @1 @0))
  215. </pre></div>
  216. <p>Here we introduce flags on match expressions. The flag used
  217. above, <code>c</code>, denotes that the expression should
  218. be also matched commutated. Thus the above match expression
  219. is really the following four match expressions:
  220. </p>
  221. <div class="smallexample">
  222. <pre class="smallexample"> (bit_and integral_op_p@0 (bit_ior (bit_not @0) @1))
  223. (bit_and (bit_ior (bit_not @0) @1) integral_op_p@0)
  224. (bit_and integral_op_p@0 (bit_ior @1 (bit_not @0)))
  225. (bit_and (bit_ior @1 (bit_not @0)) integral_op_p@0)
  226. </pre></div>
  227. <p>Usual canonicalizations you know from GENERIC expressions are
  228. applied before matching, so for example constant operands always
  229. come second in commutative expressions.
  230. </p>
  231. <p>The second supported flag is <code>s</code> which tells the code
  232. generator to fail the pattern if the expression marked with
  233. <code>s</code> does have more than one use and the simplification
  234. results in an expression with more than one operator.
  235. For example in
  236. </p>
  237. <div class="smallexample">
  238. <pre class="smallexample">(simplify
  239. (pointer_plus (pointer_plus:s @0 @1) @3)
  240. (pointer_plus @0 (plus @1 @3)))
  241. </pre></div>
  242. <p>this avoids the association if <code>(pointer_plus @0 @1)</code> is
  243. used outside of the matched expression and thus it would stay
  244. live and not trivially removed by dead code elimination.
  245. Now consider <code>((x + 3) + -3)</code> with the temporary
  246. holding <code>(x + 3)</code> used elsewhere. This simplifies down
  247. to <code>x</code> which is desirable and thus flagging with <code>s</code>
  248. does not prevent the transform. Now consider <code>((x + 3) + 1)</code>
  249. which simplifies to <code>(x + 4)</code>. Despite being flagged with
  250. <code>s</code> the simplification will be performed. The
  251. simplification of <code>((x + a) + 1)</code> to <code>(x + (a + 1))</code> will
  252. not performed in this case though.
  253. </p>
  254. <p>More features exist to avoid too much repetition.
  255. </p>
  256. <div class="smallexample">
  257. <pre class="smallexample">(for op (plus pointer_plus minus bit_ior bit_xor)
  258. (simplify
  259. (op @0 integer_zerop)
  260. @0))
  261. </pre></div>
  262. <p>A <code>for</code> expression can be used to repeat a pattern for each
  263. operator specified, substituting <code>op</code>. <code>for</code> can be
  264. nested and a <code>for</code> can have multiple operators to iterate.
  265. </p>
  266. <div class="smallexample">
  267. <pre class="smallexample">(for opa (plus minus)
  268. opb (minus plus)
  269. (for opc (plus minus)
  270. (simplify...
  271. </pre></div>
  272. <p>In this example the pattern will be repeated four times with
  273. <code>opa, opb, opc</code> being <code>plus, minus, plus</code>;
  274. <code>plus, minus, minus</code>; <code>minus, plus, plus</code>;
  275. <code>minus, plus, minus</code>.
  276. </p>
  277. <p>To avoid repeating operator lists in <code>for</code> you can name
  278. them via
  279. </p>
  280. <div class="smallexample">
  281. <pre class="smallexample">(define_operator_list pmm plus minus mult)
  282. </pre></div>
  283. <p>and use them in <code>for</code> operator lists where they get expanded.
  284. </p>
  285. <div class="smallexample">
  286. <pre class="smallexample">(for opa (pmm trunc_div)
  287. (simplify...
  288. </pre></div>
  289. <p>So this example iterates over <code>plus</code>, <code>minus</code>, <code>mult</code>
  290. and <code>trunc_div</code>.
  291. </p>
  292. <p>Using operator lists can also remove the need to explicitely write
  293. a <code>for</code>. All operator list uses that appear in a <code>simplify</code>
  294. or <code>match</code> pattern in operator positions will implicitely
  295. be added to a new <code>for</code>. For example
  296. </p>
  297. <div class="smallexample">
  298. <pre class="smallexample">(define_operator_list SQRT BUILT_IN_SQRTF BUILT_IN_SQRT BUILT_IN_SQRTL)
  299. (define_operator_list POW BUILT_IN_POWF BUILT_IN_POW BUILT_IN_POWL)
  300. (simplify
  301. (SQRT (POW @0 @1))
  302. (POW (abs @0) (mult @1 { built_real (TREE_TYPE (@1), dconsthalf); })))
  303. </pre></div>
  304. <p>is the same as
  305. </p>
  306. <div class="smallexample">
  307. <pre class="smallexample">(for SQRT (BUILT_IN_SQRTF BUILT_IN_SQRT BUILT_IN_SQRTL)
  308. POW (BUILT_IN_POWF BUILT_IN_POW BUILT_IN_POWL)
  309. (simplify
  310. (SQRT (POW @0 @1))
  311. (POW (abs @0) (mult @1 { built_real (TREE_TYPE (@1), dconsthalf); }))))
  312. </pre></div>
  313. <p><code>for</code>s and operator lists can include the special identifier
  314. <code>null</code> that matches nothing and can never be generated. This can
  315. be used to pad an operator list so that it has a standard form,
  316. even if there isn&rsquo;t a suitable operator for every form.
  317. </p>
  318. <p>Another building block are <code>with</code> expressions in the
  319. result expression which nest the generated code in a new C block
  320. followed by its argument:
  321. </p>
  322. <div class="smallexample">
  323. <pre class="smallexample">(simplify
  324. (convert (mult @0 @1))
  325. (with { tree utype = unsigned_type_for (type); }
  326. (convert (mult (convert:utype @0) (convert:utype @1)))))
  327. </pre></div>
  328. <p>This allows code nested in the <code>with</code> to refer to the declared
  329. variables. In the above case we use the feature to specify the
  330. type of a generated expression with the <code>:type</code> syntax where
  331. <code>type</code> needs to be an identifier that refers to the desired type.
  332. Usually the types of the generated result expressions are
  333. determined from the context, but sometimes like in the above case
  334. it is required that you specify them explicitely.
  335. </p>
  336. <p>As intermediate conversions are often optional there is a way to
  337. avoid the need to repeat patterns both with and without such
  338. conversions. Namely you can mark a conversion as being optional
  339. with a <code>?</code>:
  340. </p>
  341. <div class="smallexample">
  342. <pre class="smallexample">(simplify
  343. (eq (convert@0 @1) (convert? @2))
  344. (eq @1 (convert @2)))
  345. </pre></div>
  346. <p>which will match both <code>(eq (convert @1) (convert @2))</code> and
  347. <code>(eq (convert @1) @2)</code>. The optional converts are supposed
  348. to be all either present or not, thus
  349. <code>(eq (convert? @1) (convert? @2))</code> will result in two
  350. patterns only. If you want to match all four combinations you
  351. have access to two additional conditional converts as in
  352. <code>(eq (convert1? @1) (convert2? @2))</code>.
  353. </p>
  354. <p>The support for <code>?</code> marking extends to all unary operations
  355. including predicates you declare yourself with <code>match</code>.
  356. </p>
  357. <p>Predicates available from the GCC middle-end need to be made
  358. available explicitely via <code>define_predicates</code>:
  359. </p>
  360. <div class="smallexample">
  361. <pre class="smallexample">(define_predicates
  362. integer_onep integer_zerop integer_all_onesp)
  363. </pre></div>
  364. <p>You can also define predicates using the pattern matching language
  365. and the <code>match</code> form:
  366. </p>
  367. <div class="smallexample">
  368. <pre class="smallexample">(match negate_expr_p
  369. INTEGER_CST
  370. (if (TYPE_OVERFLOW_WRAPS (type)
  371. || may_negate_without_overflow_p (t))))
  372. (match negate_expr_p
  373. (negate @0))
  374. </pre></div>
  375. <p>This shows that for <code>match</code> expressions there is <code>t</code>
  376. available which captures the outermost expression (something
  377. not possible in the <code>simplify</code> context). As you can see
  378. <code>match</code> has an identifier as first operand which is how
  379. you refer to the predicate in patterns. Multiple <code>match</code>
  380. for the same identifier add additional cases where the predicate
  381. matches.
  382. </p>
  383. <p>Predicates can also match an expression in which case you need
  384. to provide a template specifying the identifier and where to
  385. get its operands from:
  386. </p>
  387. <div class="smallexample">
  388. <pre class="smallexample">(match (logical_inverted_value @0)
  389. (eq @0 integer_zerop))
  390. (match (logical_inverted_value @0)
  391. (bit_not truth_valued_p@0))
  392. </pre></div>
  393. <p>You can use the above predicate like
  394. </p>
  395. <div class="smallexample">
  396. <pre class="smallexample">(simplify
  397. (bit_and @0 (logical_inverted_value @0))
  398. { build_zero_cst (type); })
  399. </pre></div>
  400. <p>Which will match a bitwise and of an operand with its logical
  401. inverted value.
  402. </p>
  403. <hr>
  404. <div class="header">
  405. <p>
  406. Previous: <a href="GIMPLE-API.html#GIMPLE-API" accesskey="p" rel="prev">GIMPLE API</a>, Up: <a href="Match-and-Simplify.html#Match-and-Simplify" accesskey="u" rel="up">Match and Simplify</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  407. </div>
  408. </body>
  409. </html>