int tabit(char *buf1, char *buf2) {
  char *bp, *ptr;
  int j, k;
  bp = buf2;
  ptr = buf1;
  for (j = 0; *ptr && *ptr != '\n'; ++ptr, ++bp, j = (j + 1) & 7) {
    *bp = *ptr;
    if (*ptr == '\t') {
      while (j > 0 && bp[-1] == ' ') {
        bp--;
        j--;
      }
      j = 0;
      *bp = '\t';
    }
    if (j == 7 && *bp == ' ' && bp[-1] == ' ') {
      k = j;
      while (k-- >= 0 && *bp == ' ')
        --bp;
      *++bp = '\t';
    }
  }
  while (bp != buf2 && (bp[-1] == ' ' || bp[-1] == '\t'))
    --bp;
  *bp++ = '\n';
  *bp = '\0';
  return (int)(bp - buf2);
}


x86 assembly (clang, -O0):
<tabit>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x29(%rbp)
je     1148 <tabit+0x48>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
setne  %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    1158 <tabit+0x58>
jmp    128d <tabit+0x18d>
mov    -0x20(%rbp),%rax
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
jne    11d1 <tabit+0xd1>
jmp    1179 <tabit+0x79>
xor    %eax,%eax
cmpl   $0x0,-0x24(%rbp)
mov    %al,-0x2a(%rbp)
jle    1199 <tabit+0x99>
mov    -0x18(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x20,%eax
sete   %al
mov    %al,-0x2a(%rbp)
mov    -0x2a(%rbp),%al
test   $0x1,%al
jne    11a9 <tabit+0xa9>
jmp    11c3 <tabit+0xc3>
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
jmp    1179 <tabit+0x79>
movl   $0x0,-0x24(%rbp)
mov    -0x18(%rbp),%rax
movb   $0x9,(%rax)
cmpl   $0x7,-0x24(%rbp)
jne    125f <tabit+0x15f>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
jne    125f <tabit+0x15f>
mov    -0x18(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x20,%eax
jne    125f <tabit+0x15f>
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    %ecx,%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x2b(%rbp)
jl     122b <tabit+0x12b>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
sete   %al
mov    %al,-0x2b(%rbp)
mov    -0x2b(%rbp),%al
test   $0x1,%al
jne    123b <tabit+0x13b>
jmp    124c <tabit+0x14c>
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    1202 <tabit+0x102>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x9,0x1(%rax)
jmp    1264 <tabit+0x164>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
and    $0x7,%eax
mov    %eax,-0x24(%rbp)
jmp    1123 <tabit+0x23>
jmp    1292 <tabit+0x192>
mov    -0x18(%rbp),%rcx
xor    %eax,%eax
cmp    -0x10(%rbp),%rcx
mov    %al,-0x2c(%rbp)
je     12d2 <tabit+0x1d2>
mov    -0x18(%rbp),%rax
movsbl -0x1(%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x2d(%rbp)
je     12cc <tabit+0x1cc>
mov    -0x18(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%al
mov    %al,-0x2c(%rbp)
mov    -0x2c(%rbp),%al
test   $0x1,%al
jne    12e2 <tabit+0x1e2>
jmp    12f3 <tabit+0x1f3>
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    1292 <tabit+0x192>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0xa,(%rax)
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<tabit>:
xor    %edx,%edx
mov    %rsi,%rcx
jmp    111e <tabit+0x1e>
mov    %rax,%rcx
movb   $0x9,(%rcx)
mov    %r9d,%edx
add    $0x1,%rdi
add    $0x1,%rcx
add    $0x1,%edx
and    $0x7,%edx
movzbl (%rdi),%eax
test   %al,%al
je     1253 <tabit+0x153>
cmp    $0xa,%al
je     1253 <tabit+0x153>
mov    %al,(%rcx)
cmpb   $0x9,(%rdi)
jne    11d0 <tabit+0xd0>
xor    %r9d,%r9d
test   %edx,%edx
je     110a <tabit+0xa>
cmpb   $0x20,-0x1(%rcx)
jne    110a <tabit+0xa>
lea    -0x1(%rcx),%rax
cmp    $0x2,%edx
jb     1107 <tabit+0x7>
cmpb   $0x20,-0x2(%rcx)
jne    1107 <tabit+0x7>
lea    -0x2(%rcx),%r8
cmp    $0x3,%edx
jb     121a <tabit+0x11a>
cmpb   $0x20,-0x3(%rcx)
jne    121a <tabit+0x11a>
lea    -0x3(%rcx),%r8
cmp    $0x4,%edx
jb     121a <tabit+0x11a>
cmpb   $0x20,-0x4(%rcx)
jne    121a <tabit+0x11a>
lea    -0x4(%rcx),%r8
cmp    $0x5,%edx
jb     121a <tabit+0x11a>
cmpb   $0x20,-0x5(%rcx)
jne    121a <tabit+0x11a>
lea    -0x5(%rcx),%r8
cmp    $0x6,%edx
jb     121a <tabit+0x11a>
cmpb   $0x20,-0x6(%rcx)
jne    121a <tabit+0x11a>
lea    -0x6(%rcx),%rax
cmp    $0x7,%edx
jne    1107 <tabit+0x7>
cmpb   $0x20,-0x7(%rcx)
jne    1107 <tabit+0x7>
add    $0xfffffffffffffff9,%rcx
jmp    110a <tabit+0xa>
nopl   0x0(%rax)
cmp    $0x7,%edx
jne    1110 <tabit+0x10>
mov    $0x7,%edx
cmp    $0x20,%al
jne    1110 <tabit+0x10>
cmpb   $0x20,-0x1(%rcx)
jne    1110 <tabit+0x10>
cmpb   $0x20,-0x2(%rcx)
jne    1222 <tabit+0x122>
cmpb   $0x20,-0x3(%rcx)
jne    1228 <tabit+0x128>
cmpb   $0x20,-0x4(%rcx)
jne    122e <tabit+0x12e>
cmpb   $0x20,-0x5(%rcx)
jne    1234 <tabit+0x134>
cmpb   $0x20,-0x6(%rcx)
jne    123a <tabit+0x13a>
cmpb   $0x20,-0x7(%rcx)
je     1240 <tabit+0x140>
add    $0xfffffffffffffff9,%rcx
jmp    1244 <tabit+0x144>
mov    %r8,%rcx
jmp    110a <tabit+0xa>
add    $0xfffffffffffffffe,%rcx
jmp    1244 <tabit+0x144>
add    $0xfffffffffffffffd,%rcx
jmp    1244 <tabit+0x144>
add    $0xfffffffffffffffc,%rcx
jmp    1244 <tabit+0x144>
add    $0xfffffffffffffffb,%rcx
jmp    1244 <tabit+0x144>
add    $0xfffffffffffffffa,%rcx
jmp    1244 <tabit+0x144>
add    $0xfffffffffffffff8,%rcx
add    $0x1,%rcx
mov    $0x7,%r9d
jmp    110a <tabit+0xa>
mov    %rsi,%rax
cmp    %rsi,%rcx
jne    1269 <tabit+0x169>
jmp    127d <tabit+0x17d>
nopl   (%rax)
add    $0xffffffffffffffff,%rcx
cmp    %rsi,%rcx
je     127a <tabit+0x17a>
movzbl -0x1(%rcx),%eax
cmp    $0x20,%al
je     1260 <tabit+0x160>
cmp    $0x9,%al
je     1260 <tabit+0x160>
mov    %rcx,%rax
jmp    127d <tabit+0x17d>
mov    %rsi,%rax
movw   $0xa,(%rax)
sub    %esi,%eax
add    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @tabit(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %3
store i8* %1, i8** %4
%9 = load i8*, i8** %4
store i8* %9, i8** %5
%10 = load i8*, i8** %3
store i8* %10, i8** %6
store i32 0, i32* %7
br label %11
11: ; preds = %84, %2
%12 = load i8*, i8** %6
%13 = load i8, i8* %12
%14 = sext i8 %13 to i32
%15 = icmp ne i32 %14, 0
br i1 %15, label %16, label %21
16: ; preds = %11
%17 = load i8*, i8** %6
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = icmp ne i32 %19, 10
br label %21
21: ; preds = %16, %11
%22 = phi i1 [ false, %11 ], [ %20, %16 ]
br i1 %22, label %23, label %92
23: ; preds = %21
%24 = load i8*, i8** %6
%25 = load i8, i8* %24
%26 = load i8*, i8** %5
store i8 %25, i8* %26
%27 = load i8*, i8** %6
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = icmp eq i32 %29, 9
br i1 %30, label %31, label %50
31: ; preds = %23
br label %32
32: ; preds = %43, %31
%33 = load i32, i32* %7
%34 = icmp sgt i32 %33, 0
br i1 %34, label %35, label %41
35: ; preds = %32
%36 = load i8*, i8** %5
%37 = getelementptr inbounds i8, i8* %36, i64 -1
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp eq i32 %39, 32
br label %41
41: ; preds = %35, %32
%42 = phi i1 [ false, %32 ], [ %40, %35 ]
br i1 %42, label %43, label %48
43: ; preds = %41
%44 = load i8*, i8** %5
%45 = getelementptr inbounds i8, i8* %44, i32 -1
store i8* %45, i8** %5
%46 = load i32, i32* %7
%47 = add nsw i32 %46, -1
store i32 %47, i32* %7
br label %32
48: ; preds = %41
store i32 0, i32* %7
%49 = load i8*, i8** %5
store i8 9, i8* %49
br label %50
50: ; preds = %48, %23
%51 = load i32, i32* %7
%52 = icmp eq i32 %51, 7
br i1 %52, label %53, label %83
53: ; preds = %50
%54 = load i8*, i8** %5
%55 = load i8, i8* %54
%56 = sext i8 %55 to i32
%57 = icmp eq i32 %56, 32
br i1 %57, label %58, label %83
58: ; preds = %53
%59 = load i8*, i8** %5
%60 = getelementptr inbounds i8, i8* %59, i64 -1
%61 = load i8, i8* %60
%62 = sext i8 %61 to i32
%63 = icmp eq i32 %62, 32
br i1 %63, label %64, label %83
64: ; preds = %58
%65 = load i32, i32* %7
store i32 %65, i32* %8
br label %66
66: ; preds = %77, %64
%67 = load i32, i32* %8
%68 = add nsw i32 %67, -1
store i32 %68, i32* %8
%69 = icmp sge i32 %67, 0
br i1 %69, label %70, label %75
70: ; preds = %66
%71 = load i8*, i8** %5
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 32
br label %75
75: ; preds = %70, %66
%76 = phi i1 [ false, %66 ], [ %74, %70 ]
br i1 %76, label %77, label %80
77: ; preds = %75
%78 = load i8*, i8** %5
%79 = getelementptr inbounds i8, i8* %78, i32 -1
store i8* %79, i8** %5
br label %66
80: ; preds = %75
%81 = load i8*, i8** %5
%82 = getelementptr inbounds i8, i8* %81, i32 1
store i8* %82, i8** %5
store i8 9, i8* %82
br label %83
83: ; preds = %80, %58, %53, %50
br label %84
84: ; preds = %83
%85 = load i8*, i8** %6
%86 = getelementptr inbounds i8, i8* %85, i32 1
store i8* %86, i8** %6
%87 = load i8*, i8** %5
%88 = getelementptr inbounds i8, i8* %87, i32 1
store i8* %88, i8** %5
%89 = load i32, i32* %7
%90 = add nsw i32 %89, 1
%91 = and i32 %90, 7
store i32 %91, i32* %7
br label %11
92: ; preds = %21
br label %93
93: ; preds = %113, %92
%94 = load i8*, i8** %5
%95 = load i8*, i8** %4
%96 = icmp ne i8* %94, %95
br i1 %96, label %97, label %111
97: ; preds = %93
%98 = load i8*, i8** %5
%99 = getelementptr inbounds i8, i8* %98, i64 -1
%100 = load i8, i8* %99
%101 = sext i8 %100 to i32
%102 = icmp eq i32 %101, 32
br i1 %102, label %109, label %103
103: ; preds = %97
%104 = load i8*, i8** %5
%105 = getelementptr inbounds i8, i8* %104, i64 -1
%106 = load i8, i8* %105
%107 = sext i8 %106 to i32
%108 = icmp eq i32 %107, 9
br label %109
109: ; preds = %103, %97
%110 = phi i1 [ true, %97 ], [ %108, %103 ]
br label %111
111: ; preds = %109, %93
%112 = phi i1 [ false, %93 ], [ %110, %109 ]
br i1 %112, label %113, label %116
113: ; preds = %111
%114 = load i8*, i8** %5
%115 = getelementptr inbounds i8, i8* %114, i32 -1
store i8* %115, i8** %5
br label %93
116: ; preds = %111
%117 = load i8*, i8** %5
%118 = getelementptr inbounds i8, i8* %117, i32 1
store i8* %118, i8** %5
store i8 10, i8* %117
%119 = load i8*, i8** %5
store i8 0, i8* %119
%120 = load i8*, i8** %5
%121 = load i8*, i8** %4
%122 = ptrtoint i8* %120 to i64
%123 = ptrtoint i8* %121 to i64
%124 = sub i64 %122, %123
%125 = trunc i64 %124 to i32
ret i32 %125
}

LLVM IR (-O2):
define i32 @tabit(i8* nocapture %0, i8* %1) {
%3 = ptrtoint i8* %1 to i64
br label %4
4: ; preds = %95, %2
%5 = phi i8* [ %1, %2 ], [ %99, %95 ]
%6 = phi i8* [ %0, %2 ], [ %98, %95 ]
%7 = phi i32 [ 0, %2 ], [ %101, %95 ]
%8 = load i8, i8* %6
switch i8 %8, label %9 [
i8 0, label %102
i8 10, label %102
]
9: ; preds = %4
store i8 %8, i8* %5
%10 = load i8, i8* %6
%11 = icmp eq i8 %10, 9
br i1 %11, label %12, label %55
12: ; preds = %9
%13 = icmp eq i32 %7, 0
br i1 %13, label %92, label %51
14: ; preds = %51
%15 = icmp ugt i32 %7, 1
br i1 %15, label %16, label %92
16: ; preds = %14
%17 = getelementptr inbounds i8, i8* %5, i64 -2
%18 = load i8, i8* %17
%19 = icmp eq i8 %18, 32
br i1 %19, label %20, label %92
20: ; preds = %16
%21 = icmp ugt i32 %7, 2
br i1 %21, label %22, label %92
22: ; preds = %20
%23 = getelementptr inbounds i8, i8* %5, i64 -3
%24 = load i8, i8* %23
%25 = icmp eq i8 %24, 32
br i1 %25, label %26, label %92
26: ; preds = %22
%27 = icmp ugt i32 %7, 3
br i1 %27, label %28, label %92
28: ; preds = %26
%29 = getelementptr inbounds i8, i8* %5, i64 -4
%30 = load i8, i8* %29
%31 = icmp eq i8 %30, 32
br i1 %31, label %32, label %92
32: ; preds = %28
%33 = icmp ugt i32 %7, 4
br i1 %33, label %34, label %92
34: ; preds = %32
%35 = getelementptr inbounds i8, i8* %5, i64 -5
%36 = load i8, i8* %35
%37 = icmp eq i8 %36, 32
br i1 %37, label %38, label %92
38: ; preds = %34
%39 = icmp ugt i32 %7, 5
br i1 %39, label %40, label %92
40: ; preds = %38
%41 = getelementptr inbounds i8, i8* %5, i64 -6
%42 = load i8, i8* %41
%43 = icmp eq i8 %42, 32
br i1 %43, label %44, label %92
44: ; preds = %40
%45 = icmp eq i32 %7, 7
br i1 %45, label %46, label %92
46: ; preds = %44
%47 = getelementptr inbounds i8, i8* %5, i64 -7
%48 = load i8, i8* %47
%49 = icmp eq i8 %48, 32
%50 = select i1 %49, i8* %47, i8* %41
br label %92
51: ; preds = %12
%52 = getelementptr inbounds i8, i8* %5, i64 -1
%53 = load i8, i8* %52
%54 = icmp eq i8 %53, 32
br i1 %54, label %14, label %92
55: ; preds = %9
%56 = icmp eq i32 %7, 7
br i1 %56, label %57, label %95
57: ; preds = %55
%58 = icmp eq i8 %8, 32
br i1 %58, label %59, label %95
59: ; preds = %57
%60 = getelementptr inbounds i8, i8* %5, i64 -1
%61 = load i8, i8* %60
%62 = icmp eq i8 %61, 32
br i1 %62, label %63, label %95
63: ; preds = %59
%64 = getelementptr i8, i8* %5, i64 -8
%65 = getelementptr inbounds i8, i8* %5, i64 -2
%66 = load i8, i8* %65
%67 = icmp eq i8 %66, 32
br i1 %67, label %68, label %89
68: ; preds = %63
%69 = getelementptr inbounds i8, i8* %5, i64 -3
%70 = load i8, i8* %69
%71 = icmp eq i8 %70, 32
br i1 %71, label %72, label %89
72: ; preds = %68
%73 = getelementptr inbounds i8, i8* %5, i64 -4
%74 = load i8, i8* %73
%75 = icmp eq i8 %74, 32
br i1 %75, label %76, label %89
76: ; preds = %72
%77 = getelementptr inbounds i8, i8* %5, i64 -5
%78 = load i8, i8* %77
%79 = icmp eq i8 %78, 32
br i1 %79, label %80, label %89
80: ; preds = %76
%81 = getelementptr inbounds i8, i8* %5, i64 -6
%82 = load i8, i8* %81
%83 = icmp eq i8 %82, 32
br i1 %83, label %84, label %89
84: ; preds = %80
%85 = getelementptr inbounds i8, i8* %5, i64 -7
%86 = load i8, i8* %85
%87 = icmp eq i8 %86, 32
%88 = select i1 %87, i8* %64, i8* %85
br label %89
89: ; preds = %84, %80, %76, %72, %68, %63
%90 = phi i8* [ %65, %63 ], [ %69, %68 ], [ %73, %72 ], [ %77, %76 ], [ %81, %80 ], [ %88, %84 ]
%91 = getelementptr inbounds i8, i8* %90, i64 1
br label %92
92: ; preds = %46, %51, %14, %16, %20, %22, %26, %28, %32, %34, %38, %40, %44, %12, %89
%93 = phi i8* [ %91, %89 ], [ %5, %12 ], [ %5, %51 ], [ %52, %14 ], [ %52, %16 ], [ %17, %20 ], [ %17, %22 ], [ %23, %26 ], [ %23, %28 ], [ %29, %32 ], [ %29, %34 ], [ %35, %38 ], [ %35, %40 ], [ %41, %44 ], [ %50, %46 ]
%94 = phi i32 [ 7, %89 ], [ 0, %12 ], [ 0, %46 ], [ 0, %44 ], [ 0, %40 ], [ 0, %38 ], [ 0, %34 ], [ 0, %32 ], [ 0, %28 ], [ 0, %26 ], [ 0, %22 ], [ 0, %20 ], [ 0, %16 ], [ 0, %14 ], [ 0, %51 ]
store i8 9, i8* %93
br label %95
95: ; preds = %92, %55, %57, %59
%96 = phi i32 [ 7, %59 ], [ 7, %57 ], [ %7, %55 ], [ %94, %92 ]
%97 = phi i8* [ %5, %59 ], [ %5, %57 ], [ %5, %55 ], [ %93, %92 ]
%98 = getelementptr inbounds i8, i8* %6, i64 1
%99 = getelementptr inbounds i8, i8* %97, i64 1
%100 = add nsw i32 %96, 1
%101 = and i32 %100, 7
br label %4
102: ; preds = %4, %4
%103 = icmp eq i8* %5, %1
br i1 %103, label %114, label %104
104: ; preds = %102
%105 = ptrtoint i8* %5 to i64
%106 = sub i64 %3, %105
%107 = getelementptr i8, i8* %5, i64 %106
br label %108
108: ; preds = %104, %112
%109 = phi i8* [ %110, %112 ], [ %5, %104 ]
%110 = getelementptr inbounds i8, i8* %109, i64 -1
%111 = load i8, i8* %110
switch i8 %111, label %114 [
i8 32, label %112
i8 9, label %112
]
112: ; preds = %108, %108
%113 = icmp eq i8* %110, %1
br i1 %113, label %114, label %108
114: ; preds = %112, %108, %102
%115 = phi i8* [ %1, %102 ], [ %109, %108 ], [ %107, %112 ]
%116 = getelementptr inbounds i8, i8* %115, i64 1
store i8 10, i8* %115
store i8 0, i8* %116
%117 = ptrtoint i8* %116 to i64
%118 = sub i64 %117, %3
%119 = trunc i64 %118 to i32
ret i32 %119
}