reg->s32_max_value = min_t(s32, reg->s32_max_value, (s32)reg->smax_value);
                }
        }
+       /* Special case where upper bits form a small sequence of two
+        * sequential numbers (in 32-bit unsigned space, so 0xffffffff to
+        * 0x00000000 is also valid), while lower bits form a proper s32 range
+        * going from negative numbers to positive numbers. E.g., let's say we
+        * have s64 range [-1, 1] ([0xffffffffffffffff, 0x0000000000000001]).
+        * Possible s64 values are {-1, 0, 1} ({0xffffffffffffffff,
+        * 0x0000000000000000, 0x00000000000001}). Ignoring upper 32 bits,
+        * we still get a valid s32 range [-1, 1] ([0xffffffff, 0x00000001]).
+        * Note that it doesn't have to be 0xffffffff going to 0x00000000 in
+        * upper 32 bits. As a random example, s64 range
+        * [0xfffffff0fffffff0; 0xfffffff100000010], forms a valid s32 range
+        * [-16, 16] ([0xfffffff0; 0x00000010]) in its 32 bit subregister.
+        */
+       if ((u32)(reg->umin_value >> 32) + 1 == (u32)(reg->umax_value >> 32) &&
+           (s32)reg->umin_value < 0 && (s32)reg->umax_value >= 0) {
+               reg->s32_min_value = max_t(s32, reg->s32_min_value, (s32)reg->umin_value);
+               reg->s32_max_value = min_t(s32, reg->s32_max_value, (s32)reg->umax_value);
+       }
+       if ((u32)(reg->smin_value >> 32) + 1 == (u32)(reg->smax_value >> 32) &&
+           (s32)reg->smin_value < 0 && (s32)reg->smax_value >= 0) {
+               reg->s32_min_value = max_t(s32, reg->s32_min_value, (s32)reg->smin_value);
+               reg->s32_max_value = min_t(s32, reg->s32_max_value, (s32)reg->smax_value);
+       }
        /* if u32 range forms a valid s32 range (due to matching sign bit),
         * try to learn from that
         */