#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 */

/* Variables and functions */
void fill_candidate(char *candidate, char run_digit, size_t run_len,
                    const int *rest_digits, size_t rest_len) {
  size_t i = 0;
  size_t j = 0;
  int run_val = run_digit - '0';
  while (i < rest_len && rest_digits[i] <= run_val)
    candidate[j++] = rest_digits[i++] + '0';
  for (size_t k = 0; k < run_len; k++)
    candidate[j++] = run_digit;
  while (i < rest_len)
    candidate[j++] = rest_digits[i++] + '0';
}


x86 assembly (clang, -O0):
<fill_candidate>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %rdi,-0x8(%rbp)
mov    %al,-0x9(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
movsbl -0x9(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x30(%rbp),%rcx
xor    %eax,%eax
cmp    -0x28(%rbp),%rcx
mov    %al,-0x49(%rbp)
jae    115b <fill_candidate+0x5b>
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x3c(%rbp),%eax
setle  %al
mov    %al,-0x49(%rbp)
mov    -0x49(%rbp),%al
test   $0x1,%al
jne    116b <fill_candidate+0x6b>
jmp    11a1 <fill_candidate+0xa1>
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    (%rax,%rcx,4),%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x38(%rbp)
mov    %dl,(%rax,%rcx,1)
jmp    1134 <fill_candidate+0x34>
movq   $0x0,-0x48(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    11e1 <fill_candidate+0xe1>
mov    -0x9(%rbp),%dl
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x38(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    11a9 <fill_candidate+0xa9>
jmp    11e6 <fill_candidate+0xe6>
mov    -0x30(%rbp),%rax
cmp    -0x28(%rbp),%rax
jae    122a <fill_candidate+0x12a>
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    (%rax,%rcx,4),%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x38(%rbp)
mov    %dl,(%rax,%rcx,1)
jmp    11e6 <fill_candidate+0xe6>
pop    %rbp
ret

x86 assembly (clang, -O2):
<fill_candidate>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r8,%r14
mov    %rcx,%r15
mov    %rdx,%r12
mov    %rdi,%r13
test   %r8,%r8
je     114e <fill_candidate+0x3e>
lea    -0x30(%rsi),%eax
xor    %ebx,%ebx
nop
mov    (%r15,%rbx,4),%ecx
cmp    %eax,%ecx
jg     1150 <fill_candidate+0x40>
add    $0x30,%cl
mov    %cl,0x0(%r13,%rbx,1)
add    $0x1,%rbx
cmp    %rbx,%r14
jne    1130 <fill_candidate+0x20>
mov    %r14,%rbx
jmp    1150 <fill_candidate+0x40>
xor    %ebx,%ebx
mov    %rbx,%rax
test   %r12,%r12
je     116e <fill_candidate+0x5e>
lea    (%rbx,%r13,1),%rdi
movzbl %sil,%esi
mov    %r12,%rdx
call   1030 <memset@plt>
add    %rbx,%r12
mov    %r12,%rax
cmp    %r14,%rbx
jae    1377 <fill_candidate+0x267>
mov    %r14,%r10
sub    %rbx,%r10
cmp    $0x8,%r10
jb     12df <fill_candidate+0x1cf>
lea    (%rax,%r13,1),%rcx
lea    (%r15,%r14,4),%rdx
cmp    %rdx,%rcx
jae    11ab <fill_candidate+0x9b>
lea    (%rax,%r14,1),%rcx
sub    %rbx,%rcx
add    %r13,%rcx
lea    (%r15,%rbx,4),%rdx
cmp    %rdx,%rcx
ja     12df <fill_candidate+0x1cf>
mov    %r10,%r8
and    $0xfffffffffffffff8,%r8
lea    -0x8(%r8),%rcx
mov    %rcx,%r9
shr    $0x3,%r9
add    $0x1,%r9
test   %rcx,%rcx
je     1381 <fill_candidate+0x271>
mov    %r9,%rdi
and    $0xfffffffffffffffe,%rdi
lea    (%r15,%rbx,4),%rdx
add    $0x30,%rdx
lea    (%rax,%r13,1),%rcx
add    $0xc,%rcx
xor    %esi,%esi
movdqa 0xe15(%rip),%xmm0
movdqa 0xe1d(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqu -0x30(%rdx,%rsi,4),%xmm2
movdqu -0x20(%rdx,%rsi,4),%xmm3
pand   %xmm0,%xmm2
packuswb %xmm2,%xmm2
packuswb %xmm2,%xmm2
pand   %xmm0,%xmm3
packuswb %xmm3,%xmm3
packuswb %xmm3,%xmm3
paddb  %xmm1,%xmm2
paddb  %xmm1,%xmm3
movd   %xmm2,-0xc(%rcx,%rsi,1)
movd   %xmm3,-0x8(%rcx,%rsi,1)
movdqu -0x10(%rdx,%rsi,4),%xmm2
movdqu (%rdx,%rsi,4),%xmm3
pand   %xmm0,%xmm2
packuswb %xmm2,%xmm2
packuswb %xmm2,%xmm2
pand   %xmm0,%xmm3
packuswb %xmm3,%xmm3
packuswb %xmm3,%xmm3
paddb  %xmm1,%xmm2
paddb  %xmm1,%xmm3
movd   %xmm2,-0x4(%rcx,%rsi,1)
movd   %xmm3,(%rcx,%rsi,1)
add    $0x10,%rsi
add    $0xfffffffffffffffe,%rdi
jne    1200 <fill_candidate+0xf0>
test   $0x1,%r9b
je     12d0 <fill_candidate+0x1c0>
lea    (%rbx,%rsi,1),%rcx
add    %rax,%rsi
movdqu (%r15,%rcx,4),%xmm0
movdqu 0x10(%r15,%rcx,4),%xmm1
movdqa 0xd66(%rip),%xmm2
pand   %xmm2,%xmm0
packuswb %xmm0,%xmm0
packuswb %xmm0,%xmm0
pand   %xmm2,%xmm1
packuswb %xmm1,%xmm1
packuswb %xmm1,%xmm1
movdqa 0xd56(%rip),%xmm2
paddb  %xmm2,%xmm0
paddb  %xmm2,%xmm1
movd   %xmm0,0x0(%r13,%rsi,1)
movd   %xmm1,0x4(%r13,%rsi,1)
cmp    %r8,%r10
je     1377 <fill_candidate+0x267>
add    %r8,%rbx
add    %r8,%rax
mov    %r14d,%edx
sub    %ebx,%edx
mov    %rbx,%rsi
not    %rsi
add    %r14,%rsi
and    $0x3,%rdx
je     131b <fill_candidate+0x20b>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl (%r15,%rbx,4),%ecx
add    $0x1,%rbx
add    $0x30,%cl
mov    %cl,0x0(%r13,%rax,1)
add    $0x1,%rax
add    $0xffffffffffffffff,%rdx
jne    1300 <fill_candidate+0x1f0>
cmp    $0x3,%rsi
jb     1377 <fill_candidate+0x267>
sub    %rbx,%r14
lea    (%r15,%rbx,4),%rcx
add    $0xc,%rcx
add    %r13,%rax
add    $0x3,%rax
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nop
movzbl -0xc(%rcx,%rdx,4),%ebx
add    $0x30,%bl
mov    %bl,-0x3(%rax,%rdx,1)
movzbl -0x8(%rcx,%rdx,4),%ebx
add    $0x30,%bl
mov    %bl,-0x2(%rax,%rdx,1)
movzbl -0x4(%rcx,%rdx,4),%ebx
add    $0x30,%bl
mov    %bl,-0x1(%rax,%rdx,1)
movzbl (%rcx,%rdx,4),%ebx
add    $0x30,%bl
mov    %bl,(%rax,%rdx,1)
add    $0x4,%rdx
cmp    %rdx,%r14
jne    1340 <fill_candidate+0x230>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret
xor    %esi,%esi
test   $0x1,%r9b
jne    127e <fill_candidate+0x16e>
jmp    12d0 <fill_candidate+0x1c0>

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

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