summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2012-04-04 15:58:37 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2012-04-04 15:58:37 +0100
commit4caef1c42dd5b6e4982e7f07162c9a7edc5a1b0b (patch)
treedff156103a19fd96071bfd7eca975a41f812abea
parent4d20dc8b47269f3df8f0e9c3720a37e88f0992e0 (diff)
downloadhaskell-4caef1c42dd5b6e4982e7f07162c9a7edc5a1b0b.tar.gz
Document optimisation passes, to some extent at least
-rw-r--r--docs/users_guide/using.xml131
1 files changed, 60 insertions, 71 deletions
diff --git a/docs/users_guide/using.xml b/docs/users_guide/using.xml
index 9df4ee01c1..6261079f92 100644
--- a/docs/users_guide/using.xml
+++ b/docs/users_guide/using.xml
@@ -1770,18 +1770,21 @@ f "2" = 2
They are normally set via the <option>-O</option> options
described above, and as such, you shouldn't need to set any of
them explicitly (indeed, doing so could lead to unexpected
- results). However, there are one or two that may be of
- interest:</para>
+ results). A flag <option>-fwombat</option> can be negated by
+ saying <option>-fno-wombat</option>. The flags below are off by default,
+ except where noted below.
+ </para>
<variablelist>
<varlistentry>
<term>
- <option>-fno-cse</option>
- <indexterm><primary><option>-fno-cse</option></primary></indexterm>
+ <option>-fcse</option>
+ <indexterm><primary><option>-fcse</option></primary></indexterm>
</term>
<listitem>
- <para>Turns off the common-sub-expression elimination optimisation.
- Can be useful if you have some <literal>unsafePerformIO</literal>
+ <para><emphasis>On by default.</emphasis>. Enables the common-sub-expression
+ elimination optimisation.
+ Switching this off can be useful if you have some <literal>unsafePerformIO</literal>
expressions that you don't want commoned-up.</para>
</listitem>
</varlistentry>
@@ -1792,21 +1795,10 @@ f "2" = 2
<indexterm><primary><option></option></primary></indexterm>
</term>
<listitem>
- <para>
+ <para> <emphasis>On by default.</emphasis>.
+ Switch on the strictness analyser. There is a very old paper about GHC's
+ strictness analyser, <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/simple-strictnes-analyser.ps.gz">Measuring the effectiveness of a simple strictness analyser</ulink>, but the current one is quite a bit different.
</para>
- TODO: Document optimisation
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fno-strictness</option>
- <indexterm><primary><option>-fno-strictness</option></primary></indexterm>
- </term>
- <listitem>
- <para>Turns off the strictness analyser; sometimes it eats
- too many cycles.</para>
- TODO: Maybe document positive cases and remove all negative cases?
</listitem>
</varlistentry>
@@ -1840,19 +1832,21 @@ f "2" = 2
<indexterm><primary><option>-fspec-constr</option></primary></indexterm>
</term>
<listitem>
- <para>Turn on call-pattern specialisation.</para>
- TODO: Document optimisation
+ <para><emphasis>Off by default, but enabled by -O2.</emphasis>
+ Turn on call-pattern specialisation; see <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/spec-constr/index.htm">Call-pattern specialisation for Haskell programs</ulink>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
- <option>-fno-specialise</option>
- <indexterm><primary><option>-fno-specialise</option></primary></indexterm>
+ <option>-fspecialise</option>
+ <indexterm><primary><option>-fspecialise</option></primary></indexterm>
</term>
<listitem>
- <para>Turns off the automatic specialisation of overloaded functions.</para>
- TODO: Document optimisation, probably change to a positive, not a -fno-* description.
+ <para><emphasis>On by default.</emphasis>
+ Specialise each type-class-overloaded function defined in this module for the types at which
+ it is called in this module. Also specialise imported functions that have an INLINABLE pragma
+ (<xref linkend="inlinable-pragma"/>) for the types at which they are called in this module.</para>
</listitem>
</varlistentry>
@@ -1862,8 +1856,7 @@ f "2" = 2
<indexterm><primary><option>-fstatic-argument-transformation</option></primary></indexterm>
</term>
<listitem>
- <para>Turn on the static argument transformation.</para>
- TODO: Document optimisation
+ <para>Turn on the static argument transformation, which turns a recursive function into a non-recursive one with a local recursive loop. See Chapter 7 of <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/santos-thesis.ps.gz">Andre Santos's PhD thesis</ulink></para>
</listitem>
</varlistentry>
@@ -1873,35 +1866,24 @@ f "2" = 2
<indexterm><primary><option></option></primary></indexterm>
</term>
<listitem>
- <para>
+ <para> <emphasis>On by default.</emphasis>
+ Float let-bindings inwards, nearer their binding site. See <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/float.ps.gz">Let-floating: moving bindings to give faster programs (ICFP'96)</ulink>.
</para>
- TODO: Document optimisation
</listitem>
</varlistentry>
<varlistentry>
<term>
- <option>-fno-float-in</option>
- <indexterm><primary><option>-fno-float-in</option></primary></indexterm>
+ <option>-ffull-laziness</option>
+ <indexterm><primary><option>-ffull-laziness</option></primary></indexterm>
</term>
<listitem>
- <para>Turns off the float-in transformation.</para>
- TODO: Maybe document positive cases and remove all negative cases?
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <option>-fno-full-laziness</option>
- <indexterm><primary><option>-fno-full-laziness</option></primary></indexterm>
- </term>
- <listitem>
- <para>Turns off the full laziness optimisation (also known as
- let-floating). Full laziness increases sharing, which can lead
+ <para><emphasis>On by default.</emphasis>
+ Run the full laziness optimisation (also known as
+ let-floating), which floats let-bindings outside enclosing lambdas, in the hope they will be thereby be computed less often.
+ See <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/float.ps.gz">Let-floating: moving bindings to give faster programs (ICFP'96)</ulink>.
+ Full laziness increases sharing, which can lead
to increased memory residency.</para>
-
- TODO: Document optimisation
-
<para>NOTE: GHC doesn't implement complete full-laziness.
When optimisation in on, and
<option>-fno-full-laziness</option> is not given, some
@@ -1919,10 +1901,8 @@ f "2" = 2
<option>-fdo-lambda-eta-expansion</option>
<indexterm><primary><option></option></primary></indexterm>
</term>
- <listitem>
- <para>
+ <listitem><para> <emphasis>On by default.</emphasis> Eta-expand let-bindings to increase their arity.
</para>
- TODO: Document optimisation
</listitem>
</varlistentry>
@@ -1931,10 +1911,9 @@ f "2" = 2
<option>-fdo-eta-reduction</option>
<indexterm><primary><option></option></primary></indexterm>
</term>
- <listitem>
- <para>
+ <listitem> <para> <emphasis>On by default.</emphasis>
+ Eta-reduce lambda expressions, if doing so gets rid of a whole group of lambdas.
</para>
- TODO: Document optimisation
</listitem>
</varlistentry>
@@ -1944,9 +1923,21 @@ f "2" = 2
<indexterm><primary><option></option></primary></indexterm>
</term>
<listitem>
- <para>
+ <para><emphasis>On by default.</emphasis>
+ Merge immediately-nested case expressions that scrutinse the same variable. Example
+<programlisting>
+ case x of
+ Red -> e1
+ _ -> case x of
+ Blue -> e2
+ Green -> e3
+==>
+ case x of
+ Red -> e1
+ Blue -> e2
+ Green -> e2
+</programlisting>
</para>
- TODO: Document optimisation
</listitem>
</varlistentry>
@@ -1956,8 +1947,10 @@ f "2" = 2
<indexterm><primary><option>-fliberate-case</option></primary></indexterm>
</term>
<listitem>
- <para>Turn on the liberate-case transformation.</para>
- TODO: Document optimisation
+ <para><emphasis>Off by default, but enabled by -O2.</emphasis>
+ Turn on the liberate-case transformation. This unrolls recursive function once in its own RHS, to
+ avoid repeated case analysis of free variables. It's a bit like the call-pattern specialiser
+ (<option>-fspec-constr</option>) but for free variables rather than arguments.</para>
</listitem>
</varlistentry>
@@ -1967,9 +1960,8 @@ f "2" = 2
<indexterm><primary><option></option></primary></indexterm>
</term>
<listitem>
- <para>
+ <para> A very experimental flag that makes dictionary-valued expressions seem cheap to the optimiser.
</para>
- TODO: Document optimisation
</listitem>
</varlistentry>
@@ -1979,9 +1971,9 @@ f "2" = 2
<indexterm><primary><option></option></primary></indexterm>
</term>
<listitem>
- <para>
+ <para> Usually GHC black-holes a thunk only when it switches threads. This flag makes it do so
+ as soon as the thunk is entered. See <ulink url="http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel/">Haskell on a shared-memory multiprocessor</ulink>.
</para>
- TODO: Document optimisation
</listitem>
</varlistentry>
@@ -2079,11 +2071,9 @@ f "2" = 2
<para>The difference between this and
<option>-funfolding-creation-threshold</option> is that this one
- determines if a function definition will be inlined at a call
- site. The other option determines if a function definition will
- be kept around to begin with for potential inlining.</para>
-
- TODO: Is above para correct?
+ determines if a function definition will be inlined <emphasis>at a call
+ site</emphasis>. The other option determines if a function definition will
+ be kept around at all for potential inlining.</para>
</listitem>
</varlistentry>
@@ -2093,9 +2083,8 @@ f "2" = 2
<indexterm><primary><option></option></primary></indexterm>
</term>
<listitem>
- <para>
+ <para>An experimental flag to expose all unfoldings, even for very large or recursive functions.
</para>
- TODO: Document optimisation
</listitem>
</varlistentry>
@@ -2105,7 +2094,7 @@ f "2" = 2
<indexterm><primary><option></option></primary></indexterm>
</term>
<listitem>
- <para>
+ <para>Data Parallel Haskell.
</para>
TODO: Document optimisation
</listitem>
@@ -2117,7 +2106,7 @@ f "2" = 2
<indexterm><primary><option></option></primary></indexterm>
</term>
<listitem>
- <para>
+ <para>Data Parallel Haskell.
</para>
TODO: Document optimisation
</listitem>