[Interest] building Qt 4.8.7 with gcc 5 and link-time optimisation on Linux

Thiago Macieira thiago.macieira at intel.com
Thu Jul 23 00:20:42 CEST 2015

On Wednesday 22 July 2015 23:20:40 René J. V. Bertin wrote:
> Thiago Macieira wrote:
> > $ git name-rev --tags 1bd27f24fb7f7d82f4b67cffe43e0af644709106
> > 1bd27f24fb7f7d82f4b67cffe43e0af644709106 tags/v5.4.0-alpha1~525
> > 
> > It should work on 5.4 then. The fix for static libraries came with 5.4.1,
> > though.
> Ha, indeed, it's a little bit more complicated when doing out-of-source
> builds. 

Just the running of configure and qmake, of course.

	$srcdir/configure [...]
	qmake -config ltcg $srcdir

> With an explicit reference to the .pro file -config was accepted,
> but I'm not yet sure that it actually changed anything when executed in a
> build directory on my Mac that had already seen a full build. It looks like
> all code was being recompiled, but I didn't see any flto options except in
> the 1st link command, which probably explains why it told me

That won't work if you already have a build. The propagation only works if 
there are no subdirectory Makefiles yet.

If you need to regenerate all the Makefiles, add -r (recursive):

	qmake -r -config ltcg $srcdir

and wait. If you remember Qt 4 configure, it used to do that during configure... 
which is why Qt 5 doesn't.

That's also why Qt 4's configure had the -fast option. Which wasn't the 
default. I don't know why anyone would intentionally choose a slow build with 
no further benefits...

> LLVM ERROR: Cannot select: intrinsic %llvm.x86.sse42.crc32.64.64
> (I'm using -march=native on an i7).

That's qhash.cpp (the only place where we use _mm_crc32_xxx()).

This sounds like qhash.cpp was compiled with -march=native but *linked* 
without. Can you confirm that you see the compiler options passed on the linker 
command-line (-O2 -march=native, etc.)?

Note I have not successfully compiled with LTO with Clang for a while, because 
the linker plugin somehow doesn't get loaded or refuses to understand the LLVM 
bytestream. I only test GCC LTO.

> Is it possible to negate/cancel/revert the effect of qmake -config ltcg? :)

qmake again without it

> > Check if you have mkspecs/features/ltcg.prf.
> That one actually exists in Qt 4.8.7 too ...

That's mkspecs/features/win32/ltcg.prf and it only supported MSVC's LTCG 
feature (which is where the file got the name from).

I moved it from win32/ltcg.prf to the main features dir when I added support 
for GCC, Clang and ICC.

> > It takes noticeably longer to compile :-)
> And even longer to link? ;)

Sorry, I meant the full build.

The compilation itself is faster because there's no code generation for GCC 
(due to -fno-fat-lto-objects). I don't remember whether Clang -flto produces 
LLVM and code or just LLVM bytecode. I know ICC doesn't, but for me it takes 
30 minutes to link QtCore and an infinite amount of time for QtGui (it gets 
OOM-killed due to swap exhaustion before it finishes).

BTW, if you want to force generation of the fat objects, do:
	qmake -config ltcg -config fat-lto $srcdir

Unless you're me, you don't want to do this.

> > the use of -ffunction-sections -Wl,--gc-sections. The libraries are
> > bigger,
> > but that might be due to my use of -O3 (causes code expansion).
> I'd think so; my initial impression with Qt 4.8.7 is that the difference is
> minimal.

I only have evidence for other projects, where LTO did have noticeable runtime 
performance effect. But it's usually the benefits are seen in micro-benchmarks.

LTO does seem to have a noticeable change in code size. Like I said, all 
bootstrapped binaries became smaller as a result because the compiler was 
better able to eliminate dead code. That's often the result of the -fwhole-
program part of -flto.

Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center

More information about the Interest mailing list