https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107273
--- Comment #9 from Andrew Macleod <amacleod at redhat dot com> --- Working on it. Looks like an 8 bit value somehow got considered as a 32 bit partial equivalence. _8 = -_7; _9 = (int) _8; h_30 = (char) _9; <..> h_30 is an 8 bit slice of _9, yet : This is ok: Checking Partial equiv ( pe32 ) _8 CACHE: BB 11 DOM query for _8, found [irange] unsigned int [1, +INF] NONZERO 0xfffffffa at BB10 CACHE: Range for DOM returns : [irange] unsigned int [1, +INF] NONZERO 0xfffffffa but this is not: Checking Partial equiv ( pe32 ) h_30 CACHE: BB 11 DOM query for h_30, found [irange] char VARYING at BB10 CACHE: Range for DOM returns : [irange] char VARYING Partial equiv update! : h_30 has range : [irange] int [-128, 127] refining range to :[irange] int [-128, -1][1, 127] NONZERO 0xfffffffa That changed the value of _9 in an incorrect way. h_30 is a char, that should be pe8, and as that is smaller than the 32 bits in _9, that value should have been rejected. THis is occurring during the path_ranger used by threading, still working on figuring where the root issue lies.