Ara*_*ane 0 optimization performance arm branch-prediction
我在Cortex-R4中运行的C代码中进行优化.首先,当我在条件检查中指出"__builtin_expect"时,我没有看到汇编代码输出有任何变化.似乎编译器生成了不必要的跳转.
我的C代码:
bit ++; (Likely)
if(__builtin_expect(bit >= 32),0)
{
bit -=32; // unlikely code
xxxxxx; // unlikely code
xxxxxx; // unlikely code
xxxxxx; // unlikely code
}
bit = bit*2 // something (Likely)
return bit;
Run Code Online (Sandbox Code Playgroud)
----生成的ASM代码--------(位=> r0)
ADD r2,r2,#1
CMP r0,#0x20
BCC NoDecrement
SUB r0,r0,#0x20
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
NoDecrement LSL r0,r0,#1
BX lr
Run Code Online (Sandbox Code Playgroud)
----我期望的ASM代码--------
ADD r2,r2,#1
CMP r0,#0x20
BHE Decrement
JumbBack LSL r0,r0,#1
BX lr
Decrement SUB r0,r0,#0x20
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
B JumbBack
Run Code Online (Sandbox Code Playgroud)
假设这段C代码在循环中运行,那么每次都必须跳转(因为if条件只传递一次).是否有任何其他编译器设置实际上,按预期生成代码.. ??
你写了:
if(__builtin_expect(bit >= 32),0)
{
...
}
Run Code Online (Sandbox Code Playgroud)
花括号内的代码永远不会被执行,因为它被包围的if(foo,0)内容相当于if(0)任何值foo,无论你想要使用什么内置.如果你打开优化-O2,你会发现编译器完全删除了死代码,而不是只是跳过它.我想你可能想写
if (__builtin_expect(bit >= 32, 0)) {
bit -= 32;
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我会得到我期望的正向分支(有clang -O1或更高).
extern void something();
int foo(int bit)
{
++bit;
if (__builtin_expect(bit >= 32, 0)) {
bit -= 32; // "Decrement"
something();
}
bit = bit*2;
something();
return bit;
}
Run Code Online (Sandbox Code Playgroud)
这是以下代码clang -arch armv7 -O2 -S:
_foo:
@ BB#0:
push {r4, r7, lr}
adds r4, r0, #1
add r7, sp, #4
cmp r4, #32
bge LBB0_2 // a forward branch for the unlikely case
LBB0_1:
lsls r4, r4, #1
blx _something
mov r0, r4
pop {r4, r7, pc}
LBB0_2: // "Decrement"
sub.w r4, r0, #31
blx _something
b LBB0_1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |