Я пытаюсь воспроизвести результаты применения opt -O3 к исходному файлу в виде LLVM IR. Я хочу получить тот же IR, заказав вручную проходы, используемые O3, и передав их в opt.
Чтобы проиллюстрировать, что я делаю на примере, в качестве входных данных я использую эталонный тест linpack из набора тестов LLVM [1]:
1. Сначала я создаю промежуточное представление, используя clang:
clang -O3 -Xclang -disable-llvm-optzns -emit-llvm -S linpack-pc.c -o linpack-pc.ll
2. Затем я использую опцию для оптимизации ИК:
opt -S -O3 -o linpack-pc-3.ll linpack-pc.ll
Теперь моя цель - создать IR, идентичный linpack-pc-3.ll, передав последовательность оптимизации для выбора. Чтобы получить список оптимизаций, используемых opt для O3, я запускаю это:
opt -O3 -disable-output -debug-pass=Arguments linpack-pc.ll
Что производит (сокращено, чтобы не тратить впустую пространство):
Pass Arguments: -tti -targetlibinfo -tbaa ...
Pass Arguments: -targetlibinfo -tti -tbaa ...
Pass Arguments: -domtree
Таким образом, очевидно, есть три последовательности проходов, примененных к IR как часть O3. Я не смог воспроизвести тот же IR, что и linpack-pc-3.ll, используя эти проходы, я попытался применить проходы последовательно или объединить их и передать как одну последовательность для выбора. Ни один из них не дал нужного результата. Причем производительность финального исполняемого файла понижена примерно на 35%. Я использую LLVM 3.8, и моя ОС - Ubuntu 16.04.
[1] https://github.com/llvm/llvm-test-suite/blob/master/SingleSource/Benchmarks/Linpack/linpack-pc.c