LLVM по сравнению с генерацией кода MIPS GCC, какими-либо сравнительными тестами?

Я решил свою проблему. Я использовал height: 1px; для родителя. И height: 100%; работает хорошо для ребенка сейчас. Я думаю, что в моем случае flex-grow: 1; ведет себя так же, как и min-height: 100%;, поэтому height: 1px; помог мне решить мою проблему.

:host {
  flex-grow: 1;
  height: 1px; /* Required to make the child 100% of the flex-grow: 1 */
}
.jobs-table {
  height: 100%;
}
7
задан Paulo Lopes 8 January 2009 в 11:55
поделиться

2 ответа

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

-1
ответ дан 7 December 2019 в 18:46
поделиться

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

РЕДАКТИРОВАТЬ:

Интересный тест между 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

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

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

не был

9d006048:   2490ffff    addiu   s0,a0,-1
9d00604c:   0f40180a    jal 9d006028 <dummy>
9d006050:   00000000    nop
1
ответ дан 7 December 2019 в 18:46
поделиться