Есть ли способ для clang сообщать об оптимизации LTO, аналогично -Rpass? - PullRequest
0 голосов
/ 18 апреля 2020

С -Rpass=.* (который выдает отчеты об оптимизации в соответствии с документами: LINK ), я должен увидеть все отчеты об оптимизации.

Однако рассмотрим:

// foo.cc
void foo(int& a) {
    a++;
}
// foo.h
void foo(int& a);
// main.cc
#include "foo.h"
#include <iostream>

void bar(int &a) {
    a++;
}

int a;

int main() {
    bar(a);
    foo(a);
    std::cout << a;
}

$ clang++ --version
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

$ clang++ -O3 -Rpass=".*" main.cc foo.cc
main.cc:12:2: remark: _Z3barRi inlined into main with (cost=-20, threshold=375)
      [-Rpass=inline]
        bar(a);
        ^

$ objdump -S a.out | grep -A 12 "_main"
_main:
100000f50:  55  pushq   %rbp
100000f51:  48 89 e5    movq    %rsp, %rbp
100000f54:  48 8d 3d b5 10 00 00    leaq    4277(%rip), %rdi
100000f5b:  e8 20 00 00 00  callq   32 <__Z3fooRi>
100000f60:  8b 35 aa 10 00 00   movl    4266(%rip), %esi
100000f66:  ff c6   incl    %esi
100000f68:  89 35 a2 10 00 00   movl    %esi, 4258(%rip)
100000f6e:  48 8b 3d 8b 00 00 00    movq    139(%rip), %rdi
100000f75:  e8 0e 00 00 00  callq   14 <dyld_stub_binder+0x100000f88>
100000f7a:  31 c0   xorl    %eax, %eax
100000f7c:  5d  popq    %rbp
100000f7d:  c3  retq

Выше мы видим, что bar был встроен, а foo - нет.

Однако, похоже, что оптимизация во время LTO не сообщается с этим флагом:

$ clang++ -O3 -flto -Rpass=".*" main.cc foo.cc
main.cc:12:2: remark: _Z3barRi inlined into main with (cost=-20, threshold=375)
      [-Rpass=inline]
        bar(a);
        ^

$ objdump -S a.out | grep -A 12 "_main"
_main:
100000f70:  55  pushq   %rbp
100000f71:  48 89 e5    movq    %rsp, %rbp
100000f74:  8b 35 96 10 00 00   movl    4246(%rip), %esi
100000f7a:  83 c6 02    addl    $2, %esi
100000f7d:  89 35 8d 10 00 00   movl    %esi, 4237(%rip)
100000f83:  48 8b 3d 76 00 00 00    movq    118(%rip), %rdi
100000f8a:  e8 05 00 00 00  callq   5 <dyld_stub_binder+0x100000f94>
100000f8f:  31 c0   xorl    %eax, %eax
100000f91:  5d  popq    %rbp
100000f92:  c3  retq
Disassembly of section __TEXT,__stubs:
__stubs:

Выше мы видим, что bar было сообщено как встроенное, но во время LTO было больше оптимизаций apply.

Есть ли способ просмотреть результаты этих проходов оптимизации?

...