void adjust(char keyout[48 + 1], char *keyin) {
  char *p;
  char *s;
  for (p = keyin; *p; p++)
    ;
  for (s = keyout + 48; p >= keyin; p--, s--) {
    *s = *p;
  }
  while (s >= keyout) {
    *s-- = '0';
  }
}


x86 assembly (clang, -O0):
<adjust>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1137 <adjust+0x37>
jmp    1126 <adjust+0x26>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1114 <adjust+0x14>
mov    -0x8(%rbp),%rax
add    $0x30,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x10(%rbp),%rax
jb     117a <adjust+0x7a>
mov    -0x18(%rbp),%rax
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %cl,(%rax)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
jmp    1143 <adjust+0x43>
jmp    117f <adjust+0x7f>
mov    -0x20(%rbp),%rax
cmp    -0x8(%rbp),%rax
jb     11a4 <adjust+0xa4>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x30,(%rax)
jmp    117f <adjust+0x7f>
pop    %rbp
ret

x86 assembly (clang, -O2):
<adjust>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    $0x2,%eax
sub    %rsi,%rax
lea    -0x1(%rsi),%r13
lea    -0x3(%rsi),%rbx
xor    %r9d,%r9d
nopl   0x0(%rax)
add    $0xffffffffffffffff,%rax
add    $0x1,%r13
add    $0x1,%rbx
cmpb   $0x0,(%rsi,%r9,1)
lea    0x1(%r9),%r9
jne    1130 <adjust+0x20>
lea    0x30(%rdi),%rdx
lea    (%rsi,%r9,1),%r14
add    $0xffffffffffffffff,%r14
cmp    %rsi,%r14
jb     130c <adjust+0x1fc>
movb   $0x0,0x30(%rdi)
lea    (%rsi,%r9,1),%r11
add    $0xfffffffffffffffe,%r11
lea    0x2f(%rdi),%r8
cmp    %rsi,%r11
jb     1304 <adjust+0x1f4>
mov    %rsi,%r15
neg    %r15
cmp    %r15,%rax
mov    %r15,%rcx
cmova  %rax,%rcx
add    %rsi,%rcx
lea    (%r9,%rcx,1),%r10
add    $0xffffffffffffffff,%r10
cmp    $0x10,%r10
jb     12f0 <adjust+0x1e0>
lea    -0x1(%rsi),%r12
mov    %rdi,%rcx
sub    %rsi,%rcx
cmp    %r12,%rbx
cmovb  %rbx,%r12
add    %r12,%rcx
sub    %r9,%rcx
add    $0x32,%rcx
cmp    %r14,%rcx
jae    11d1 <adjust+0xc1>
add    %r15,%r12
sub    %r9,%r12
lea    (%r12,%r14,1),%rcx
add    $0x2,%rcx
cmp    %rdx,%rcx
jb     12f0 <adjust+0x1e0>
mov    %r10,%r14
and    $0xfffffffffffffff0,%r14
cmp    %r15,%rax
mov    %r15,%r11
cmova  %rax,%r11
lea    -0x10(%r14),%rcx
mov    %rcx,%r12
shr    $0x4,%r12
add    $0x1,%r12
cmp    $0x30,%rcx
jae    11fb <adjust+0xeb>
xor    %edx,%edx
jmp    126c <adjust+0x15c>
cmp    %r15,%rax
mov    %r15,%rcx
cmova  %rax,%rcx
add    %rsi,%rcx
lea    (%r9,%rcx,1),%rbx
add    $0xffffffffffffffff,%rbx
and    $0xfffffffffffffff0,%rbx
add    $0xfffffffffffffff0,%rbx
shr    $0x4,%rbx
add    $0x1,%rbx
and    $0xfffffffffffffffc,%rbx
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
lea    (%rsi,%rdx,1),%rcx
movups -0x11(%r9,%rcx,1),%xmm0
movups %xmm0,0x20(%rdi,%rdx,1)
movups -0x21(%r9,%rcx,1),%xmm0
movups %xmm0,0x10(%rdi,%rdx,1)
movups -0x31(%r9,%rcx,1),%xmm0
movups %xmm0,(%rdi,%rdx,1)
movups -0x41(%r9,%rcx,1),%xmm0
movups %xmm0,-0x10(%rdi,%rdx,1)
add    $0xffffffffffffffc0,%rdx
add    $0xfffffffffffffffc,%rbx
jne    1230 <adjust+0x120>
neg    %rdx
test   $0x3,%r12b
je     12cb <adjust+0x1bb>
mov    %rdi,%r12
sub    %rdx,%r12
add    $0x20,%r12
cmp    %r15,%rax
cmova  %rax,%r15
add    %esi,%r15d
lea    (%r9,%r15,1),%eax
add    $0xff,%al
and    $0x30,%al
add    $0xf0,%al
shr    $0x4,%al
add    $0x1,%al
movzbl %al,%eax
and    $0x3,%eax
shl    $0x4,%rax
mov    %rsi,%rbx
sub    %rdx,%rbx
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
lea    (%rbx,%rdx,1),%rcx
movups -0x11(%r9,%rcx,1),%xmm0
movups %xmm0,(%r12,%rdx,1)
add    $0xfffffffffffffff0,%rdx
mov    %rax,%rcx
add    %rdx,%rcx
jne    12b0 <adjust+0x1a0>
sub    %r14,%r8
cmp    %r14,%r10
je     1304 <adjust+0x1f4>
add    %r13,%r11
and    $0xfffffffffffffff0,%r11
mov    %rsi,%rax
sub    %r11,%rax
lea    (%rax,%r9,1),%r11
add    $0xfffffffffffffffe,%r11
nopl   0x0(%rax,%rax,1)
movzbl (%r11),%eax
mov    %al,(%r8)
add    $0xffffffffffffffff,%r11
add    $0xffffffffffffffff,%r8
cmp    %rsi,%r11
jae    12f0 <adjust+0x1e0>
mov    %r8,%rdx
cmp    %rdi,%r8
jb     132c <adjust+0x21c>
lea    -0x1(%rdx),%rax
add    $0xffffffffffffffff,%rdi
cmp    %rdi,%rax
cmovb  %rax,%rdi
sub    %rdi,%rdx
add    $0x1,%rdi
mov    $0x30,%esi
call   1030 <memset@plt>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @adjust(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
store i8* %0, i8** %3
store i8* %1, i8** %4
%7 = load i8*, i8** %4
store i8* %7, i8** %5
br label %8
8: ; preds = %13, %2
%9 = load i8*, i8** %5
%10 = load i8, i8* %9
%11 = icmp ne i8 %10, 0
br i1 %11, label %12, label %16
12: ; preds = %8
br label %13
13: ; preds = %12
%14 = load i8*, i8** %5
%15 = getelementptr inbounds i8, i8* %14, i32 1
store i8* %15, i8** %5
br label %8
16: ; preds = %8
%17 = load i8*, i8** %3
%18 = getelementptr inbounds i8, i8* %17, i64 48
store i8* %18, i8** %6
br label %19
19: ; preds = %27, %16
%20 = load i8*, i8** %5
%21 = load i8*, i8** %4
%22 = icmp uge i8* %20, %21
br i1 %22, label %23, label %32
23: ; preds = %19
%24 = load i8*, i8** %5
%25 = load i8, i8* %24
%26 = load i8*, i8** %6
store i8 %25, i8* %26
br label %27
27: ; preds = %23
%28 = load i8*, i8** %5
%29 = getelementptr inbounds i8, i8* %28, i32 -1
store i8* %29, i8** %5
%30 = load i8*, i8** %6
%31 = getelementptr inbounds i8, i8* %30, i32 -1
store i8* %31, i8** %6
br label %19
32: ; preds = %19
br label %33
33: ; preds = %37, %32
%34 = load i8*, i8** %6
%35 = load i8*, i8** %3
%36 = icmp uge i8* %34, %35
br i1 %36, label %37, label %40
37: ; preds = %33
%38 = load i8*, i8** %6
%39 = getelementptr inbounds i8, i8* %38, i32 -1
store i8* %39, i8** %6
store i8 48, i8* %38
br label %33
40: ; preds = %33
ret void
}

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