Троллейбус из буханки или alias analysis в LLVM

5ddeddb8e6f941d098d08582010f6181.pngВ преддверии очередной конференции C++ Siberia, я решил выложить на всеобщее оборзрение запись доклада с февральской конференции C++ Russia, проходившей в городе-герое Санкт-Петербурге.

Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай!, а то все сломаешь!». Новичок и не трогает.

В докладе была сделана попытка заглянуть под капот компилятора и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема была рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» был центральным.

В докладе вы найдете:

  • Код Quake3
  • Магическую константу 0×5F3759DF
  • Много ассемблера
  • Много IR кода LLVM
  • Rust, Java и даже Fortran
Disclaimer
Дело в том, что в самолете меня угораздило капитально простыть, а выступать надо было следующим же утром. Пришлось накачиваться парацетамолом и идти вещать с температурой +38°C. Что было на докладе я осознал уже позже, с удивлением просмотрев это видео.

Поэтому прошу вас концентрироваться на докладе, а не на моей печальной физиономии


Комментарии (5)

  • 24 июля 2016 в 16:16

    +2

    можно будет потом в текстовом виде это узреть?
    • 24 июля 2016 в 16:43 (комментарий был изменён)

      0

      Да, конечно. Я давно хотел оформить эту тему в виде статьи, но последние 4 месяца писал код вывода типов для llst.

      Я планирую оформить очередную статью про llst по результатам работы, добавив к ней материалы из февральского доклада.

    • 24 июля 2016 в 16:53 (комментарий был изменён)

      +1

      Пока могу предложить только слайды в виде pdf.
  • 24 июля 2016 в 17:51

    0

    Если очень очень очень коротко:

    float as_float (int* p_i) {
    float * p_f = (float*) p_i;
    return *p_f;
    }

    этот код, скомпилированный без -fno-strict-aliasing, приводит к неопределенному поведению, так как компилятор имеет право считать, что p_f и p_i никогда не указывают на одну и ту же область памяти.

    • 24 июля 2016 в 17:52

      0

      Совершенно верно. Этой теме был посвящен отдельный доклад, о котором я уже писал на Хабре.

© Habrahabr.ru