<html lang="en"> <head> <title>Scalar evolutions - GNU Compiler Collection (GCC) Internals</title> <meta http-equiv="Content-Type" content="text/html"> <meta name="description" content="GNU Compiler Collection (GCC) Internals"> <meta name="generator" content="makeinfo 4.13"> <link title="Top" rel="start" href="index.html#Top"> <link rel="up" href="Loop-Analysis-and-Representation.html#Loop-Analysis-and-Representation" title="Loop Analysis and Representation"> <link rel="prev" href="LCSSA.html#LCSSA" title="LCSSA"> <link rel="next" href="loop_002div.html#loop_002div" title="loop-iv"> <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> <!-- Copyright (C) 1988-2015 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.--> <meta http-equiv="Content-Style-Type" content="text/css"> <style type="text/css"><!-- pre.display { font-family:inherit } pre.format { font-family:inherit } pre.smalldisplay { font-family:inherit; font-size:smaller } pre.smallformat { font-family:inherit; font-size:smaller } pre.smallexample { font-size:smaller } pre.smalllisp { font-size:smaller } span.sc { font-variant:small-caps } span.roman { font-family:serif; font-weight:normal; } span.sansserif { font-family:sans-serif; font-weight:normal; } --></style> </head> <body> <div class="node"> <a name="Scalar-evolutions"></a> <p> Next: <a rel="next" accesskey="n" href="loop_002div.html#loop_002div">loop-iv</a>, Previous: <a rel="previous" accesskey="p" href="LCSSA.html#LCSSA">LCSSA</a>, Up: <a rel="up" accesskey="u" href="Loop-Analysis-and-Representation.html#Loop-Analysis-and-Representation">Loop Analysis and Representation</a> <hr> </div> <h3 class="section">15.5 Scalar evolutions</h3> <p><a name="index-Scalar-evolutions-3235"></a><a name="index-IV-analysis-on-GIMPLE-3236"></a> Scalar evolutions (SCEV) are used to represent results of induction variable analysis on GIMPLE. They enable us to represent variables with complicated behavior in a simple and consistent way (we only use it to express values of polynomial induction variables, but it is possible to extend it). The interfaces to SCEV analysis are declared in <samp><span class="file">tree-scalar-evolution.h</span></samp>. To use scalar evolutions analysis, <code>scev_initialize</code> must be used. To stop using SCEV, <code>scev_finalize</code> should be used. SCEV analysis caches results in order to save time and memory. This cache however is made invalid by most of the loop transformations, including removal of code. If such a transformation is performed, <code>scev_reset</code> must be called to clean the caches. <p>Given an SSA name, its behavior in loops can be analyzed using the <code>analyze_scalar_evolution</code> function. The returned SCEV however does not have to be fully analyzed and it may contain references to other SSA names defined in the loop. To resolve these (potentially recursive) references, <code>instantiate_parameters</code> or <code>resolve_mixers</code> functions must be used. <code>instantiate_parameters</code> is useful when you use the results of SCEV only for some analysis, and when you work with whole nest of loops at once. It will try replacing all SSA names by their SCEV in all loops, including the super-loops of the current loop, thus providing a complete information about the behavior of the variable in the loop nest. <code>resolve_mixers</code> is useful if you work with only one loop at a time, and if you possibly need to create code based on the value of the induction variable. It will only resolve the SSA names defined in the current loop, leaving the SSA names defined outside unchanged, even if their evolution in the outer loops is known. <p>The SCEV is a normal tree expression, except for the fact that it may contain several special tree nodes. One of them is <code>SCEV_NOT_KNOWN</code>, used for SSA names whose value cannot be expressed. The other one is <code>POLYNOMIAL_CHREC</code>. Polynomial chrec has three arguments – base, step and loop (both base and step may contain further polynomial chrecs). Type of the expression and of base and step must be the same. A variable has evolution <code>POLYNOMIAL_CHREC(base, step, loop)</code> if it is (in the specified loop) equivalent to <code>x_1</code> in the following example <pre class="smallexample"> while (...) { x_1 = phi (base, x_2); x_2 = x_1 + step; } </pre> <p>Note that this includes the language restrictions on the operations. For example, if we compile C code and <code>x</code> has signed type, then the overflow in addition would cause undefined behavior, and we may assume that this does not happen. Hence, the value with this SCEV cannot overflow (which restricts the number of iterations of such a loop). <p>In many cases, one wants to restrict the attention just to affine induction variables. In this case, the extra expressive power of SCEV is not useful, and may complicate the optimizations. In this case, <code>simple_iv</code> function may be used to analyze a value – the result is a loop-invariant base and step. </body></html>