/* Uses signed min/max values to inform unsigned, and vice-versa */
 static void __reg32_deduce_bounds(struct bpf_reg_state *reg)
 {
+       /* if u32 range forms a valid s32 range (due to matching sign bit),
+        * try to learn from that
+        */
+       if ((s32)reg->u32_min_value <= (s32)reg->u32_max_value) {
+               reg->s32_min_value = max_t(s32, reg->s32_min_value, reg->u32_min_value);
+               reg->s32_max_value = min_t(s32, reg->s32_max_value, reg->u32_max_value);
+       }
        /* Learn sign from signed bounds.
         * If we cannot cross the sign boundary, then signed and unsigned bounds
         * are the same, so combine.  This works even in the negative case, e.g.