Developer Guide and Reference

Contents

Using IPO

This topic discusses how to use IPO from the command line.

Compiling and Linking Using IPO

To enable IPO, you first compile each source file, then link the resulting source files.
First, compile your source files with
[Q]ipo
compiler as shown below:
Operating System
Example Command
Linux*
and
macOS*
icpc -ipo -c a.cpp b.cpp c.cpp
Windows*
icl /Qipo /c a.cpp b.cpp c.cpp
The output of the above example command differs according to operating system:
  • Linux
    and
    macOS*
    : The commands produce
    a.o
    ,
    b.o
    , and
    c.o
    object files.
  • Windows: The commands produce
    a.obj
    ,
    b.obj
    , and
    c.obj
    object files.
Use the
c
compiler option to stop compilation after generating
.o
or
.obj
files. The output files contain compiler intermediate representation (IR) corresponding to the compiled source files.
Second, link the resulting files. The following example command will produce an executable named
app
:
Operating System
Example Command
Linux
and
macOS*
icpc -o app a.o b.o c.o
Windows
icl /Feapp a.obj b.obj c.obj
The command invokes the compiler on the objects containing IR and creates a new list of objects to be linked. Alternately, you can use the
xild
(Linux
and
macOS*
) or
xilink
(Windows) tool, with the appropriate linking options.

Combining the Steps

The separate compile and link commands demonstrated above can be combined into a single command, as shown in the following examples:
Operating System
Example Command
Linux
and
macOS*
icpc -ipo -o app a.cpp b.cpp c.cpp
Windows
icl /Qipo /Feapp a.cpp b.cpp c.cpp
The
icl/icpc
command, shown in the examples above, calls
GCC ld
(Linux
and
macOS*
) or
link.exe
(Windows only) to link the specified object files and produce the executable application, which is specified by the
-o
(Linux
and
macOS*
) or
/Fe
(Windows) option.
Linux: Using
icpc
allows the compiler to use standard C++ libraries automatically;
icc
will not use the standard C++ libraries automatically.
macOS*
: Using icc/icpc commands allows the compiler to use libc++ libraries, by default.
You can switch to using the GNU implementation of the standard C++ library using the
-stdlib=
libstdc++
compiler option.
The Intel linking tools emulate the behavior of compiling at
-O0
(Linux
and
macOS*
) and
/Od
(Windows) option.
If multiple file IPO is applied to a series of object files, no one which are mock object files, no multi-file IPO is performed. The object files are simply linked with the linker.

Capturing Intermediate IPO Output

The
[Q]ipo-c
and
[Q]ipo-S
compiler options are useful for analyzing the effects of multi-file IPO, or when experimenting with multi-file IPO between modules that do not make up a complete program.
  • Use the
    [Q]ipo-c
    compiler option to optimize across files and produce an object file. The option performs optimizations as described for the
    [Q]ipo
    option but stops prior to the final link stage, leaving an optimized object file. The default name for this file is
    ipo_out.o
    (Linux
    and
    macOS*
    ) or
    ipo_out.obj
    (Windows).
  • Use the
    [Q]ipo-S
    compiler option to optimize across files and produce an assembly file. The option performs optimizations as described for
    [Q]ipo
    , but stops prior to the final link stage, leaving an optimized assembly file. The default name for this file is
    ipo_out.s
    (Linux) or
    ipo_out.asm
    (Windows).
For both options, you can use the
-o
(Linux
and
macOS*
) or
/Fe
(Windows) option to specify a different name.
These options generate multiple outputs if multi-object IPO is being used. The name of the first file is taken from the value of the
-o
(Linux
and
macOS*
) or
/Fe
(Windows) option.
The names of subsequent files are derived from the first file with an appended numeric value to the file name. For example, if the first object file is named
foo.o
(Linux
and
macOS*
) or
foo.obj
(Windows), the second object file will be named
foo1.o
or
foo1.obj
.
You can use the object file generated with the
[Q]ipo-c
option, but you will not get the full benefit of whole program optimizations if you use this option.
The object file created using the
[Q]ipo-c
option is a real object file, in contrast to the mock file normally generated using IPO; however, the generated object file is significantly different than the mock object file.