【问题标题】:Reduce clang-generated code size for ARM减少 ARM 的 clang 生成的代码大小
【发布时间】:2016-02-18 11:59:06
【问题描述】:

我比较了clang生成的代码和gcc for arm生成的代码。

不幸的是,gcc 的代码通常包含更少的指令。 我只是好奇 - 是否可以减少由 clang 生成的代码? 也许我应该使用一些选项来这样做......

请考虑一个非常简单的例子:

> cat test.c
int to_upper(int c)  
{  
   if(c < 'a' || c > 'z') return c; 
   else return c - ('a' - 'A');  
}

> clang -target arm-none-eabi -Oz -c -mthumb -mcpu=cortex-m0 -msoft-float ./test.c -o ./clang_test.o 
> /usr/bin/arm-none-eabi-gcc -Os -c -mthumb -mcpu=cortex-m0 -msoft-float ./test.c -o ./gcc_test.o 

> /usr/bin/arm-none-eabi-objdump -d ./clang_test.o 
./clang_test.o:     file format elf32-littlearm 
Disassembly of section .text: 
00000000 <to_upper>: 
   0:   4602        mov r2, r0 
   2:   3a61        subs    r2, #97 ; 0x61 
   4:   4601        mov r1, r0 
   6:   3920        subs    r1, #32 
   8:   2a19        cmp r2, #25 
   a:   d800        bhi.n   e <to_upper+0xe>
   c:   4608        mov r0, r1 
   e:   4770        bx  lr 

> /usr/bin/arm-none-eabi-objdump -d ./gcc_test.o 
./gcc_test.o:     file format elf32-littlearm 
Disassembly of section .text: 
00000000 <to_upper>: 
   0:   1c03        adds    r3, r0, #0 
   2:   3b61        subs    r3, #97 ; 0x61 
   4:   2b19        cmp r3, #25 
   6:   d800        bhi.n   a <to_upper+0xa>
   8:   3820        subs    r0, #32 
   a:   4770        bx  lr 

为什么这么简单的代码差别这么大? 在这种情况下,clang 可以生成更少的代码吗?至少和gcc一样?

注意:如果我们将 cpu 更改为 -mcpu=cortex-a5(其他选项保持不变),则 clang ang gcc 生成 完全相同的代码:

00000000 <to_upper>: 
   0:   f1a0 0361 sub.w r3, r0, #97 ; 0x61 
   4:   2b19        cmp r3, #25 
   6:   bf98        it  ls 
   8:   3820        subls   r0, #32 
   a:   4770        bx  lr 

操作系统:Ubuntu 14.04.3

clang 版本 3.7.1 (tags/RELEASE_371/final) 目标:x86_64-unknown-linux-gnu 线程模型:posix

arm-none-eabi-gcc (4.8.2-14ubuntu1+6) 4.8.2

【问题讨论】:

  • 这很有趣。你应该报告一个错误。
  • Cortex-A5 默认不是 thumb2。它是一个与 M0 非常不同的架构。 M0 甚至不支持所有的 T2 指令。
  • 有什么理由不把函数写成int to_upper (int c) { if(c &lt; 'a' || c &gt; 'z') return c; else return c - ('a' - 'A'); }
  • 没有理由。不幸的是,生成的代码没有改变。顺便说一下,这是一个遗留代码库。
  • 这是我的意思,我发布的代码将产生相同的机器代码。它更具可读性。

标签: c gcc arm clang


【解决方案1】:

不,在这种情况下,clang 不能生成更少的代码。在许多其他方面也是如此。

从历史上看,在 LLVM 中实现的代码大小优化很少。在优化代码大小时,GCC 通常明显优于 LLVM。

Here presentation,仔细研究了 GCC 和 Clang 在代码大小优化方面的比较。

Presentation video

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多