lib/kstrtox.c: smaller _parse_integer()
authorAlexey Dobriyan <adobriyan@gmail.com>
Tue, 11 Oct 2016 20:51:32 +0000 (13:51 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 11 Oct 2016 22:06:30 +0000 (15:06 -0700)
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.

Link: http://lkml.kernel.org/r/20160826221920.GA1909@p183.telecom.by
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib/kstrtox.c

index d8a5cf66c316fe21eaecee8d973deac1eb3bd5d7..b8e2080c1a47a24a14c9618cd0dac5e4da0c0c67 100644 (file)
@@ -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;
 }