1 typedef unsigned long long uint64_t; 2 void f(uint64_t *a, uint64_t aa) __attribute__((noinline)); f(uint64_t * a,uint64_t aa)3void f(uint64_t *a, uint64_t aa) 4 { 5 uint64_t new_value = aa; 6 uint64_t old_value = *a; 7 int bit_size = 32; 8 uint64_t mask = (uint64_t)(unsigned)(-1); 9 uint64_t tmp = old_value & mask; 10 new_value &= mask; 11 /* On overflow we need to add 1 in the upper bits */ 12 if (tmp > new_value) 13 new_value += 1ull<<bit_size; 14 /* Add in the upper bits from the old value */ 15 new_value += old_value & ~mask; 16 *a = new_value; 17 } main(void)18int main(void) 19 { 20 uint64_t value, new_value, old_value; 21 value = 0x100000001; 22 old_value = value; 23 new_value = (value+1)&(uint64_t)(unsigned)(-1); 24 f(&value, new_value); 25 if (value != old_value+1) 26 __builtin_abort (); 27 return 0; 28 } 29 30