Both GCC and Clang are obsessed with constant / value range propagation. Unfortunately they are far too stupid to actually apply such optimizations appropriately. A common pattern that both compilers completely fuck up is testing a pointer for NULL and then returning NULL. Now anyone who is not completely retarded would realize that they had a nice NULL already sitting in the register and just return that but these so called smart optimizing compilers are so fucking stupid they explicitly set the register to NULL even though it was already NULL. This is only one example of hundreds of cases where the compiler does really retarded shit that even a literal retard would not do. Fuck, I spend more time fighting the stupid compiler than actually being productive. I have heard people say that modern compilers produce better assembly than humans but this is the biggest lump of shit that has ever been spouted from someones mouth. It would not be so bad if these issues happened only occasionally, but no, almost every function is effected and it drives me mental. Fix your stupid compilers.
void* test(void); void* test2(void) { void* tmp = test(); if(tmp == NULL) return tmp; return test(); }
Output of GCC and Clang
test2: call test testl %eax, %eax je .L1 jmp test .L1: xorl %eax, %eax ret
Output of MSVC for comparison.
This is how it should be compiled.
_test2 PROC call _test test eax, eax jne SHORT $LN2@test2 ret 0 $LN2@test2: jmp _test