1119482Sobrientypedef unsigned long long uint64_t; 240269Srnordiervoid f(uint64_t *a, uint64_t aa) __attribute__((noinline)); 340269Srnordiervoid f(uint64_t *a, uint64_t aa) 440269Srnordier{ 540269Srnordier uint64_t new_value = aa; 640269Srnordier uint64_t old_value = *a; 740269Srnordier int bit_size = 32; 840269Srnordier uint64_t mask = (uint64_t)(unsigned)(-1); 940269Srnordier uint64_t tmp = old_value & mask; 1040269Srnordier new_value &= mask; 1140269Srnordier /* On overflow we need to add 1 in the upper bits */ 1240269Srnordier if (tmp > new_value) 1340269Srnordier new_value += 1ull<<bit_size; 1440269Srnordier /* Add in the upper bits from the old value */ 1540269Srnordier new_value += old_value & ~mask; 16119482Sobrien *a = new_value; 17119482Sobrien} 1840269Srnordierint main(void) 1940269Srnordier{ 2040269Srnordier uint64_t value, new_value, old_value; 21104272Sphk value = 0x100000001; 2240269Srnordier old_value = value; 23122463Sbde new_value = (value+1)&(uint64_t)(unsigned)(-1); 24122463Sbde f(&value, new_value); 2540269Srnordier if (value != old_value+1) 2676224Sobrien __builtin_abort (); 2740269Srnordier return 0; 2840269Srnordier} 2940269Srnordier 3040269Srnordier