Hi, Thanks so much, this exactly solves issue. I didn't know about this option, it seems very useful in such cases.
--- With best regards, Konstantin On Tue, Feb 7, 2012 at 5:11 PM, Richard Guenther <richard.guent...@gmail.com> wrote: > On Tue, Feb 7, 2012 at 1:57 PM, Konstantin Vladimirov > <konstantin.vladimi...@gmail.com> wrote: >> Hi, >> >> That is good solution, thanks. >> >> But what if I want to compile e.o and d.o with cross-module inlining >> (but also with fixed regs and so, without lto, as you are suggesting)? >> On gcc-4.3.3, I had "combine" option for such cases. Is it completely >> impossible in gcc 4.6.2? > > You then can do > > gcc $OPTIONS -flto a.c -o a.o > gcc $OPTIONS -flto b.c -o b.o > gcc $OPTIONS -ffixed-r9 -ffixed-r10 -flto d.c -o d.o > gcc $OPTIONS -ffixed-r9 -ffixed-r10 -flto e.c -o e.o > gcc $OPTIONS -flto a.o b.o -o non-fixed-reg-part.o -r -nostdlib > gcc $OPTIONS -flto -ffixed-r9 -ffixed-r10 d.o e.o -o fixed-reg-part.o > -r -nostdlib > gcc non-fixed-reg-part.o fixed-reg-part.o > > thus, optimize both pieces via partial LTO linking (-r, maybe the -nostdlib is > not needed) and then do the final link separately. > > Richard. > >> --- >> With best regards, Konstantin >> >> On Tue, Feb 7, 2012 at 4:37 PM, Richard Guenther >> <richard.guent...@gmail.com> wrote: >>> On Tue, Feb 7, 2012 at 1:26 PM, Konstantin Vladimirov >>> <konstantin.vladimi...@gmail.com> wrote: >>>> Hi, >>>> >>>> Consider some project, consisting of files: a.c, b.c, d.c and e.c >>>> >>>> Compiler is gcc 4.6.2 >>>> >>>> Files a.c and b.c are performance bottlenecks and requires heavy >>>> cross-module inline, so must be compiled with -flto option >>>> Files d.c and e.c is preffered to be compiled with lto option too, but >>>> they are of special usage, and requires some registers (say r9 and >>>> r10) to be fixed (with -ffixed-<reg> option) during compilation. >>>> >>>> All these files forms single binary. >>>> >>>> Now the problem is: if I compiling >>>> >>>> gcc $OPTIONS -flto a.c -o a.o >>>> gcc $OPTIONS -flto b.c -o b.o >>>> gcc $OPTIONS -ffixed-r9 -ffixed-r10 -flto d.c -o d.o >>>> gcc $OPTIONS -ffixed-r9 -ffixed-r10 -flto e.c -o d.o >>>> >>>> and then >>>> >>>> gcc $OPTIONS -flto a.o b.o d.o e.o -o a.out >>>> >>>> Then registers inside d.o and e.o are being reallocated at link time, >>>> and r9, r10 are used in the d.o and e.o parts in the resulted binary. >>>> Also I can not specify fixed regs to final link, because this will fix >>>> registers in a.o and b.o parts, that will affect performance. >>>> >>>> The best way for me seems to somehow separately link pseudo-object >>>> files a.o and b.o with -flto to simple object (say x.o), and then link >>>> e.o and d.o to single, say, y.o, and then call linker to finally link >>>> binary without cross-module optimizations. But I can not find >>>> possibility to do it, and I doubt if this at all conforms with lto >>>> ideology. >>> >>> That's indeed the way to go, but you don't need anything fancy like >>> partial linking. >>> >>> gcc $OPTIONS -flto a.c -o a.o >>> gcc $OPTIONS -flto b.c -o b.o >>> gcc $OPTIONS -ffixed-r9 -ffixed-r10 d.c -o d.o >>> gcc $OPTIONS -ffixed-r9 -ffixed-r10 e.c -o e.o >>> gcc $OPTIONS -flto a.o b.o d.o e.o >>> >>> should do it automatically. Just make sure to not compile d.o and e.o >>> with -flto. >>> >>> Richard. >>> >>>> So, I want to perform link-time optimizations between a.o and b.o, and >>>> don't want them between (a.o or b.o) and (d.o or e.o) >>>> >>>> How can I approach this? >>>> >>>> Thanks in advance for everyone, who will help. >>>> >>>> --- >>>> With best regards, Konstantin