Testing a Code-Generator Optimization

Я написал низкоуровневую оптимизацию для бэкенда LLVM code-generator. В основном, оптимизация будет переупорядочивать инструкции сборки на уровне базовых блоков, чтобы позволить более поздней (существующей) оптимизации более эффективно оптимизировать результирующий код. Есть ряд тестовых примеров, которые я хотел бы проверить, и я хотел бы получить некоторые предложения по процессу тестирования, поскольку я впервые пытаюсь сделать что-то подобное.

То, что я рассматривал до сих пор:

  1. Компиляция эталонных примеров, написанных на C, и изучение полученного ASM, сгенерированного с помощью опции -S. Я сделал это и сравнил результаты с моей оптимизацией с исходными результатами. Этот метод позволяет мне увидеть, что моя оптимизация работает, но даже если я напишу пользовательские неисполняемые файлы C, я не смогу исследовать все желаемые тестовые случаи упорядочивания инструкций.

  2. Скомпилировать эталоны в LLVM-ассемблер, отредактировать его, затем опустить ASM до ассемблера целевой машины. Это может сработать, но из-за разного уровня абстракции между LLVM и целевым ASM я сомневаюсь, что смогу изучить все тестовые случаи, взламывая LLVM ASM, пока он не сгенерирует то, что я хочу.

  3. Использовать тестовые примеры целевого 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.

19
задан Zeke 3 June 2011 в 17:19
поделиться