https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105329
Aldy Hernandez <aldyh at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |aldyh at gcc dot gnu.org --- Comment #4 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- (In reply to Andrew Macleod from comment #3) > p vr.dump(stderr) > const size_type [1, 9223372036854775807] > > I also have a breakpoint in set_range_info for this name which hasn't been > triggered. So either the set routine have been bypassed or perhaps > inlining is setting this global value? > > Im still trying to figure out who and where has decided that __nleft_49 is > [2, 0x7FFFFFFFFFFFFFFF] instead of [2, 0xFFFFFFFFFFFFFFFFFFFF] Global ranges can also be set via duplicate_ssa_name_range_info, which is used by the inliner. It looks like [1, 9223372036854775807] was originally calculated in evrp for __nleft_64: =========== BB 45 ============ Imports: _27 __s_53(D) Exports: _27 _34 __s_53(D) __nleft_64 _34 : _27(I) __s_53(D)(I) __nleft_64 : _27(I) _34 __s_53(D)(I) _27 char * [1B, -2B] __s_53(D) const char * [0B, -3B] Relational : (__s_53(D) < _26) Relational : (_27 > __s_53(D)) <bb 45> : _34 = _27 - __s_53(D); __nleft_64 = (const size_type) _34; if (_34 == 1) goto <bb 46>; [34.00%] else goto <bb 47>; [66.00%] _34 : long int [1, +INF] __nleft_64 : long unsigned int [1, 9223372036854775807] 45->46 (T) _27 : char * [1B, -2B] 45->46 (T) _34 : long int [1, 1] 45->46 (T) __s_53(D) : const char * [0B, -3B] 45->46 (T) __nleft_64 : long unsigned int [1, 9223372036854775807] 45->47 (F) _27 : char * [1B, -2B] 45->47 (F) _34 : long int [2, +INF] 45->47 (F) __s_53(D) : const char * [0B, -3B] 45->47 (F) __nleft_64 : long unsigned int [1, 9223372036854775807] This was later renamed to __nleft_40, and then copied by the IPA inliner to __nleft_47 and ultimately to __nleft_49.