You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Loop-manipulation.html 6.4KB

3 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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>Loop manipulation (GNU Compiler Collection (GCC) Internals)</title>
  21. <meta name="description" content="Loop manipulation (GNU Compiler Collection (GCC) Internals)">
  22. <meta name="keywords" content="Loop manipulation (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="Loop-Analysis-and-Representation.html#Loop-Analysis-and-Representation" rel="up" title="Loop Analysis and Representation">
  30. <link href="LCSSA.html#LCSSA" rel="next" title="LCSSA">
  31. <link href="Loop-querying.html#Loop-querying" rel="prev" title="Loop querying">
  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="Loop-manipulation"></a>
  62. <div class="header">
  63. <p>
  64. Next: <a href="LCSSA.html#LCSSA" accesskey="n" rel="next">LCSSA</a>, Previous: <a href="Loop-querying.html#Loop-querying" accesskey="p" rel="prev">Loop querying</a>, Up: <a href="Loop-Analysis-and-Representation.html#Loop-Analysis-and-Representation" accesskey="u" rel="up">Loop Analysis and Representation</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="Loop-manipulation-1"></a>
  68. <h3 class="section">16.3 Loop manipulation</h3>
  69. <a name="index-Loop-manipulation"></a>
  70. <p>The loops tree can be manipulated using the following functions:
  71. </p>
  72. <ul>
  73. <li> <code>flow_loop_tree_node_add</code>: Adds a node to the tree.
  74. </li><li> <code>flow_loop_tree_node_remove</code>: Removes a node from the tree.
  75. </li><li> <code>add_bb_to_loop</code>: Adds a basic block to a loop.
  76. </li><li> <code>remove_bb_from_loops</code>: Removes a basic block from loops.
  77. </li></ul>
  78. <p>Most low-level CFG functions update loops automatically. The following
  79. functions handle some more complicated cases of CFG manipulations:
  80. </p>
  81. <ul>
  82. <li> <code>remove_path</code>: Removes an edge and all blocks it dominates.
  83. </li><li> <code>split_loop_exit_edge</code>: Splits exit edge of the loop,
  84. ensuring that PHI node arguments remain in the loop (this ensures that
  85. loop-closed SSA form is preserved). Only useful on GIMPLE.
  86. </li></ul>
  87. <p>Finally, there are some higher-level loop transformations implemented.
  88. While some of them are written so that they should work on non-innermost
  89. loops, they are mostly untested in that case, and at the moment, they
  90. are only reliable for the innermost loops:
  91. </p>
  92. <ul>
  93. <li> <code>create_iv</code>: Creates a new induction variable. Only works on
  94. GIMPLE. <code>standard_iv_increment_position</code> can be used to find a
  95. suitable place for the iv increment.
  96. </li><li> <code>duplicate_loop_to_header_edge</code>,
  97. <code>tree_duplicate_loop_to_header_edge</code>: These functions (on RTL and
  98. on GIMPLE) duplicate the body of the loop prescribed number of times on
  99. one of the edges entering loop header, thus performing either loop
  100. unrolling or loop peeling. <code>can_duplicate_loop_p</code>
  101. (<code>can_unroll_loop_p</code> on GIMPLE) must be true for the duplicated
  102. loop.
  103. </li><li> <code>loop_version</code>: This function creates a copy of a loop, and
  104. a branch before them that selects one of them depending on the
  105. prescribed condition. This is useful for optimizations that need to
  106. verify some assumptions in runtime (one of the copies of the loop is
  107. usually left unchanged, while the other one is transformed in some way).
  108. </li><li> <code>tree_unroll_loop</code>: Unrolls the loop, including peeling the
  109. extra iterations to make the number of iterations divisible by unroll
  110. factor, updating the exit condition, and removing the exits that now
  111. cannot be taken. Works only on GIMPLE.
  112. </li></ul>
  113. <hr>
  114. <div class="header">
  115. <p>
  116. Next: <a href="LCSSA.html#LCSSA" accesskey="n" rel="next">LCSSA</a>, Previous: <a href="Loop-querying.html#Loop-querying" accesskey="p" rel="prev">Loop querying</a>, Up: <a href="Loop-Analysis-and-Representation.html#Loop-Analysis-and-Representation" accesskey="u" rel="up">Loop Analysis and Representation</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>
  117. </div>
  118. </body>
  119. </html>