char *urldecode(const char *src, const int src_len, char *dest, int *dest_len) {
  const unsigned char *pSrc;
  const unsigned char *pEnd;
  char *pDest;
  unsigned char cHigh;
  unsigned char cLow;
  int valHigh;
  int valLow;
  pDest = dest;
  pSrc = (unsigned char *)src;
  pEnd = (unsigned char *)src + src_len;
  while (pSrc < pEnd) {
    if (*pSrc == '%' && pSrc + 2 < pEnd) {
      cHigh = *(pSrc + 1);
      cLow = *(pSrc + 2);
      if (((cHigh >= '0' && cHigh <= '9') || (cHigh >= 'a' && cHigh <= 'f') ||
           (cHigh >= 'A' && cHigh <= 'F')) &&
          ((cLow >= '0' && cLow <= '9') || (cLow >= 'a' && cLow <= 'f') ||
           (cLow >= 'A' && cLow <= 'F'))) {
        if (cHigh >= '0' && cHigh <= '9') {
          valHigh = cHigh - '0';
        } else if (cHigh >= 'a' && cHigh <= 'f') {
          valHigh = cHigh - 'a' + 10;
        } else {
          valHigh = cHigh - 'A' + 10;
        }
        if (cLow >= '0' && cLow <= '9') {
          valLow = cLow - '0';
        } else if (cLow >= 'a' && cLow <= 'f') {
          valLow = cLow - 'a' + 10;
        } else {
          valLow = cLow - 'A' + 10;
        }
        *pDest++ = (valHigh << 4) | valLow;
        pSrc += 3;
      } else {
        *pDest++ = *pSrc;
        pSrc++;
      }
    } else if (*pSrc == '+') {
      *pDest++ = ' ';
      pSrc++;
    } else {
      *pDest++ = *pSrc;
      pSrc++;
    }
  }
  *pDest = '\0';
  *dest_len = pDest - dest;
  return dest;
}


x86 assembly (clang, -O0):
<urldecode>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
jae    1395 <urldecode+0x295>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x25,%eax
jne    1335 <urldecode+0x235>
mov    -0x28(%rbp),%rax
add    $0x2,%rax
cmp    -0x30(%rbp),%rax
jae    1335 <urldecode+0x235>
mov    -0x28(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x39(%rbp)
mov    -0x28(%rbp),%rax
mov    0x2(%rax),%al
mov    %al,-0x3a(%rbp)
movzbl -0x39(%rbp),%eax
cmp    $0x30,%eax
jl     1190 <urldecode+0x90>
movzbl -0x39(%rbp),%eax
cmp    $0x39,%eax
jle    11c4 <urldecode+0xc4>
movzbl -0x39(%rbp),%eax
cmp    $0x61,%eax
jl     11aa <urldecode+0xaa>
movzbl -0x39(%rbp),%eax
cmp    $0x66,%eax
jle    11c4 <urldecode+0xc4>
movzbl -0x39(%rbp),%eax
cmp    $0x41,%eax
jl     130d <urldecode+0x20d>
movzbl -0x39(%rbp),%eax
cmp    $0x46,%eax
jg     130d <urldecode+0x20d>
movzbl -0x3a(%rbp),%eax
cmp    $0x30,%eax
jl     11de <urldecode+0xde>
movzbl -0x3a(%rbp),%eax
cmp    $0x39,%eax
jle    1212 <urldecode+0x112>
movzbl -0x3a(%rbp),%eax
cmp    $0x61,%eax
jl     11f8 <urldecode+0xf8>
movzbl -0x3a(%rbp),%eax
cmp    $0x66,%eax
jle    1212 <urldecode+0x112>
movzbl -0x3a(%rbp),%eax
cmp    $0x41,%eax
jl     130d <urldecode+0x20d>
movzbl -0x3a(%rbp),%eax
cmp    $0x46,%eax
jg     130d <urldecode+0x20d>
movzbl -0x39(%rbp),%eax
cmp    $0x30,%eax
jl     123b <urldecode+0x13b>
movzbl -0x39(%rbp),%eax
cmp    $0x39,%eax
jg     123b <urldecode+0x13b>
movzbl -0x39(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x40(%rbp)
jmp    1279 <urldecode+0x179>
movzbl -0x39(%rbp),%eax
cmp    $0x61,%eax
jl     1267 <urldecode+0x167>
movzbl -0x39(%rbp),%eax
cmp    $0x66,%eax
jg     1267 <urldecode+0x167>
movzbl -0x39(%rbp),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x40(%rbp)
jmp    1274 <urldecode+0x174>
movzbl -0x39(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x40(%rbp)
jmp    1279 <urldecode+0x179>
movzbl -0x3a(%rbp),%eax
cmp    $0x30,%eax
jl     12a2 <urldecode+0x1a2>
movzbl -0x3a(%rbp),%eax
cmp    $0x39,%eax
jg     12a2 <urldecode+0x1a2>
movzbl -0x3a(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x44(%rbp)
jmp    12e0 <urldecode+0x1e0>
movzbl -0x3a(%rbp),%eax
cmp    $0x61,%eax
jl     12ce <urldecode+0x1ce>
movzbl -0x3a(%rbp),%eax
cmp    $0x66,%eax
jg     12ce <urldecode+0x1ce>
movzbl -0x3a(%rbp),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x44(%rbp)
jmp    12db <urldecode+0x1db>
movzbl -0x3a(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x44(%rbp)
jmp    12e0 <urldecode+0x1e0>
mov    -0x40(%rbp),%eax
shl    $0x4,%eax
or     -0x44(%rbp),%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x28(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x28(%rbp)
jmp    1330 <urldecode+0x230>
mov    -0x28(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1390 <urldecode+0x290>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2b,%eax
jne    1368 <urldecode+0x268>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
movb   $0x20,(%rax)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    138b <urldecode+0x28b>
mov    -0x28(%rbp),%rax
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1390 <urldecode+0x290>
jmp    1132 <urldecode+0x32>
mov    -0x38(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x38(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<urldecode>:
push   %rbp
push   %rbx
mov    %rdx,%rax
test   %esi,%esi
jle    120a <urldecode+0x10a>
movslq %esi,%r10
add    %rdi,%r10
movabs $0x3f0000003f,%r8
mov    %rax,%rdx
jmp    1143 <urldecode+0x43>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %bl,(%rdx)
add    $0x1,%rdi
add    $0x1,%rdx
cmp    %r10,%rdi
jae    120a <urldecode+0x10a>
movzbl (%rdi),%ebx
cmp    $0x2b,%bl
je     11c0 <urldecode+0xc0>
cmp    $0x25,%bl
jne    1130 <urldecode+0x30>
lea    0x2(%rdi),%rsi
cmp    %r10,%rsi
jae    1130 <urldecode+0x30>
movzbl 0x1(%rdi),%r11d
movzbl 0x2(%rdi),%r9d
lea    -0x30(%r11),%esi
cmp    $0xa,%sil
jb     1183 <urldecode+0x83>
lea    -0x41(%r11),%ebx
cmp    $0x25,%bl
ja     11fe <urldecode+0xfe>
movzbl %bl,%ebx
bt     %rbx,%r8
jae    11fe <urldecode+0xfe>
lea    -0x30(%r9),%ebx
cmp    $0xa,%bl
jb     11a0 <urldecode+0xa0>
lea    -0x41(%r9),%ebp
cmp    $0x25,%bpl
ja     11fe <urldecode+0xfe>
movzbl %bpl,%ebp
bt     %rbp,%r8
jae    11fe <urldecode+0xfe>
cmp    $0xa,%sil
jb     11cf <urldecode+0xcf>
lea    -0x61(%r11),%esi
cmp    $0x5,%sil
ja     11c8 <urldecode+0xc8>
add    $0xa9,%r11b
jmp    11cc <urldecode+0xcc>
cs nopw 0x0(%rax,%rax,1)
movb   $0x20,(%rdx)
jmp    1132 <urldecode+0x32>
add    $0xc9,%r11b
mov    %r11d,%esi
cmp    $0xa,%bl
jb     11eb <urldecode+0xeb>
lea    -0x61(%r9),%ebp
cmp    $0x5,%bpl
ja     11e4 <urldecode+0xe4>
add    $0xa9,%r9b
jmp    11e8 <urldecode+0xe8>
add    $0xc9,%r9b
mov    %r9d,%ebx
shl    $0x4,%sil
or     %bl,%sil
mov    %sil,(%rdx)
add    $0x3,%rdi
jmp    1136 <urldecode+0x36>
add    $0x1,%rdi
movb   $0x25,(%rdx)
jmp    1136 <urldecode+0x36>
movb   $0x0,(%rdx)
sub    %eax,%edx
mov    %edx,(%rcx)
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define i8* @urldecode(i8* %0, i32 %1, i8* returned %2, i32* nocapture writeonly %3) {
%5 = sext i32 %1 to i64
%6 = getelementptr inbounds i8, i8* %0, i64 %5
%7 = icmp sgt i32 %1, 0
br i1 %7, label %8, label %59
8: ; preds = %4, %55
%9 = phi i8* [ %56, %55 ], [ %0, %4 ]
%10 = phi i8* [ %57, %55 ], [ %2, %4 ]
%11 = load i8, i8* %9
switch i8 %11, label %53 [
i8 37, label %12
i8 43, label %51
]
12: ; preds = %8
%13 = getelementptr inbounds i8, i8* %9, i64 2
%14 = icmp ult i8* %13, %6
br i1 %14, label %15, label %53
15: ; preds = %12
%16 = getelementptr inbounds i8, i8* %9, i64 1
%17 = load i8, i8* %16
%18 = load i8, i8* %13
%19 = freeze i8 %17
%20 = add i8 %19, -48
%21 = icmp ult i8 %20, 10
br i1 %21, label %23, label %22
22: ; preds = %15
switch i8 %19, label %50 [
i8 102, label %23
i8 101, label %23
i8 100, label %23
i8 99, label %23
i8 98, label %23
i8 97, label %23
i8 70, label %23
i8 69, label %23
i8 68, label %23
i8 67, label %23
i8 66, label %23
i8 65, label %23
]
23: ; preds = %22, %22, %22, %22, %22, %22, %22, %22, %22, %22, %22, %22, %15
%24 = freeze i8 %18
%25 = add i8 %24, -48
%26 = icmp ult i8 %25, 10
br i1 %26, label %28, label %27
27: ; preds = %23
switch i8 %24, label %50 [
i8 102, label %28
i8 101, label %28
i8 100, label %28
i8 99, label %28
i8 98, label %28
i8 97, label %28
i8 70, label %28
i8 69, label %28
i8 68, label %28
i8 67, label %28
i8 66, label %28
i8 65, label %28
]
28: ; preds = %27, %27, %27, %27, %27, %27, %27, %27, %27, %27, %27, %27, %23
br i1 %21, label %36, label %29
29: ; preds = %28
%30 = add nsw i8 %19, -97
%31 = icmp ult i8 %30, 6
br i1 %31, label %32, label %34
32: ; preds = %29
%33 = add nsw i8 %19, -87
br label %36
34: ; preds = %29
%35 = add nsw i8 %19, -55
br label %36
36: ; preds = %28, %32, %34
%37 = phi i8 [ %33, %32 ], [ %35, %34 ], [ %20, %28 ]
br i1 %26, label %45, label %38
38: ; preds = %36
%39 = add nsw i8 %24, -97
%40 = icmp ult i8 %39, 6
br i1 %40, label %41, label %43
41: ; preds = %38
%42 = add nsw i8 %24, -87
br label %45
43: ; preds = %38
%44 = add nsw i8 %24, -55
br label %45
45: ; preds = %36, %41, %43
%46 = phi i8 [ %42, %41 ], [ %44, %43 ], [ %25, %36 ]
%47 = shl i8 %37, 4
%48 = or i8 %46, %47
store i8 %48, i8* %10
%49 = getelementptr inbounds i8, i8* %9, i64 3
br label %55
50: ; preds = %27, %22
store i8 37, i8* %10
br label %55
51: ; preds = %8
store i8 32, i8* %10
%52 = getelementptr inbounds i8, i8* %9, i64 1
br label %55
53: ; preds = %8, %12
store i8 %11, i8* %10
%54 = getelementptr inbounds i8, i8* %9, i64 1
br label %55
55: ; preds = %51, %53, %45, %50
%56 = phi i8* [ %49, %45 ], [ %16, %50 ], [ %52, %51 ], [ %54, %53 ]
%57 = getelementptr inbounds i8, i8* %10, i64 1
%58 = icmp ult i8* %56, %6
br i1 %58, label %8, label %59
59: ; preds = %55, %4
%60 = phi i8* [ %2, %4 ], [ %57, %55 ]
store i8 0, i8* %60
%61 = ptrtoint i8* %60 to i64
%62 = ptrtoint i8* %2 to i64
%63 = sub i64 %61, %62
%64 = trunc i64 %63 to i32
store i32 %64, i32* %3
ret i8* %2
}