#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int uint8_t;

/* Variables and functions */
void slide(signed char *r, const uint8_t *a) {
  int i;
  int b;
  int k;
  for (i = 0; i < 256; ++i) {
    r[i] = 1 & (a[i >> 3] >> (i & 7));
  }
  for (i = 0; i < 256; ++i) {
    if (r[i]) {
      for (b = 1; b <= 6 && i + b < 256; ++b) {
        if (r[i + b]) {
          if (r[i] + (r[i + b] << b) <= 15) {
            r[i] += r[i + b] << b;
            r[i + b] = 0;
          } else if (r[i] - (r[i + b] << b) >= -15) {
            r[i] -= r[i + b] << b;
            for (k = i + b; k < 256; ++k) {
              if (!r[k]) {
                r[k] = 1;
                break;
              }
              r[k] = 0;
            }
          } else {
            break;
          }
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<slide>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x100,-0x14(%rbp)
jge    1156 <slide+0x56>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sar    $0x3,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x14(%rbp),%ecx
and    $0x7,%ecx
sar    %cl,%eax
and    $0x1,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1113 <slide+0x13>
movl   $0x0,-0x14(%rbp)
cmpl   $0x100,-0x14(%rbp)
jge    131e <slide+0x21e>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     130b <slide+0x20b>
movl   $0x1,-0x18(%rbp)
xor    %eax,%eax
cmpl   $0x6,-0x18(%rbp)
mov    %al,-0x1d(%rbp)
jg     11a3 <slide+0xa3>
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
cmp    $0x100,%eax
setl   %al
mov    %al,-0x1d(%rbp)
mov    -0x1d(%rbp),%al
test   $0x1,%al
jne    11b3 <slide+0xb3>
jmp    1306 <slide+0x206>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     12f3 <slide+0x1f3>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x8(%rbp),%rcx
mov    -0x14(%rbp),%edx
add    -0x18(%rbp),%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%edx
mov    -0x18(%rbp),%ecx
shl    %cl,%edx
mov    %edx,%ecx
add    %ecx,%eax
cmp    $0xf,%eax
jg     1236 <slide+0x136>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%esi
mov    -0x18(%rbp),%ecx
shl    %cl,%esi
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
add    %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    12ee <slide+0x1ee>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x8(%rbp),%rcx
mov    -0x14(%rbp),%edx
add    -0x18(%rbp),%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%edx
mov    -0x18(%rbp),%ecx
shl    %cl,%edx
mov    %edx,%ecx
sub    %ecx,%eax
cmp    $0xfffffff1,%eax
jl     12e4 <slide+0x1e4>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    -0x18(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%esi
mov    -0x18(%rbp),%ecx
shl    %cl,%esi
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
sub    %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
cmpl   $0x100,-0x1c(%rbp)
jge    12df <slide+0x1df>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    12c5 <slide+0x1c5>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x1,(%rax,%rcx,1)
jmp    12df <slide+0x1df>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1295 <slide+0x195>
jmp    12e9 <slide+0x1e9>
jmp    1306 <slide+0x206>
jmp    12ee <slide+0x1ee>
jmp    12f3 <slide+0x1f3>
jmp    12f8 <slide+0x1f8>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1183 <slide+0x83>
jmp    130b <slide+0x20b>
jmp    1310 <slide+0x210>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    115d <slide+0x5d>
pop    %rbp
ret

x86 assembly (clang, -O2):
<slide>:
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %rax,%r8
shr    %r8
and    $0x7ffffffc,%r8d
mov    (%rsi,%r8,1),%edx
mov    %eax,%ecx
and    $0x6,%cl
shr    %cl,%edx
and    $0x1,%dl
mov    %dl,(%rdi,%rax,1)
mov    (%rsi,%r8,1),%edx
lea    0x1(%rax),%ecx
and    $0x7,%cl
shr    %cl,%edx
and    $0x1,%dl
mov    %dl,0x1(%rdi,%rax,1)
add    $0x2,%rax
cmp    $0x100,%rax
jne    1110 <slide+0x10>
mov    $0x1,%r8d
xor    %r9d,%r9d
jmp    1175 <slide+0x75>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r9
add    $0x1,%r8
cmp    $0x100,%r9
je     1220 <slide+0x120>
cmpb   $0x0,(%rdi,%r9,1)
je     1160 <slide+0x60>
cmp    $0xfe,%r9
ja     1160 <slide+0x60>
mov    $0x1,%ecx
mov    %r9,%r10
mov    %r8,%rax
movsbl (%rdi,%rax,1),%edx
test   %edx,%edx
je     11f0 <slide+0xf0>
shl    %cl,%edx
movsbl (%rdi,%r9,1),%esi
lea    (%rdx,%rsi,1),%r11d
cmp    $0xf,%r11d
jg     11c0 <slide+0xc0>
mov    %r11b,(%rdi,%r9,1)
movb   $0x0,(%rdi,%rax,1)
jmp    11f0 <slide+0xf0>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
sub    %edx,%esi
cmp    $0xfffffff1,%esi
jl     1160 <slide+0x60>
mov    %sil,(%rdi,%r9,1)
mov    %r10,%rdx
xchg   %ax,%ax
cmpb   $0x0,0x1(%rdi,%rdx,1)
je     11eb <slide+0xeb>
movb   $0x0,0x1(%rdi,%rdx,1)
add    $0x1,%rdx
cmp    $0xff,%rdx
jb     11d0 <slide+0xd0>
jmp    11f0 <slide+0xf0>
movb   $0x1,0x1(%rdi,%rdx,1)
cmp    $0x5,%rcx
ja     1160 <slide+0x60>
add    $0x1,%rax
add    $0x1,%r10
lea    (%rcx,%r9,1),%rdx
add    $0x1,%rdx
add    $0x1,%rcx
cmp    $0x100,%rdx
jb     1190 <slide+0x90>
jmp    1160 <slide+0x60>
ret

LLVM IR (-O0):
define void @slide(i8* %0, i32* %1) {
%3 = alloca i8*
%4 = alloca i32*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i8* %0, i8** %3
store i32* %1, i32** %4
store i32 0, i32* %5
br label %8
8: ; preds = %27, %2
%9 = load i32, i32* %5
%10 = icmp slt i32 %9, 256
br i1 %10, label %11, label %30
11: ; preds = %8
%12 = load i32*, i32** %4
%13 = load i32, i32* %5
%14 = ashr i32 %13, 3
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds i32, i32* %12, i64 %15
%17 = load i32, i32* %16
%18 = load i32, i32* %5
%19 = and i32 %18, 7
%20 = ashr i32 %17, %19
%21 = and i32 1, %20
%22 = trunc i32 %21 to i8
%23 = load i8*, i8** %3
%24 = load i32, i32* %5
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %23, i64 %25
store i8 %22, i8* %26
br label %27
27: ; preds = %11
%28 = load i32, i32* %5
%29 = add nsw i32 %28, 1
store i32 %29, i32* %5
br label %8
30: ; preds = %8
store i32 0, i32* %5
br label %31
31: ; preds = %179, %30
%32 = load i32, i32* %5
%33 = icmp slt i32 %32, 256
br i1 %33, label %34, label %182
34: ; preds = %31
%35 = load i8*, i8** %3
%36 = load i32, i32* %5
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i8, i8* %35, i64 %37
%39 = load i8, i8* %38
%40 = icmp ne i8 %39, 0
br i1 %40, label %41, label %178
41: ; preds = %34
store i32 1, i32* %6
br label %42
42: ; preds = %174, %41
%43 = load i32, i32* %6
%44 = icmp sle i32 %43, 6
br i1 %44, label %45, label %50
45: ; preds = %42
%46 = load i32, i32* %5
%47 = load i32, i32* %6
%48 = add nsw i32 %46, %47
%49 = icmp slt i32 %48, 256
br label %50
50: ; preds = %45, %42
%51 = phi i1 [ false, %42 ], [ %49, %45 ]
br i1 %51, label %52, label %177
52: ; preds = %50
%53 = load i8*, i8** %3
%54 = load i32, i32* %5
%55 = load i32, i32* %6
%56 = add nsw i32 %54, %55
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i8, i8* %53, i64 %57
%59 = load i8, i8* %58
%60 = icmp ne i8 %59, 0
br i1 %60, label %61, label %173
61: ; preds = %52
%62 = load i8*, i8** %3
%63 = load i32, i32* %5
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds i8, i8* %62, i64 %64
%66 = load i8, i8* %65
%67 = sext i8 %66 to i32
%68 = load i8*, i8** %3
%69 = load i32, i32* %5
%70 = load i32, i32* %6
%71 = add nsw i32 %69, %70
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds i8, i8* %68, i64 %72
%74 = load i8, i8* %73
%75 = sext i8 %74 to i32
%76 = load i32, i32* %6
%77 = shl i32 %75, %76
%78 = add nsw i32 %67, %77
%79 = icmp sle i32 %78, 15
br i1 %79, label %80, label %105
80: ; preds = %61
%81 = load i8*, i8** %3
%82 = load i32, i32* %5
%83 = load i32, i32* %6
%84 = add nsw i32 %82, %83
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i8, i8* %81, i64 %85
%87 = load i8, i8* %86
%88 = sext i8 %87 to i32
%89 = load i32, i32* %6
%90 = shl i32 %88, %89
%91 = load i8*, i8** %3
%92 = load i32, i32* %5
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i8, i8* %91, i64 %93
%95 = load i8, i8* %94
%96 = sext i8 %95 to i32
%97 = add nsw i32 %96, %90
%98 = trunc i32 %97 to i8
store i8 %98, i8* %94
%99 = load i8*, i8** %3
%100 = load i32, i32* %5
%101 = load i32, i32* %6
%102 = add nsw i32 %100, %101
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8, i8* %99, i64 %103
store i8 0, i8* %104
br label %172
105: ; preds = %61
%106 = load i8*, i8** %3
%107 = load i32, i32* %5
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds i8, i8* %106, i64 %108
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = load i8*, i8** %3
%113 = load i32, i32* %5
%114 = load i32, i32* %6
%115 = add nsw i32 %113, %114
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds i8, i8* %112, i64 %116
%118 = load i8, i8* %117
%119 = sext i8 %118 to i32
%120 = load i32, i32* %6
%121 = shl i32 %119, %120
%122 = sub nsw i32 %111, %121
%123 = icmp sge i32 %122, -15
br i1 %123, label %124, label %170
124: ; preds = %105
%125 = load i8*, i8** %3
%126 = load i32, i32* %5
%127 = load i32, i32* %6
%128 = add nsw i32 %126, %127
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds i8, i8* %125, i64 %129
%131 = load i8, i8* %130
%132 = sext i8 %131 to i32
%133 = load i32, i32* %6
%134 = shl i32 %132, %133
%135 = load i8*, i8** %3
%136 = load i32, i32* %5
%137 = sext i32 %136 to i64
%138 = getelementptr inbounds i8, i8* %135, i64 %137
%139 = load i8, i8* %138
%140 = sext i8 %139 to i32
%141 = sub nsw i32 %140, %134
%142 = trunc i32 %141 to i8
store i8 %142, i8* %138
%143 = load i32, i32* %5
%144 = load i32, i32* %6
%145 = add nsw i32 %143, %144
store i32 %145, i32* %7
br label %146
146: ; preds = %166, %124
%147 = load i32, i32* %7
%148 = icmp slt i32 %147, 256
br i1 %148, label %149, label %169
149: ; preds = %146
%150 = load i8*, i8** %3
%151 = load i32, i32* %7
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds i8, i8* %150, i64 %152
%154 = load i8, i8* %153
%155 = icmp ne i8 %154, 0
br i1 %155, label %161, label %156
156: ; preds = %149
%157 = load i8*, i8** %3
%158 = load i32, i32* %7
%159 = sext i32 %158 to i64
%160 = getelementptr inbounds i8, i8* %157, i64 %159
store i8 1, i8* %160
br label %169
161: ; preds = %149
%162 = load i8*, i8** %3
%163 = load i32, i32* %7
%164 = sext i32 %163 to i64
%165 = getelementptr inbounds i8, i8* %162, i64 %164
store i8 0, i8* %165
br label %166
166: ; preds = %161
%167 = load i32, i32* %7
%168 = add nsw i32 %167, 1
store i32 %168, i32* %7
br label %146
169: ; preds = %156, %146
br label %171
170: ; preds = %105
br label %177
171: ; preds = %169
br label %172
172: ; preds = %171, %80
br label %173
173: ; preds = %172, %52
br label %174
174: ; preds = %173
%175 = load i32, i32* %6
%176 = add nsw i32 %175, 1
store i32 %176, i32* %6
br label %42
177: ; preds = %170, %50
br label %178
178: ; preds = %177, %34
br label %179
179: ; preds = %178
%180 = load i32, i32* %5
%181 = add nsw i32 %180, 1
store i32 %181, i32* %5
br label %31
182: ; preds = %31
ret void
}

LLVM IR (-O2):
define void @slide(i8* nocapture %0, i32* nocapture %1) {
br label %3
3: ; preds = %3, %2
%4 = phi i64 [ 0, %2 ], [ %26, %3 ]
%5 = trunc i64 %4 to i32
%6 = lshr i64 %4, 3
%7 = and i64 %6, 536870911
%8 = getelementptr inbounds i32, i32* %1, i64 %7
%9 = load i32, i32* %8
%10 = and i32 %5, 6
%11 = lshr i32 %9, %10
%12 = trunc i32 %11 to i8
%13 = and i8 %12, 1
%14 = getelementptr inbounds i8, i8* %0, i64 %4
store i8 %13, i8* %14
%15 = or i64 %4, 1
%16 = trunc i64 %15 to i32
%17 = lshr i64 %4, 3
%18 = and i64 %17, 536870911
%19 = getelementptr inbounds i32, i32* %1, i64 %18
%20 = load i32, i32* %19
%21 = and i32 %16, 7
%22 = lshr i32 %20, %21
%23 = trunc i32 %22 to i8
%24 = and i8 %23, 1
%25 = getelementptr inbounds i8, i8* %0, i64 %15
store i8 %24, i8* %25
%26 = add nuw nsw i64 %4, 2
%27 = icmp eq i64 %26, 256
br i1 %27, label %28, label %3
28: ; preds = %3, %73
%29 = phi i64 [ %74, %73 ], [ 0, %3 ]
%30 = phi i64 [ %75, %73 ], [ 1, %3 ]
%31 = getelementptr inbounds i8, i8* %0, i64 %29
%32 = load i8, i8* %31
%33 = icmp ne i8 %32, 0
%34 = icmp ult i64 %29, 255
%35 = select i1 %33, i1 %34, i1 false
br i1 %35, label %36, label %73
36: ; preds = %28, %66
%37 = phi i64 [ %67, %66 ], [ 1, %28 ]
%38 = phi i64 [ %70, %66 ], [ %30, %28 ]
%39 = getelementptr inbounds i8, i8* %0, i64 %38
%40 = load i8, i8* %39
%41 = icmp eq i8 %40, 0
br i1 %41, label %66, label %42
42: ; preds = %36
%43 = load i8, i8* %31
%44 = sext i8 %43 to i32
%45 = sext i8 %40 to i32
%46 = trunc i64 %37 to i32
%47 = shl nsw i32 %45, %46
%48 = add nsw i32 %47, %44
%49 = icmp slt i32 %48, 16
br i1 %49, label %50, label %52
50: ; preds = %42
%51 = trunc i32 %48 to i8
store i8 %51, i8* %31
store i8 0, i8* %39
br label %66
52: ; preds = %42
%53 = sub nsw i32 %44, %47
%54 = icmp sgt i32 %53, -16
br i1 %54, label %55, label %73
55: ; preds = %52
%56 = trunc i32 %53 to i8
store i8 %56, i8* %31
br label %57
57: ; preds = %55, %63
%58 = phi i64 [ %38, %55 ], [ %64, %63 ]
%59 = getelementptr inbounds i8, i8* %0, i64 %58
%60 = load i8, i8* %59
%61 = icmp eq i8 %60, 0
br i1 %61, label %62, label %63
62: ; preds = %57
store i8 1, i8* %59
br label %66
63: ; preds = %57
store i8 0, i8* %59
%64 = add nuw nsw i64 %58, 1
%65 = icmp ult i64 %58, 255
br i1 %65, label %57, label %66
66: ; preds = %63, %36, %62, %50
%67 = add nuw nsw i64 %37, 1
%68 = icmp ult i64 %37, 6
%69 = add nuw nsw i64 %67, %29
%70 = add nuw nsw i64 %38, 1
%71 = icmp ult i64 %69, 256
%72 = select i1 %68, i1 %71, i1 false
br i1 %72, label %36, label %73
73: ; preds = %66, %52, %28
%74 = add nuw nsw i64 %29, 1
%75 = add nuw nsw i64 %30, 1
%76 = icmp eq i64 %74, 256
br i1 %76, label %77, label %28
77: ; preds = %73
ret void
}