For the most part, IPO generates a single object file for the link-time compilation. This can be clumsy for very large applications, perhaps even making it impossible to use -ipo on the application. The compiler provides two ways to avoid this problem. The first way is a size-based heuristic, which automatically causes the compiler to generate multiple object files for large link-time compilations. The second way is using one of two explicit command line controls for that tell the compiler to do multi-object IPO:
-ipoN, where N indicates the number of object files to generate
-ipo_separate, which tells the compiler to generate a separate IPO object file for each source file.
These options are alternatives to the -ipo option, that is, they indicate an IPO compilation. Explicitly requesting a multi-object IPO compilation turns the size-based heuristic off.
The number of files generated by the link-time compilation is invisible to the user unless either the -ipo_c or -ipo_S option is used. In this case the compiler appends a number to the file name. For example, consider this command line:
ifort a.o b.o c.o -ipo_separate -ipo_c
In this command line, a.o, b.o, and c.o all contain IR, so the compiler will generate ipo_out.o, ipo_out1.o, ipo_out2.o, and ipo_out3.o.
The first object file contains global symbols. The other object files correspond to the source files.
This naming convention is also applied to user-specified names. For example:
ifort a.o b.o c.o -ipo_separate -ipo_c -o appl.o
This will generate appl.o, appl1.o, appl2.o, and appl3.o.