Let's assume there's the following code:
#include <stdbool.h>
typedef struct {
bool a;
bool b;
} MyStruct2;
bool g(MyStruct2 *s) {
return s->a || s->b;
}
bool g2(MyStruct2 *s) {
return s->a | s->b;
}
int main() {
return 0;
}
Which compiles into this:
g:
movzx eax, BYTE PTR [rdi]
test al, al
jne .L1
movzx eax, BYTE PTR [rdi+1]
.L1:
ret
g2:
movzx eax, BYTE PTR [rdi]
or al, BYTE PTR [rdi+1]
ret
main:
xor eax, eax
ret
g2
seems to be shorter and it does not include any jump. So why does gcc not optimize g
to the same code as g2
? None of the members of MyStruct2
is volatile (or otherwise special), so it should be safe to evaluate s->b
in g
in all cases (even if s->a
is true and it would not be required to evaluate s->b
).
Why doesnt gcc produce the shorter code without a jump?
Thanks