|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <!-- Copyright (C) 1988-2020 Free Software Foundation, Inc.
-
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3 or
- any later version published by the Free Software Foundation; with the
- Invariant Sections being "Funding Free Software", the Front-Cover
- Texts being (a) (see below), and with the Back-Cover Texts being (b)
- (see below). A copy of the license is included in the section entitled
- "GNU Free Documentation License".
-
- (a) The FSF's Front-Cover Text is:
-
- A GNU Manual
-
- (b) The FSF's Back-Cover Text is:
-
- You have freedom to copy and modify this GNU Manual, like GNU
- software. Copies published by the Free Software Foundation raise
- funds for GNU development. -->
- <!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>Tree SSA passes (GNU Compiler Collection (GCC) Internals)</title>
-
- <meta name="description" content="Tree SSA passes (GNU Compiler Collection (GCC) Internals)">
- <meta name="keywords" content="Tree SSA passes (GNU Compiler Collection (GCC) Internals)">
- <meta name="resource-type" content="document">
- <meta name="distribution" content="global">
- <meta name="Generator" content="makeinfo">
- <link href="index.html#Top" rel="start" title="Top">
- <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
- <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
- <link href="Passes.html#Passes" rel="up" title="Passes">
- <link href="RTL-passes.html#RTL-passes" rel="next" title="RTL passes">
- <link href="Late-IPA-passes.html#Late-IPA-passes" rel="prev" title="Late IPA passes">
- <style type="text/css">
- <!--
- a.summary-letter {text-decoration: none}
- blockquote.indentedblock {margin-right: 0em}
- blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
- blockquote.smallquotation {font-size: smaller}
- div.display {margin-left: 3.2em}
- div.example {margin-left: 3.2em}
- div.lisp {margin-left: 3.2em}
- div.smalldisplay {margin-left: 3.2em}
- div.smallexample {margin-left: 3.2em}
- div.smalllisp {margin-left: 3.2em}
- kbd {font-style: oblique}
- pre.display {font-family: inherit}
- pre.format {font-family: inherit}
- pre.menu-comment {font-family: serif}
- pre.menu-preformatted {font-family: serif}
- pre.smalldisplay {font-family: inherit; font-size: smaller}
- pre.smallexample {font-size: smaller}
- pre.smallformat {font-family: inherit; font-size: smaller}
- pre.smalllisp {font-size: smaller}
- span.nolinebreak {white-space: nowrap}
- span.roman {font-family: initial; font-weight: normal}
- span.sansserif {font-family: sans-serif; font-weight: normal}
- ul.no-bullet {list-style: none}
- -->
- </style>
-
-
- </head>
-
- <body lang="en">
- <a name="Tree-SSA-passes"></a>
- <div class="header">
- <p>
- Next: <a href="RTL-passes.html#RTL-passes" accesskey="n" rel="next">RTL passes</a>, Previous: <a href="IPA-passes.html#IPA-passes" accesskey="p" rel="prev">IPA passes</a>, Up: <a href="Passes.html#Passes" accesskey="u" rel="up">Passes</a> [<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>
- </div>
- <hr>
- <a name="Tree-SSA-passes-1"></a>
- <h3 class="section">9.5 Tree SSA passes</h3>
-
- <p>The following briefly describes the Tree optimization passes that are
- run after gimplification and what source files they are located in.
- </p>
- <ul>
- <li> Remove useless statements
-
- <p>This pass is an extremely simple sweep across the gimple code in which
- we identify obviously dead code and remove it. Here we do things like
- simplify <code>if</code> statements with constant conditions, remove
- exception handling constructs surrounding code that obviously cannot
- throw, remove lexical bindings that contain no variables, and other
- assorted simplistic cleanups. The idea is to get rid of the obvious
- stuff quickly rather than wait until later when it’s more work to get
- rid of it. This pass is located in <samp>tree-cfg.c</samp> and described by
- <code>pass_remove_useless_stmts</code>.
- </p>
- </li><li> OpenMP lowering
-
- <p>If OpenMP generation (<samp>-fopenmp</samp>) is enabled, this pass lowers
- OpenMP constructs into GIMPLE.
- </p>
- <p>Lowering of OpenMP constructs involves creating replacement
- expressions for local variables that have been mapped using data
- sharing clauses, exposing the control flow of most synchronization
- directives and adding region markers to facilitate the creation of the
- control flow graph. The pass is located in <samp>omp-low.c</samp> and is
- described by <code>pass_lower_omp</code>.
- </p>
- </li><li> OpenMP expansion
-
- <p>If OpenMP generation (<samp>-fopenmp</samp>) is enabled, this pass expands
- parallel regions into their own functions to be invoked by the thread
- library. The pass is located in <samp>omp-low.c</samp> and is described by
- <code>pass_expand_omp</code>.
- </p>
- </li><li> Lower control flow
-
- <p>This pass flattens <code>if</code> statements (<code>COND_EXPR</code>)
- and moves lexical bindings (<code>BIND_EXPR</code>) out of line. After
- this pass, all <code>if</code> statements will have exactly two <code>goto</code>
- statements in its <code>then</code> and <code>else</code> arms. Lexical binding
- information for each statement will be found in <code>TREE_BLOCK</code> rather
- than being inferred from its position under a <code>BIND_EXPR</code>. This
- pass is found in <samp>gimple-low.c</samp> and is described by
- <code>pass_lower_cf</code>.
- </p>
- </li><li> Lower exception handling control flow
-
- <p>This pass decomposes high-level exception handling constructs
- (<code>TRY_FINALLY_EXPR</code> and <code>TRY_CATCH_EXPR</code>) into a form
- that explicitly represents the control flow involved. After this
- pass, <code>lookup_stmt_eh_region</code> will return a non-negative
- number for any statement that may have EH control flow semantics;
- examine <code>tree_can_throw_internal</code> or <code>tree_can_throw_external</code>
- for exact semantics. Exact control flow may be extracted from
- <code>foreach_reachable_handler</code>. The EH region nesting tree is defined
- in <samp>except.h</samp> and built in <samp>except.c</samp>. The lowering pass
- itself is in <samp>tree-eh.c</samp> and is described by <code>pass_lower_eh</code>.
- </p>
- </li><li> Build the control flow graph
-
- <p>This pass decomposes a function into basic blocks and creates all of
- the edges that connect them. It is located in <samp>tree-cfg.c</samp> and
- is described by <code>pass_build_cfg</code>.
- </p>
- </li><li> Find all referenced variables
-
- <p>This pass walks the entire function and collects an array of all
- variables referenced in the function, <code>referenced_vars</code>. The
- index at which a variable is found in the array is used as a UID
- for the variable within this function. This data is needed by the
- SSA rewriting routines. The pass is located in <samp>tree-dfa.c</samp>
- and is described by <code>pass_referenced_vars</code>.
- </p>
- </li><li> Enter static single assignment form
-
- <p>This pass rewrites the function such that it is in SSA form. After
- this pass, all <code>is_gimple_reg</code> variables will be referenced by
- <code>SSA_NAME</code>, and all occurrences of other variables will be
- annotated with <code>VDEFS</code> and <code>VUSES</code>; PHI nodes will have
- been inserted as necessary for each basic block. This pass is
- located in <samp>tree-ssa.c</samp> and is described by <code>pass_build_ssa</code>.
- </p>
- </li><li> Warn for uninitialized variables
-
- <p>This pass scans the function for uses of <code>SSA_NAME</code>s that
- are fed by default definition. For non-parameter variables, such
- uses are uninitialized. The pass is run twice, before and after
- optimization (if turned on). In the first pass we only warn for uses that are
- positively uninitialized; in the second pass we warn for uses that
- are possibly uninitialized. The pass is located in <samp>tree-ssa.c</samp>
- and is defined by <code>pass_early_warn_uninitialized</code> and
- <code>pass_late_warn_uninitialized</code>.
- </p>
- </li><li> Dead code elimination
-
- <p>This pass scans the function for statements without side effects whose
- result is unused. It does not do memory life analysis, so any value
- that is stored in memory is considered used. The pass is run multiple
- times throughout the optimization process. It is located in
- <samp>tree-ssa-dce.c</samp> and is described by <code>pass_dce</code>.
- </p>
- </li><li> Dominator optimizations
-
- <p>This pass performs trivial dominator-based copy and constant propagation,
- expression simplification, and jump threading. It is run multiple times
- throughout the optimization process. It is located in <samp>tree-ssa-dom.c</samp>
- and is described by <code>pass_dominator</code>.
- </p>
- </li><li> Forward propagation of single-use variables
-
- <p>This pass attempts to remove redundant computation by substituting
- variables that are used once into the expression that uses them and
- seeing if the result can be simplified. It is located in
- <samp>tree-ssa-forwprop.c</samp> and is described by <code>pass_forwprop</code>.
- </p>
- </li><li> Copy Renaming
-
- <p>This pass attempts to change the name of compiler temporaries involved in
- copy operations such that SSA->normal can coalesce the copy away. When compiler
- temporaries are copies of user variables, it also renames the compiler
- temporary to the user variable resulting in better use of user symbols. It is
- located in <samp>tree-ssa-copyrename.c</samp> and is described by
- <code>pass_copyrename</code>.
- </p>
- </li><li> PHI node optimizations
-
- <p>This pass recognizes forms of PHI inputs that can be represented as
- conditional expressions and rewrites them into straight line code.
- It is located in <samp>tree-ssa-phiopt.c</samp> and is described by
- <code>pass_phiopt</code>.
- </p>
- </li><li> May-alias optimization
-
- <p>This pass performs a flow sensitive SSA-based points-to analysis.
- The resulting may-alias, must-alias, and escape analysis information
- is used to promote variables from in-memory addressable objects to
- non-aliased variables that can be renamed into SSA form. We also
- update the <code>VDEF</code>/<code>VUSE</code> memory tags for non-renameable
- aggregates so that we get fewer false kills. The pass is located
- in <samp>tree-ssa-alias.c</samp> and is described by <code>pass_may_alias</code>.
- </p>
- <p>Interprocedural points-to information is located in
- <samp>tree-ssa-structalias.c</samp> and described by <code>pass_ipa_pta</code>.
- </p>
- </li><li> Profiling
-
- <p>This pass instruments the function in order to collect runtime block
- and value profiling data. Such data may be fed back into the compiler
- on a subsequent run so as to allow optimization based on expected
- execution frequencies. The pass is located in <samp>tree-profile.c</samp> and
- is described by <code>pass_ipa_tree_profile</code>.
- </p>
- </li><li> Static profile estimation
-
- <p>This pass implements series of heuristics to guess propababilities
- of branches. The resulting predictions are turned into edge profile
- by propagating branches across the control flow graphs.
- The pass is located in <samp>tree-profile.c</samp> and is described by
- <code>pass_profile</code>.
- </p>
- </li><li> Lower complex arithmetic
-
- <p>This pass rewrites complex arithmetic operations into their component
- scalar arithmetic operations. The pass is located in <samp>tree-complex.c</samp>
- and is described by <code>pass_lower_complex</code>.
- </p>
- </li><li> Scalar replacement of aggregates
-
- <p>This pass rewrites suitable non-aliased local aggregate variables into
- a set of scalar variables. The resulting scalar variables are
- rewritten into SSA form, which allows subsequent optimization passes
- to do a significantly better job with them. The pass is located in
- <samp>tree-sra.c</samp> and is described by <code>pass_sra</code>.
- </p>
- </li><li> Dead store elimination
-
- <p>This pass eliminates stores to memory that are subsequently overwritten
- by another store, without any intervening loads. The pass is located
- in <samp>tree-ssa-dse.c</samp> and is described by <code>pass_dse</code>.
- </p>
- </li><li> Tail recursion elimination
-
- <p>This pass transforms tail recursion into a loop. It is located in
- <samp>tree-tailcall.c</samp> and is described by <code>pass_tail_recursion</code>.
- </p>
- </li><li> Forward store motion
-
- <p>This pass sinks stores and assignments down the flowgraph closer to their
- use point. The pass is located in <samp>tree-ssa-sink.c</samp> and is
- described by <code>pass_sink_code</code>.
- </p>
- </li><li> Partial redundancy elimination
-
- <p>This pass eliminates partially redundant computations, as well as
- performing load motion. The pass is located in <samp>tree-ssa-pre.c</samp>
- and is described by <code>pass_pre</code>.
- </p>
- <p>Just before partial redundancy elimination, if
- <samp>-funsafe-math-optimizations</samp> is on, GCC tries to convert
- divisions to multiplications by the reciprocal. The pass is located
- in <samp>tree-ssa-math-opts.c</samp> and is described by
- <code>pass_cse_reciprocal</code>.
- </p>
- </li><li> Full redundancy elimination
-
- <p>This is a simpler form of PRE that only eliminates redundancies that
- occur on all paths. It is located in <samp>tree-ssa-pre.c</samp> and
- described by <code>pass_fre</code>.
- </p>
- </li><li> Loop optimization
-
- <p>The main driver of the pass is placed in <samp>tree-ssa-loop.c</samp>
- and described by <code>pass_loop</code>.
- </p>
- <p>The optimizations performed by this pass are:
- </p>
- <p>Loop invariant motion. This pass moves only invariants that
- would be hard to handle on RTL level (function calls, operations that expand to
- nontrivial sequences of insns). With <samp>-funswitch-loops</samp> it also moves
- operands of conditions that are invariant out of the loop, so that we can use
- just trivial invariantness analysis in loop unswitching. The pass also includes
- store motion. The pass is implemented in <samp>tree-ssa-loop-im.c</samp>.
- </p>
- <p>Canonical induction variable creation. This pass creates a simple counter
- for number of iterations of the loop and replaces the exit condition of the
- loop using it, in case when a complicated analysis is necessary to determine
- the number of iterations. Later optimizations then may determine the number
- easily. The pass is implemented in <samp>tree-ssa-loop-ivcanon.c</samp>.
- </p>
- <p>Induction variable optimizations. This pass performs standard induction
- variable optimizations, including strength reduction, induction variable
- merging and induction variable elimination. The pass is implemented in
- <samp>tree-ssa-loop-ivopts.c</samp>.
- </p>
- <p>Loop unswitching. This pass moves the conditional jumps that are invariant
- out of the loops. To achieve this, a duplicate of the loop is created for
- each possible outcome of conditional jump(s). The pass is implemented in
- <samp>tree-ssa-loop-unswitch.c</samp>.
- </p>
- <p>Loop splitting. If a loop contains a conditional statement that is
- always true for one part of the iteration space and false for the other
- this pass splits the loop into two, one dealing with one side the other
- only with the other, thereby removing one inner-loop conditional. The
- pass is implemented in <samp>tree-ssa-loop-split.c</samp>.
- </p>
- <p>The optimizations also use various utility functions contained in
- <samp>tree-ssa-loop-manip.c</samp>, <samp>cfgloop.c</samp>, <samp>cfgloopanal.c</samp> and
- <samp>cfgloopmanip.c</samp>.
- </p>
- <p>Vectorization. This pass transforms loops to operate on vector types
- instead of scalar types. Data parallelism across loop iterations is exploited
- to group data elements from consecutive iterations into a vector and operate
- on them in parallel. Depending on available target support the loop is
- conceptually unrolled by a factor <code>VF</code> (vectorization factor), which is
- the number of elements operated upon in parallel in each iteration, and the
- <code>VF</code> copies of each scalar operation are fused to form a vector operation.
- Additional loop transformations such as peeling and versioning may take place
- to align the number of iterations, and to align the memory accesses in the
- loop.
- The pass is implemented in <samp>tree-vectorizer.c</samp> (the main driver),
- <samp>tree-vect-loop.c</samp> and <samp>tree-vect-loop-manip.c</samp> (loop specific parts
- and general loop utilities), <samp>tree-vect-slp</samp> (loop-aware SLP
- functionality), <samp>tree-vect-stmts.c</samp> and <samp>tree-vect-data-refs.c</samp>.
- Analysis of data references is in <samp>tree-data-ref.c</samp>.
- </p>
- <p>SLP Vectorization. This pass performs vectorization of straight-line code. The
- pass is implemented in <samp>tree-vectorizer.c</samp> (the main driver),
- <samp>tree-vect-slp.c</samp>, <samp>tree-vect-stmts.c</samp> and
- <samp>tree-vect-data-refs.c</samp>.
- </p>
- <p>Autoparallelization. This pass splits the loop iteration space to run
- into several threads. The pass is implemented in <samp>tree-parloops.c</samp>.
- </p>
- <p>Graphite is a loop transformation framework based on the polyhedral
- model. Graphite stands for Gimple Represented as Polyhedra. The
- internals of this infrastructure are documented in
- <a href="http://gcc.gnu.org/wiki/Graphite">http://gcc.gnu.org/wiki/Graphite</a><!-- /@w -->. The passes working on
- this representation are implemented in the various <samp>graphite-*</samp>
- files.
- </p>
- </li><li> Tree level if-conversion for vectorizer
-
- <p>This pass applies if-conversion to simple loops to help vectorizer.
- We identify if convertible loops, if-convert statements and merge
- basic blocks in one big block. The idea is to present loop in such
- form so that vectorizer can have one to one mapping between statements
- and available vector operations. This pass is located in
- <samp>tree-if-conv.c</samp> and is described by <code>pass_if_conversion</code>.
- </p>
- </li><li> Conditional constant propagation
-
- <p>This pass relaxes a lattice of values in order to identify those
- that must be constant even in the presence of conditional branches.
- The pass is located in <samp>tree-ssa-ccp.c</samp> and is described
- by <code>pass_ccp</code>.
- </p>
- <p>A related pass that works on memory loads and stores, and not just
- register values, is located in <samp>tree-ssa-ccp.c</samp> and described by
- <code>pass_store_ccp</code>.
- </p>
- </li><li> Conditional copy propagation
-
- <p>This is similar to constant propagation but the lattice of values is
- the “copy-of” relation. It eliminates redundant copies from the
- code. The pass is located in <samp>tree-ssa-copy.c</samp> and described by
- <code>pass_copy_prop</code>.
- </p>
- <p>A related pass that works on memory copies, and not just register
- copies, is located in <samp>tree-ssa-copy.c</samp> and described by
- <code>pass_store_copy_prop</code>.
- </p>
- </li><li> Value range propagation
-
- <p>This transformation is similar to constant propagation but
- instead of propagating single constant values, it propagates
- known value ranges. The implementation is based on Patterson’s
- range propagation algorithm (Accurate Static Branch Prediction by
- Value Range Propagation, J. R. C. Patterson, PLDI ’95). In
- contrast to Patterson’s algorithm, this implementation does not
- propagate branch probabilities nor it uses more than a single
- range per SSA name. This means that the current implementation
- cannot be used for branch prediction (though adapting it would
- not be difficult). The pass is located in <samp>tree-vrp.c</samp> and is
- described by <code>pass_vrp</code>.
- </p>
- </li><li> Folding built-in functions
-
- <p>This pass simplifies built-in functions, as applicable, with constant
- arguments or with inferable string lengths. It is located in
- <samp>tree-ssa-ccp.c</samp> and is described by <code>pass_fold_builtins</code>.
- </p>
- </li><li> Split critical edges
-
- <p>This pass identifies critical edges and inserts empty basic blocks
- such that the edge is no longer critical. The pass is located in
- <samp>tree-cfg.c</samp> and is described by <code>pass_split_crit_edges</code>.
- </p>
- </li><li> Control dependence dead code elimination
-
- <p>This pass is a stronger form of dead code elimination that can
- eliminate unnecessary control flow statements. It is located
- in <samp>tree-ssa-dce.c</samp> and is described by <code>pass_cd_dce</code>.
- </p>
- </li><li> Tail call elimination
-
- <p>This pass identifies function calls that may be rewritten into
- jumps. No code transformation is actually applied here, but the
- data and control flow problem is solved. The code transformation
- requires target support, and so is delayed until RTL. In the
- meantime <code>CALL_EXPR_TAILCALL</code> is set indicating the possibility.
- The pass is located in <samp>tree-tailcall.c</samp> and is described by
- <code>pass_tail_calls</code>. The RTL transformation is handled by
- <code>fixup_tail_calls</code> in <samp>calls.c</samp>.
- </p>
- </li><li> Warn for function return without value
-
- <p>For non-void functions, this pass locates return statements that do
- not specify a value and issues a warning. Such a statement may have
- been injected by falling off the end of the function. This pass is
- run last so that we have as much time as possible to prove that the
- statement is not reachable. It is located in <samp>tree-cfg.c</samp> and
- is described by <code>pass_warn_function_return</code>.
- </p>
- </li><li> Leave static single assignment form
-
- <p>This pass rewrites the function such that it is in normal form. At
- the same time, we eliminate as many single-use temporaries as possible,
- so the intermediate language is no longer GIMPLE, but GENERIC. The
- pass is located in <samp>tree-outof-ssa.c</samp> and is described by
- <code>pass_del_ssa</code>.
- </p>
- </li><li> Merge PHI nodes that feed into one another
-
- <p>This is part of the CFG cleanup passes. It attempts to join PHI nodes
- from a forwarder CFG block into another block with PHI nodes. The
- pass is located in <samp>tree-cfgcleanup.c</samp> and is described by
- <code>pass_merge_phi</code>.
- </p>
- </li><li> Return value optimization
-
- <p>If a function always returns the same local variable, and that local
- variable is an aggregate type, then the variable is replaced with the
- return value for the function (i.e., the function’s DECL_RESULT). This
- is equivalent to the C++ named return value optimization applied to
- GIMPLE. The pass is located in <samp>tree-nrv.c</samp> and is described by
- <code>pass_nrv</code>.
- </p>
- </li><li> Return slot optimization
-
- <p>If a function returns a memory object and is called as <code>var =
- foo()</code>, this pass tries to change the call so that the address of
- <code>var</code> is sent to the caller to avoid an extra memory copy. This
- pass is located in <code>tree-nrv.c</code> and is described by
- <code>pass_return_slot</code>.
- </p>
- </li><li> Optimize calls to <code>__builtin_object_size</code>
-
- <p>This is a propagation pass similar to CCP that tries to remove calls
- to <code>__builtin_object_size</code> when the size of the object can be
- computed at compile-time. This pass is located in
- <samp>tree-object-size.c</samp> and is described by
- <code>pass_object_sizes</code>.
- </p>
- </li><li> Loop invariant motion
-
- <p>This pass removes expensive loop-invariant computations out of loops.
- The pass is located in <samp>tree-ssa-loop.c</samp> and described by
- <code>pass_lim</code>.
- </p>
- </li><li> Loop nest optimizations
-
- <p>This is a family of loop transformations that works on loop nests. It
- includes loop interchange, scaling, skewing and reversal and they are
- all geared to the optimization of data locality in array traversals
- and the removal of dependencies that hamper optimizations such as loop
- parallelization and vectorization. The pass is located in
- <samp>tree-loop-linear.c</samp> and described by
- <code>pass_linear_transform</code>.
- </p>
- </li><li> Removal of empty loops
-
- <p>This pass removes loops with no code in them. The pass is located in
- <samp>tree-ssa-loop-ivcanon.c</samp> and described by
- <code>pass_empty_loop</code>.
- </p>
- </li><li> Unrolling of small loops
-
- <p>This pass completely unrolls loops with few iterations. The pass
- is located in <samp>tree-ssa-loop-ivcanon.c</samp> and described by
- <code>pass_complete_unroll</code>.
- </p>
- </li><li> Predictive commoning
-
- <p>This pass makes the code reuse the computations from the previous
- iterations of the loops, especially loads and stores to memory.
- It does so by storing the values of these computations to a bank
- of temporary variables that are rotated at the end of loop. To avoid
- the need for this rotation, the loop is then unrolled and the copies
- of the loop body are rewritten to use the appropriate version of
- the temporary variable. This pass is located in <samp>tree-predcom.c</samp>
- and described by <code>pass_predcom</code>.
- </p>
- </li><li> Array prefetching
-
- <p>This pass issues prefetch instructions for array references inside
- loops. The pass is located in <samp>tree-ssa-loop-prefetch.c</samp> and
- described by <code>pass_loop_prefetch</code>.
- </p>
- </li><li> Reassociation
-
- <p>This pass rewrites arithmetic expressions to enable optimizations that
- operate on them, like redundancy elimination and vectorization. The
- pass is located in <samp>tree-ssa-reassoc.c</samp> and described by
- <code>pass_reassoc</code>.
- </p>
- </li><li> Optimization of <code>stdarg</code> functions
-
- <p>This pass tries to avoid the saving of register arguments into the
- stack on entry to <code>stdarg</code> functions. If the function doesn’t
- use any <code>va_start</code> macros, no registers need to be saved. If
- <code>va_start</code> macros are used, the <code>va_list</code> variables don’t
- escape the function, it is only necessary to save registers that will
- be used in <code>va_arg</code> macros. For instance, if <code>va_arg</code> is
- only used with integral types in the function, floating point
- registers don’t need to be saved. This pass is located in
- <code>tree-stdarg.c</code> and described by <code>pass_stdarg</code>.
- </p>
- </li></ul>
-
- <hr>
- <div class="header">
- <p>
- Next: <a href="RTL-passes.html#RTL-passes" accesskey="n" rel="next">RTL passes</a>, Previous: <a href="IPA-passes.html#IPA-passes" accesskey="p" rel="prev">IPA passes</a>, Up: <a href="Passes.html#Passes" accesskey="u" rel="up">Passes</a> [<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>
- </div>
-
-
-
- </body>
- </html>
|