int need_pfx = ((spec.flags & SPECIAL) && spec.base != 10);
        int i;
        bool is_zero = num == 0LL;
+       int field_width = spec.field_width;
+       int precision = spec.precision;
 
        BUILD_BUG_ON(sizeof(struct printf_spec) != 8);
 
                if ((signed long long)num < 0) {
                        sign = '-';
                        num = -(signed long long)num;
-                       spec.field_width--;
+                       field_width--;
                } else if (spec.flags & PLUS) {
                        sign = '+';
-                       spec.field_width--;
+                       field_width--;
                } else if (spec.flags & SPACE) {
                        sign = ' ';
-                       spec.field_width--;
+                       field_width--;
                }
        }
        if (need_pfx) {
                if (spec.base == 16)
-                       spec.field_width -= 2;
+                       field_width -= 2;
                else if (!is_zero)
-                       spec.field_width--;
+                       field_width--;
        }
 
        /* generate full string in tmp[], in reverse order */
        }
 
        /* printing 100 using %2d gives "100", not "00" */
-       if (i > spec.precision)
-               spec.precision = i;
+       if (i > precision)
+               precision = i;
        /* leading space padding */
-       spec.field_width -= spec.precision;
+       field_width -= precision;
        if (!(spec.flags & (ZEROPAD | LEFT))) {
-               while (--spec.field_width >= 0) {
+               while (--field_width >= 0) {
                        if (buf < end)
                                *buf = ' ';
                        ++buf;
        if (!(spec.flags & LEFT)) {
                char c = ' ' + (spec.flags & ZEROPAD);
                BUILD_BUG_ON(' ' + ZEROPAD != '0');
-               while (--spec.field_width >= 0) {
+               while (--field_width >= 0) {
                        if (buf < end)
                                *buf = c;
                        ++buf;
                }
        }
        /* hmm even more zero padding? */
-       while (i <= --spec.precision) {
+       while (i <= --precision) {
                if (buf < end)
                        *buf = '0';
                ++buf;
                ++buf;
        }
        /* trailing space padding */
-       while (--spec.field_width >= 0) {
+       while (--field_width >= 0) {
                if (buf < end)
                        *buf = ' ';
                ++buf;