[Bug regression/44281] Global Register variable pessimisation and regression
adam at consulting dot net dot nz
gcc-bugzilla@gcc.gnu.org
Mon Jun 7 05:36:00 GMT 2010
------- Comment #1 from adam at consulting dot net dot nz 2010-06-07 05:35 -------
Example-specific workaround discovered for global register variable
pessimisation with recent versions of GCC:
void push_flag_into_global_reg_var(uint64_t a, uint64_t b) {
uint64_t flag = (a==b);
global_flag_stack <<= 8;
__asm__ __volatile__("" : : : "memory"); /* ??? */
global_flag_stack |= flag;
}
Every version of GCC tested (including gcc (Debian 20100530-1) 4.6.0 20100530
(experimental) [trunk revision 160047]) produces similarly compact code:
0000000000400494 <push_flag_into_global_reg_var>:
400494: 48 c1 e3 08 shl rbx,0x8
400498: 31 c0 xor eax,eax
40049a: 48 39 f7 cmp rdi,rsi
40049d: 0f 94 c0 sete al
4004a0: 48 09 c3 or rbx,rax
4004a3: c3 ret
Telling the compiler that memory may have changed between global register
variable assignments seems to have coaxed the compiler into treating the global
register variable as volatile.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44281
More information about the Gcc-bugs
mailing list