лягушка игнорируя атрибут noinline - PullRequest
0 голосов
/ 01 февраля 2019

Я ожидал, что __attribute__((noinline)) при добавлении в функцию, чтобы убедиться, что эта функция испускается.Это работает с gcc, но, похоже, clang все еще встроен.

Вот пример, который вы также можете открыть на Godbolt :

namespace {

__attribute__((noinline))
int inner_noinline() {
    return 3;
}

int inner_inline() {
    return 4;
}

int outer() {
    return inner_noinline() + inner_inline();
}

}

int main() {
    return outer();
}

При сборке с-O3, gcc испускает inner_noinline, но не inner_inline:

(anonymous namespace)::inner_noinline():
        mov     eax, 3
        ret
main:
        call    (anonymous namespace)::inner_noinline()
        add     eax, 4
        ret

Clang настаивает на его вставке:

main: # @main
  mov eax, 7
  ret

При добавлении параметра в функции и разрешении имвыполняя небольшую работу, clang уважает атрибут noinline: https://godbolt.org/z/NNSVab

Разве noinline не должен быть независимым от сложности функции?Чего мне не хватает?

1 Ответ

0 голосов
/ 01 февраля 2019

__attribute__((noinline)) не позволяет компилятору встроить функцию.Это не мешает ему делать постоянное сворачивание.В этом случае компилятор смог распознать, что не было необходимости вызывать inner_noinline, либо как встроенную вставку, либо как вызов вне строки.Он может просто заменить вызов функции константой 3.

Похоже, вы хотите использовать вместо этого атрибут optnone, чтобы компилятор не применял даже самые очевидные из оптимизаций (как этотесть).

...