http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55869
Bug #: 55869 Summary: different bit shift/or optimization. Classification: Unclassified Product: gcc Version: 4.8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: pl...@agmk.net here're equvialent functions: $ cat u.cpp unsigned long long convert_1( bool flag ) { return (unsigned long long)(flag ? 1ull : 0ull) << 57; } unsigned long long convert_2( bool flag ) { return (unsigned long long)flag << 57; } current 4.7/4.8 gcc emits following different machine code: _Z9convert_1b: testb %dil, %dil # 29 *cmpqi_ccno_1/1 [length = 3] movl $0, %edx # 32 *movdi_internal_rex64/1 [length = 5] movabsq $144115188075855872, %rax # 28 *movdi_internal_rex64/3 [length = 10] cmove %rdx, %rax # 31 *movdicc_noc/1 [length = 4] ret # 39 simple_return_internal [length = 1] _Z9convert_2b: movq %rdi, %rax # 19 *movdi_internal_rex64/2 [length = 3] salq $57, %rax # 8 *ashldi3_1/1 [length = 4] ret # 27 simple_return_internal [length = 1] while clang/llvm emits equivalent machine code for both functions: _Z9convert_1b: # @_Z9convert_1b movzbl %dil, %eax shlq $57, %rax ret _Z9convert_2b: # @_Z9convert_2b movzbl %dil, %eax shlq $57, %rax ret