LLVM与GCC MIPS代码生成,任何基准测试?

时间:2009-01-08 11:55:21

标签: gcc assembly benchmarking mips llvm

我有兴趣知道什么是MIPS代码,GCC或LLVM的“最佳”免费/ OSS编译器,还是有什么比那些更好?

我有兴趣了解有关快速和内存受限生成的汇编代码的更多信息,而不是代码大小。

换句话说,llvm-opt是否比gcc -O3更好地完成工作?

3 个答案:

答案 0 :(得分:2)

http://www.phoronix.com/scan.php?page=news_item&px=OTI1MA “LLVM 2.9 Release Candidate 2就在这里

Michael Larabel于2011年3月25日发表 由于缺少硬件而没有LLVM ARM基准......“

也许有一个拥有快速双/四臂皮质和LLVM ARM等的人可以在星期一之前运行http://openbenchmarking.org/替补,迈克尔可以将这些添加到他的其他结果

答案 1 :(得分:1)

我不知道mips,我试过ARM和llvm代码比当前的gcc慢大约10-20%。有问题的测试是基于zlib的。一个解压缩本身和一个压缩然后解压缩。同时使用了clang和llvm-gcc。我更喜欢clang,因为-m32实际上可以在64位主机上运行。对于有问题的测试,我发现不使用-O2(或-O3)产生最快的代码。将字节码模块链接到一个大模块,并使用标准优化执行一个选项,以获得最快的代码。有限责任公司默认为-O2,这确实有助于提升绩效。

编辑:

mcc与llvm / clang之间的有趣测试。

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-就像这样的事情

.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

答案 2 :(得分:-1)

在x86上,LLVM通常比GCC更好,但我没有找到MIPS的任何基准。因为你问这个问题,我假设你有权访问MIPS机器,所以为什么不用GCC和LLVM编译Computer Language Benchmarks Game C code,看看哪个更快。我猜GCC会是,因为MIPS后端相对较新,但代码更清晰,我希望LLVM最终获胜。