Set "overflow" bit upon encountering it instead of postponing to the end
of the conversion. Somehow gcc unwedges itself and generates better code:

        $ ./scripts/bloat-o-meter ../vmlinux-000 ../obj/vmlinux
        _parse_integer                      177     139     -38

Inspired by patch from Zhaoxiu Zeng.

Signed-off-by: Alexey Dobriyan <[email protected]>
---

 lib/kstrtox.c |    6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

--- a/lib/kstrtox.c
+++ b/lib/kstrtox.c
@@ -48,11 +48,9 @@ unsigned int _parse_integer(const char *s, unsigned int 
base, unsigned long long
 {
        unsigned long long res;
        unsigned int rv;
-       int overflow;
 
        res = 0;
        rv = 0;
-       overflow = 0;
        while (*s) {
                unsigned int val;
 
@@ -71,15 +69,13 @@ unsigned int _parse_integer(const char *s, unsigned int 
base, unsigned long long
                 */
                if (unlikely(res & (~0ull << 60))) {
                        if (res > div_u64(ULLONG_MAX - val, base))
-                               overflow = 1;
+                               rv |= KSTRTOX_OVERFLOW;
                }
                res = res * base + val;
                rv++;
                s++;
        }
        *p = res;
-       if (overflow)
-               rv |= KSTRTOX_OVERFLOW;
        return rv;
 }
 

Reply via email to