Я написал низкоуровневую оптимизацию для бэкэнда генератора кода LLVM. В принципе, оптимизация будет изменять порядок команд сборки на уровне базового блока, чтобы позволить более поздней (существующей) оптимизации более эффективно оптимизировать результирующий код. Есть несколько тестовых примеров, которые я хотел бы проверить, и мне хотелось бы получить некоторые предложения для процесса тестирования, так как это первый случай, когда я пытался что-то вроде этого.
Вещи, которые я рассмотрел до сих пор:
-
Скомпилируйте контрольные показатели, написанные на C, и изучите полученную ASM, сгенерированную с помощью опции
-S
. Я сделал это и сравнил результаты с моей оптимизацией с исходными результатами. Этот метод позволяет мне видеть, что моя оптимизация работает, но даже если я пишу пользовательские невыполняемые файлы C, я не смогу проверить все мои требуемые тестовые примеры заказа инструкций. -
Скомпилируйте тесты для сборки LLVM, отредактируйте это, затем опустите ASM до сборки целевого компьютера. Это может сработать, но из-за различного уровня абстракции между LLVM и целевой ASM я сомневаюсь, что я смогу изучить все тестовые примеры, взломав ASM LLVM, пока он не генерирует то, что я хочу.
-
Используйте целевые тестовые примеры ASM в качестве входных данных для LLVM и перекомпилируйте их с помощью новой оптимизации. Мне не удалось найти вариант для LLVM или gcc (большинство из которых могут принимать LLVM), чтобы принять ASM в качестве ввода.
Какая хорошая стратегия для тестирования конкретных тестов ASM при проверке оптимизации компилятора низкого уровня ASM? Имеет ли LLVM (или gcc) некоторые параметры командной строки, которые облегчили бы этот процесс?
Изменить: Чтобы уточнить, я не спрашиваю о том, чтобы автоматически генерировать тестовые примеры ASM; моя проблема в том, что у меня есть эти тестовые примеры (например, ASM_before.s
и reference_ASM_after.s
), но мне нужно пройти ASM_before.s
в LLVM и убедиться, что оптимизированный вывод ASM_after.s
соответствует хорошо известному reference_ASM_after.s
. Я ищу способ сделать это без необходимости "декомпилировать" ASM_before.s
на высокоуровневый язык и затем скомпилировать его (с оптимизацией) до ASM_after.s
.