clang -O3
优化此代码:
_Bool f1(char x)
{
_Bool b1 = x == 4;
_Bool b2 = x & 3;
return b1 & b2;
}
:
f1:
xor eax, eax
ret
然而,clang -O3
并没有优化这段代码:
_Bool f1(char x)
{
_Bool b1 = x == 2;
_Bool b2 = x & 1;
return b1 & b2;
}
f1:
cmp dil, 2
sete al
and al, dil
ret
为什么?
注:&
b1 & b2
是有意使用的。如果使用&&
,则clang -O3
将其优化为:
f1:
xor eax, eax
ret
如何解释?
为什么?
低效的代码生成(由于"缺少按位逻辑的窄化转换")。