Я написал низкоуровневую оптимизацию для бэкенда LLVM code-generator. В основном, оптимизация будет переупорядочивать инструкции сборки на уровне базовых блоков, чтобы позволить более поздней (существующей) оптимизации более эффективно оптимизировать результирующий код. Есть ряд тестовых примеров, которые я хотел бы проверить, и я хотел бы получить некоторые предложения по процессу тестирования, поскольку я впервые пытаюсь сделать что-то подобное.
То, что я рассматривал до сих пор:
Компиляция эталонных примеров, написанных на C, и изучение полученного ASM, сгенерированного с помощью опции -S
. Я сделал это и сравнил результаты с моей оптимизацией с исходными результатами. Этот метод позволяет мне увидеть, что моя оптимизация работает, но даже если я напишу пользовательские неисполняемые файлы C, я не смогу исследовать все желаемые тестовые случаи упорядочивания инструкций.
Скомпилировать эталоны в LLVM-ассемблер, отредактировать его, затем опустить ASM до ассемблера целевой машины. Это может сработать, но из-за разного уровня абстракции между LLVM и целевым ASM я сомневаюсь, что смогу изучить все тестовые случаи, взламывая LLVM ASM, пока он не сгенерирует то, что я хочу.
Использовать тестовые примеры целевого ASM в качестве входных данных для LLVM и перекомпилировать с использованием новой оптимизации. Я не смог найти опцию для LLVM или gcc (большинство опций которых LLVM принимает), чтобы принять ASM в качестве входных данных.
Какова хорошая стратегия для тестирования конкретных тестовых примеров ASM при проверке низкоуровневой оптимизации компилятора ASM? Есть ли у LLVM (или gcc) какие-то опции командной строки, которые облегчили бы этот процесс?
Edit: To clarify, I'm not asking about automatically generating ASM test cases; my problem is that I have those test cases (e.g., ASM_before.s
и reference_ASM_after.s
), но мне нужно иметь возможность передать ASM_before.s
в LLVM и убедиться, что оптимизированный результат ASM_after.s
соответствует известному хорошему reference_ASM_after.s
. Я ищу способ сделать это без необходимости "декомпилировать" ASM_before.s
в язык высокого уровня, а затем компилировать его (с оптимизацией) в ASM_after.s
.