Как вручную воспроизвести результат LLVM opt -O3? - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь воспроизвести результаты применения 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

...