Генерирование кода LLVM vs GCC MIPS, какие-нибудь тесты? - PullRequest
7 голосов
/ 08 января 2009

Мне интересно узнать, что такое «лучший» компилятор free / OSS для кода MIPS, GCC или LLVM, или есть что-нибудь еще лучше, чем эти?

Мне интересно узнать больше о быстром генерируемом ассемблерном коде с ограничением памяти, чем о размере кода.

Другими словами, выполняет ли llvm-opt работу лучше, чем gcc -O3?

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

http://www.phoronix.com/scan.php?page=news_item&px=OTI1MA «Кандидат на выпуск 2 LLVM 2.9 уже здесь»

Автор: Michael Larabel, 25 марта 2011 г. нет эталонных тестов LLVM ARM из-за отсутствия аппаратного обеспечения ... "

возможно, кто-то с быстрой корой с двумя / четырьмя руками и LLVM ARM и т.д. может запустить http://openbenchmarking.org/ скамью до понедельника, и Майкл может добавить это к своим другим результатам

1 голос
/ 21 июля 2009

Я не знаю о mips, я пробовал ARM, и код llvm был примерно на 10-20% медленнее, чем текущий gcc. Тесты, о которых идет речь, были основаны на zlib. декомпрессия сама по себе и компрессия затем декомпрессия. использовал оба clang и llvm-gcc. Я предпочел clang, потому что на самом деле -m32 работает на 64-битном хосте. Для данного теста я обнаружил, что НЕ использование -O2 (или -O3) дает самый быстрый код. связал модули байт-кода в один большой модуль и выполнил один выбор со стандартными оптимизациями, чтобы получить самый быстрый код. по умолчанию было -O2, и это помогало производительности.

EDIT:

Интересный тест между gcc и llvm / clang для mips.

void dummy ( unsigned int );
void dowait ( void )
{
    unsigned int ra;
    for(ra=0x80000;ra;ra--) dummy(ra);
}

gcc произведено:

9d006034 <dowait>:
9d006034:   27bdffe8    addiu   sp,sp,-24
9d006038:   afb00010    sw  s0,16(sp)
9d00603c:   afbf0014    sw  ra,20(sp)
9d006040:   3c100008    lui s0,0x8
9d006044:   02002021    move    a0,s0
9d006048:   0f40180a    jal 9d006028 <dummy>
9d00604c:   2610ffff    addiu   s0,s0,-1
9d006050:   1600fffd    bnez    s0,9d006048 <dowait+0x14>
9d006054:   02002021    move    a0,s0
9d006058:   8fbf0014    lw  ra,20(sp)
9d00605c:   8fb00010    lw  s0,16(sp)
9d006060:   03e00008    jr  ra
9d006064:   27bd0018    addiu   sp,sp,24

и llvm после сборки

9d006034 <dowait>:
9d006034:   27bdffe8    addiu   sp,sp,-24
9d006038:   afbf0014    sw  ra,20(sp)
9d00603c:   afb00010    sw  s0,16(sp)
9d006040:   3c020008    lui v0,0x8
9d006044:   34440000    ori a0,v0,0x0
9d006048:   2490ffff    addiu   s0,a0,-1
9d00604c:   0f40180a    jal 9d006028 <dummy>
9d006050:   00000000    nop
9d006054:   00102021    addu    a0,zero,s0
9d006058:   1600fffb    bnez    s0,9d006048 <dowait+0x14>
9d00605c:   00000000    nop
9d006060:   8fb00010    lw  s0,16(sp)
9d006064:   8fbf0014    lw  ra,20(sp)
9d006068:   27bd0018    addiu   sp,sp,24
9d00606c:   03e00008    jr  ra
9d006070:   00000000    nop

Я говорю после сборки, потому что видел gnu-as, что-то вроде этого

.globl PUT32
PUT32:
    sw $a1,0($a0)
    jr $ra
    nop

и переустановите сборку для меня:

9d00601c <PUT32>:
9d00601c:   03e00008    jr  ra
9d006020:   ac850000    sw  a1,0(a0)
9d006024:   00000000    nop

Разница между кодом, создаваемым llvm и gcc, заключается в размещении инструкций в слоте отсрочки ветвления. Я использовал clang и llc для создания выходных данных сборки, затем использовал binutils, gnu as, для создания двоичного файла. Так что любопытно, что для моей руки собран код:

ori $sp,$sp,0x2000
jal notmain
nop

оптимизировано для меня:

9d006004:   0f401820    jal 9d006080 <notmain>
9d006008:   37bd2000    ori sp,sp,0x2000
9d00600c:   00000000    nop

но код, сгенерированный ООО

addiu   $16, $4, -1
jal dummy
nop

не было

9d006048:   2490ffff    addiu   s0,a0,-1
9d00604c:   0f40180a    jal 9d006028 <dummy>
9d006050:   00000000    nop
0 голосов
/ 09 апреля 2009

LLVM обычно лучше, чем GCC на x86, но я не нашел никаких тестов для MIPS. Поскольку вы задаете этот вопрос, я предполагаю, что у вас есть доступ к машине MIPS, поэтому почему бы вам не скомпилировать код Game C Benchmarks Computer Language Benchmarks *1002* с GCC и LLVM и посмотреть, что быстрее. Я предполагаю, что GCC будет, так как бэкэнд MIPS относительно новый, но код намного чище, и я ожидаю, что LLVM в конечном итоге победит.

...