#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 */
char *malloc(int);
int /*<<< orphan*/ memcpy(char *, char *, int);
int strlen(char *);
char *cache_filename(char *host, char *uri) {
  char *CACHE_PATH = "./cache_files/", *filename = 0;
  int i, j, size = 0;
  for (i = 0; host[i] != 0; ++i) {
    if (host[i] == '%' || host[i] == '/') {
      size += 2;
    }
  }
  size += i;
  for (i = 0; uri[i] != 0; ++i) {
    if (uri[i] == '%' || uri[i] == '/') {
      size += 2;
    }
  }
  size += i;
  j = strlen(CACHE_PATH);
  filename = malloc(sizeof(*filename) * (j + size + 1));
  filename[j + size] = 0;
  memcpy(filename, CACHE_PATH, j);
  for (i = 0; host[i] != 0; ++i, ++j) {
    if (host[i] == '%') {
      filename[j] = '%';
      filename[j + 1] = '2';
      filename[j + 2] = '5';
      j += 2;
    } else if (host[i] == '/') {
      filename[j] = '%';
      filename[j + 1] = '2';
      filename[j + 2] = 'F';
      j += 2;
    } else {
      filename[j] = host[i];
    }
  }
  for (i = 0; uri[i] != 0; ++i, ++j) {
    if (uri[i] == '%') {
      filename[j] = '%';
      filename[j + 1] = '2';
      filename[j + 2] = '5';
      j += 2;
    } else if (uri[i] == '/') {
      filename[j] = '%';
      filename[j + 1] = '2';
      filename[j + 2] = 'F';
      j += 2;
    } else {
      filename[j] = uri[i];
    }
  }
  return filename;
}


x86 assembly (clang, -O0):
<cache_filename>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
lea    0xeb9(%rip),%rax
mov    %rax,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     11bc <cache_filename+0x8c>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
je     11a0 <cache_filename+0x70>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
jne    11a9 <cache_filename+0x79>
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    11ae <cache_filename+0x7e>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1161 <cache_filename+0x31>
mov    -0x24(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1227 <cache_filename+0xf7>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
je     120b <cache_filename+0xdb>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
jne    1214 <cache_filename+0xe4>
mov    -0x2c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x2c(%rbp)
jmp    1219 <cache_filename+0xe9>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11cc <cache_filename+0x9c>
mov    -0x24(%rbp),%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x18(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
add    -0x2c(%rbp),%eax
add    $0x1,%eax
cltq
shl    $0x0,%rax
mov    %eax,%edi
call   1050 <malloc@plt>
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    -0x2c(%rbp),%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x20(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x28(%rbp),%edx
call   1040 <memcpy@plt>
movl   $0x0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     136c <cache_filename+0x23c>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
jne    12e4 <cache_filename+0x1b4>
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
movb   $0x25,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x32,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movb   $0x35,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x28(%rbp)
jmp    1350 <cache_filename+0x220>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
jne    1335 <cache_filename+0x205>
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
movb   $0x25,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x32,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movb   $0x46,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x28(%rbp)
jmp    134b <cache_filename+0x21b>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1350 <cache_filename+0x220>
jmp    1355 <cache_filename+0x225>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    127e <cache_filename+0x14e>
movl   $0x0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1461 <cache_filename+0x331>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
jne    13d9 <cache_filename+0x2a9>
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
movb   $0x25,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x32,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movb   $0x35,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x28(%rbp)
jmp    1445 <cache_filename+0x315>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
jne    142a <cache_filename+0x2fa>
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
movb   $0x25,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x32,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movb   $0x46,(%rax,%rcx,1)
mov    -0x28(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x28(%rbp)
jmp    1440 <cache_filename+0x310>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1445 <cache_filename+0x315>
jmp    144a <cache_filename+0x31a>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1373 <cache_filename+0x243>
mov    -0x20(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cache_filename>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%r15
xor    %eax,%eax
xor    %r13d,%r13d
jmp    1158 <cache_filename+0x28>
nopl   0x0(%rax,%rax,1)
add    $0x2,%r13d
add    $0x1,%rax
movzbl (%r15,%rax,1),%ecx
cmp    $0x25,%cl
je     1150 <cache_filename+0x20>
cmp    $0x2f,%cl
je     1150 <cache_filename+0x20>
test   %cl,%cl
jne    1154 <cache_filename+0x24>
add    %eax,%r13d
xor    %ebp,%ebp
jmp    1188 <cache_filename+0x58>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x2,%r13d
add    $0x1,%rbp
movzbl (%r14,%rbp,1),%eax
cmp    $0x25,%al
je     1180 <cache_filename+0x50>
cmp    $0x2f,%al
je     1180 <cache_filename+0x50>
test   %al,%al
jne    1184 <cache_filename+0x54>
lea    0xe60(%rip),%rdi
call   1030 <strlen@plt>
mov    %eax,%ebx
add    %eax,%r13d
add    %rbp,%r13
lea    0x1(%r13),%edi
call   1050 <malloc@plt>
mov    %rax,%r12
movslq %r13d,%rax
movb   $0x0,(%r12,%rax,1)
mov    %r12,%rdi
lea    0xe35(%rip),%rsi
mov    %ebx,%edx
call   1040 <memcpy@plt>
jmp    11fd <cache_filename+0xcd>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    $0x46,%al
movslq %ebx,%rbx
movw   $0x3225,(%r12,%rbx,1)
add    $0x2,%ebx
movslq %ebx,%rbx
mov    %al,(%r12,%rbx,1)
add    $0x1,%ebx
add    $0x1,%r15
movzbl (%r15),%eax
cmp    $0x25,%al
je     1210 <cache_filename+0xe0>
cmp    $0x2f,%al
je     11e0 <cache_filename+0xb0>
test   %al,%al
jne    11ef <cache_filename+0xbf>
jmp    123d <cache_filename+0x10d>
nop
mov    $0x35,%al
jmp    11e2 <cache_filename+0xb2>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    $0x46,%al
movslq %ebx,%rbx
movw   $0x3225,(%r12,%rbx,1)
add    $0x2,%ebx
movslq %ebx,%rbx
mov    %al,(%r12,%rbx,1)
add    $0x1,%ebx
add    $0x1,%r14
movzbl (%r14),%eax
cmp    $0x25,%al
je     1250 <cache_filename+0x120>
cmp    $0x2f,%al
je     1220 <cache_filename+0xf0>
test   %al,%al
jne    122f <cache_filename+0xff>
jmp    1254 <cache_filename+0x124>
nop
mov    $0x35,%al
jmp    1222 <cache_filename+0xf2>
mov    %r12,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [15 x i8] c"./cache_files/\00"
define i8* @cache_filename(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %3
store i8* %1, i8** %4
store i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0), i8** %5
store i8* null, i8** %6
store i32 0, i32* %9
store i32 0, i32* %7
br label %10
10: ; preds = %38, %2
%11 = load i8*, i8** %3
%12 = load i32, i32* %7
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i8, i8* %11, i64 %13
%15 = load i8, i8* %14
%16 = sext i8 %15 to i32
%17 = icmp ne i32 %16, 0
br i1 %17, label %18, label %41
18: ; preds = %10
%19 = load i8*, i8** %3
%20 = load i32, i32* %7
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds i8, i8* %19, i64 %21
%23 = load i8, i8* %22
%24 = sext i8 %23 to i32
%25 = icmp eq i32 %24, 37
br i1 %25, label %34, label %26
26: ; preds = %18
%27 = load i8*, i8** %3
%28 = load i32, i32* %7
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i8, i8* %27, i64 %29
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
%33 = icmp eq i32 %32, 47
br i1 %33, label %34, label %37
34: ; preds = %26, %18
%35 = load i32, i32* %9
%36 = add nsw i32 %35, 2
store i32 %36, i32* %9
br label %37
37: ; preds = %34, %26
br label %38
38: ; preds = %37
%39 = load i32, i32* %7
%40 = add nsw i32 %39, 1
store i32 %40, i32* %7
br label %10
41: ; preds = %10
%42 = load i32, i32* %7
%43 = load i32, i32* %9
%44 = add nsw i32 %43, %42
store i32 %44, i32* %9
store i32 0, i32* %7
br label %45
45: ; preds = %73, %41
%46 = load i8*, i8** %4
%47 = load i32, i32* %7
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %46, i64 %48
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = icmp ne i32 %51, 0
br i1 %52, label %53, label %76
53: ; preds = %45
%54 = load i8*, i8** %4
%55 = load i32, i32* %7
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i8, i8* %54, i64 %56
%58 = load i8, i8* %57
%59 = sext i8 %58 to i32
%60 = icmp eq i32 %59, 37
br i1 %60, label %69, label %61
61: ; preds = %53
%62 = load i8*, i8** %4
%63 = load i32, i32* %7
%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 = icmp eq i32 %67, 47
br i1 %68, label %69, label %72
69: ; preds = %61, %53
%70 = load i32, i32* %9
%71 = add nsw i32 %70, 2
store i32 %71, i32* %9
br label %72
72: ; preds = %69, %61
br label %73
73: ; preds = %72
%74 = load i32, i32* %7
%75 = add nsw i32 %74, 1
store i32 %75, i32* %7
br label %45
76: ; preds = %45
%77 = load i32, i32* %7
%78 = load i32, i32* %9
%79 = add nsw i32 %78, %77
store i32 %79, i32* %9
%80 = load i8*, i8** %5
%81 = call i32 @strlen(i8* %80)
store i32 %81, i32* %8
%82 = load i32, i32* %8
%83 = load i32, i32* %9
%84 = add nsw i32 %82, %83
%85 = add nsw i32 %84, 1
%86 = sext i32 %85 to i64
%87 = mul i64 1, %86
%88 = trunc i64 %87 to i32
%89 = call i8* @malloc(i32 %88)
store i8* %89, i8** %6
%90 = load i8*, i8** %6
%91 = load i32, i32* %8
%92 = load i32, i32* %9
%93 = add nsw i32 %91, %92
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds i8, i8* %90, i64 %94
store i8 0, i8* %95
%96 = load i8*, i8** %6
%97 = load i8*, i8** %5
%98 = load i32, i32* %8
%99 = call i32 @memcpy(i8* %96, i8* %97, i32 %98)
store i32 0, i32* %7
br label %100
100: ; preds = %170, %76
%101 = load i8*, i8** %3
%102 = load i32, i32* %7
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8, i8* %101, i64 %103
%105 = load i8, i8* %104
%106 = sext i8 %105 to i32
%107 = icmp ne i32 %106, 0
br i1 %107, label %108, label %175
108: ; preds = %100
%109 = load i8*, i8** %3
%110 = load i32, i32* %7
%111 = sext i32 %110 to i64
%112 = getelementptr inbounds i8, i8* %109, i64 %111
%113 = load i8, i8* %112
%114 = sext i8 %113 to i32
%115 = icmp eq i32 %114, 37
br i1 %115, label %116, label %133
116: ; preds = %108
%117 = load i8*, i8** %6
%118 = load i32, i32* %8
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds i8, i8* %117, i64 %119
store i8 37, i8* %120
%121 = load i8*, i8** %6
%122 = load i32, i32* %8
%123 = add nsw i32 %122, 1
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds i8, i8* %121, i64 %124
store i8 50, i8* %125
%126 = load i8*, i8** %6
%127 = load i32, i32* %8
%128 = add nsw i32 %127, 2
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds i8, i8* %126, i64 %129
store i8 53, i8* %130
%131 = load i32, i32* %8
%132 = add nsw i32 %131, 2
store i32 %132, i32* %8
br label %169
133: ; preds = %108
%134 = load i8*, i8** %3
%135 = load i32, i32* %7
%136 = sext i32 %135 to i64
%137 = getelementptr inbounds i8, i8* %134, i64 %136
%138 = load i8, i8* %137
%139 = sext i8 %138 to i32
%140 = icmp eq i32 %139, 47
br i1 %140, label %141, label %158
141: ; preds = %133
%142 = load i8*, i8** %6
%143 = load i32, i32* %8
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i8, i8* %142, i64 %144
store i8 37, i8* %145
%146 = load i8*, i8** %6
%147 = load i32, i32* %8
%148 = add nsw i32 %147, 1
%149 = sext i32 %148 to i64
%150 = getelementptr inbounds i8, i8* %146, i64 %149
store i8 50, i8* %150
%151 = load i8*, i8** %6
%152 = load i32, i32* %8
%153 = add nsw i32 %152, 2
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds i8, i8* %151, i64 %154
store i8 70, i8* %155
%156 = load i32, i32* %8
%157 = add nsw i32 %156, 2
store i32 %157, i32* %8
br label %168
158: ; preds = %133
%159 = load i8*, i8** %3
%160 = load i32, i32* %7
%161 = sext i32 %160 to i64
%162 = getelementptr inbounds i8, i8* %159, i64 %161
%163 = load i8, i8* %162
%164 = load i8*, i8** %6
%165 = load i32, i32* %8
%166 = sext i32 %165 to i64
%167 = getelementptr inbounds i8, i8* %164, i64 %166
store i8 %163, i8* %167
br label %168
168: ; preds = %158, %141
br label %169
169: ; preds = %168, %116
br label %170
170: ; preds = %169
%171 = load i32, i32* %7
%172 = add nsw i32 %171, 1
store i32 %172, i32* %7
%173 = load i32, i32* %8
%174 = add nsw i32 %173, 1
store i32 %174, i32* %8
br label %100
175: ; preds = %100
store i32 0, i32* %7
br label %176
176: ; preds = %246, %175
%177 = load i8*, i8** %4
%178 = load i32, i32* %7
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds i8, i8* %177, i64 %179
%181 = load i8, i8* %180
%182 = sext i8 %181 to i32
%183 = icmp ne i32 %182, 0
br i1 %183, label %184, label %251
184: ; preds = %176
%185 = load i8*, i8** %4
%186 = load i32, i32* %7
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds i8, i8* %185, i64 %187
%189 = load i8, i8* %188
%190 = sext i8 %189 to i32
%191 = icmp eq i32 %190, 37
br i1 %191, label %192, label %209
192: ; preds = %184
%193 = load i8*, i8** %6
%194 = load i32, i32* %8
%195 = sext i32 %194 to i64
%196 = getelementptr inbounds i8, i8* %193, i64 %195
store i8 37, i8* %196
%197 = load i8*, i8** %6
%198 = load i32, i32* %8
%199 = add nsw i32 %198, 1
%200 = sext i32 %199 to i64
%201 = getelementptr inbounds i8, i8* %197, i64 %200
store i8 50, i8* %201
%202 = load i8*, i8** %6
%203 = load i32, i32* %8
%204 = add nsw i32 %203, 2
%205 = sext i32 %204 to i64
%206 = getelementptr inbounds i8, i8* %202, i64 %205
store i8 53, i8* %206
%207 = load i32, i32* %8
%208 = add nsw i32 %207, 2
store i32 %208, i32* %8
br label %245
209: ; preds = %184
%210 = load i8*, i8** %4
%211 = load i32, i32* %7
%212 = sext i32 %211 to i64
%213 = getelementptr inbounds i8, i8* %210, i64 %212
%214 = load i8, i8* %213
%215 = sext i8 %214 to i32
%216 = icmp eq i32 %215, 47
br i1 %216, label %217, label %234
217: ; preds = %209
%218 = load i8*, i8** %6
%219 = load i32, i32* %8
%220 = sext i32 %219 to i64
%221 = getelementptr inbounds i8, i8* %218, i64 %220
store i8 37, i8* %221
%222 = load i8*, i8** %6
%223 = load i32, i32* %8
%224 = add nsw i32 %223, 1
%225 = sext i32 %224 to i64
%226 = getelementptr inbounds i8, i8* %222, i64 %225
store i8 50, i8* %226
%227 = load i8*, i8** %6
%228 = load i32, i32* %8
%229 = add nsw i32 %228, 2
%230 = sext i32 %229 to i64
%231 = getelementptr inbounds i8, i8* %227, i64 %230
store i8 70, i8* %231
%232 = load i32, i32* %8
%233 = add nsw i32 %232, 2
store i32 %233, i32* %8
br label %244
234: ; preds = %209
%235 = load i8*, i8** %4
%236 = load i32, i32* %7
%237 = sext i32 %236 to i64
%238 = getelementptr inbounds i8, i8* %235, i64 %237
%239 = load i8, i8* %238
%240 = load i8*, i8** %6
%241 = load i32, i32* %8
%242 = sext i32 %241 to i64
%243 = getelementptr inbounds i8, i8* %240, i64 %242
store i8 %239, i8* %243
br label %244
244: ; preds = %234, %217
br label %245
245: ; preds = %244, %192
br label %246
246: ; preds = %245
%247 = load i32, i32* %7
%248 = add nsw i32 %247, 1
store i32 %248, i32* %7
%249 = load i32, i32* %8
%250 = add nsw i32 %249, 1
store i32 %250, i32* %8
br label %176
251: ; preds = %176
%252 = load i8*, i8** %6
ret i8* %252
}

LLVM IR (-O2):
@.str = [15 x i8] c"./cache_files/\00"
define i8* @cache_filename(i8* nocapture %0, i8* nocapture %1) {
br label %3
3: ; preds = %10, %2
%4 = phi i64 [ %12, %10 ], [ 0, %2 ]
%5 = phi i32 [ %11, %10 ], [ 0, %2 ]
%6 = getelementptr inbounds i8, i8* %0, i64 %4
%7 = load i8, i8* %6
switch i8 %7, label %10 [
i8 0, label %13
i8 37, label %8
i8 47, label %8
]
8: ; preds = %3, %3
%9 = add nsw i32 %5, 2
br label %10
10: ; preds = %3, %8
%11 = phi i32 [ %9, %8 ], [ %5, %3 ]
%12 = add nuw i64 %4, 1
br label %3
13: ; preds = %3
%14 = trunc i64 %4 to i32
%15 = add nsw i32 %5, %14
br label %16
16: ; preds = %23, %13
%17 = phi i64 [ %25, %23 ], [ 0, %13 ]
%18 = phi i32 [ %24, %23 ], [ %15, %13 ]
%19 = getelementptr inbounds i8, i8* %1, i64 %17
%20 = load i8, i8* %19
switch i8 %20, label %23 [
i8 0, label %26
i8 37, label %21
i8 47, label %21
]
21: ; preds = %16, %16
%22 = add nsw i32 %18, 2
br label %23
23: ; preds = %16, %21
%24 = phi i32 [ %22, %21 ], [ %18, %16 ]
%25 = add nuw i64 %17, 1
br label %16
26: ; preds = %16
%27 = trunc i64 %17 to i32
%28 = add nsw i32 %18, %27
%29 = tail call i32 @strlen(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0))
%30 = add nsw i32 %28, %29
%31 = add nsw i32 %30, 1
%32 = tail call i8* @malloc(i32 %31)
%33 = sext i32 %30 to i64
%34 = getelementptr inbounds i8, i8* %32, i64 %33
store i8 0, i8* %34
%35 = tail call i32 @memcpy(i8* %32, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i64 0, i64 0), i32 %29)
br label %36
36: ; preds = %50, %26
%37 = phi i64 [ %55, %50 ], [ 0, %26 ]
%38 = phi i32 [ %56, %50 ], [ %29, %26 ]
%39 = getelementptr inbounds i8, i8* %0, i64 %37
%40 = load i8, i8* %39
switch i8 %40, label %50 [
i8 0, label %57
i8 37, label %42
i8 47, label %41
]
41: ; preds = %36
br label %42
42: ; preds = %36, %41
%43 = phi i8 [ 70, %41 ], [ 53, %36 ]
%44 = sext i32 %38 to i64
%45 = getelementptr inbounds i8, i8* %32, i64 %44
store i8 37, i8* %45
%46 = add nsw i32 %38, 1
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i8, i8* %32, i64 %47
store i8 50, i8* %48
%49 = add nsw i32 %38, 2
br label %50
50: ; preds = %42, %36
%51 = phi i32 [ %38, %36 ], [ %49, %42 ]
%52 = phi i8 [ %40, %36 ], [ %43, %42 ]
%53 = sext i32 %51 to i64
%54 = getelementptr inbounds i8, i8* %32, i64 %53
store i8 %52, i8* %54
%55 = add nuw i64 %37, 1
%56 = add nsw i32 %51, 1
br label %36
57: ; preds = %36, %71
%58 = phi i64 [ %76, %71 ], [ 0, %36 ]
%59 = phi i32 [ %77, %71 ], [ %38, %36 ]
%60 = getelementptr inbounds i8, i8* %1, i64 %58
%61 = load i8, i8* %60
switch i8 %61, label %71 [
i8 0, label %78
i8 37, label %63
i8 47, label %62
]
62: ; preds = %57
br label %63
63: ; preds = %57, %62
%64 = phi i8 [ 70, %62 ], [ 53, %57 ]
%65 = sext i32 %59 to i64
%66 = getelementptr inbounds i8, i8* %32, i64 %65
store i8 37, i8* %66
%67 = add nsw i32 %59, 1
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds i8, i8* %32, i64 %68
store i8 50, i8* %69
%70 = add nsw i32 %59, 2
br label %71
71: ; preds = %63, %57
%72 = phi i32 [ %59, %57 ], [ %70, %63 ]
%73 = phi i8 [ %61, %57 ], [ %64, %63 ]
%74 = sext i32 %72 to i64
%75 = getelementptr inbounds i8, i8* %32, i64 %74
store i8 %73, i8* %75
%76 = add nuw i64 %58, 1
%77 = add nsw i32 %72, 1
br label %57
78: ; preds = %57
ret i8* %32
}