Go to the first, previous, next, last section, table of contents.
There are many options that affect the quality of code produced by
GHC. Most people only have a general goal, something like "Compile
quickly" or "Make my program run like greased lightning." The
following "packages" of optimisations (or lack thereof) should suffice.
Once you choose a `-O*' "package," stick with it -- don't chop and
change. Modules' interfaces will change with a shift to a new
`-O*' option, and you will have to recompile all importing modules
before your program can again be run safely.
- No `-O*'-type option specified:
- This is taken to mean: "Please compile quickly; I'm not over-bothered
about compiled-code quality." So, for example: `ghc -c Foo.hs'
- `-O' or `-O1':
- Means: "Generate good-quality code without taking too long about it."
Thus, for example: `ghc -c -O Main.lhs'
- `-O2':
- Means: "Apply every non-dangerous optimisation, even if it means
significantly longer compile times."
The avoided "dangerous" optimisations are those that can make
runtime or space worse if you're unlucky. They are
normally turned on or off individually.
As of version 0.26, `-O2' is unlikely to produce
better code than `-O'.
- `-fvia-C':
- Compile via C, and don't use the native-code generator.
(There are many cases when GHC does this on its own.) You might
pick up a little bit of speed by compiling via C. If you use
`_ccall_'s or `_casm_'s, you probably have to use
`-fvia-C'.
- `-O2-for-C':
- Says to run GCC with `-O2', which may be worth a few percent in
execution speed. Don't forget `-fvia-C', lest you use the
native-code generator and bypass GCC altogether!
- `-Onot':
- This option will make GHC "forget" any -Oish options it has seen
so far. Sometimes useful; for example: `make all EXTRA_HC_OPTS=-Onot'.
- `-Ofile <file>':
- For those who need absolute control over exactly what
options are used (e.g., compiler writers, sometimes :-), a list of
options can be put in a file and then slurped in with `-Ofile'.
In that file, comments are of the `#'-to-end-of-line variety; blank
lines and most whitespace is ignored.
Please ask if you are baffled and would like an example of `-Ofile'!
At Glasgow, we don't use a `-O*' flag for day-to-day work. We use
`-O' to get respectable speed; e.g., when we want to measure
something. When we want to go for broke, we tend to use
`-O -fvia-C -O2-for-C' (and we go for lots of coffee breaks).
The easiest way to see what `-O' (etc) "really mean" is to run
with `-v', then stand back in amazement.
Alternatively, just look at the
`@HsC_minus<blah>' lists in the `ghc' driver script.
Go to the first, previous, next, last section, table of contents.