#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 */
int /*<<< orphan*/ sprintf(char *, char *, int, ...);
char *generate_filename(const char *template, char *result, int x, int y,
                        int pages, const char *extension) {
  char *a;
  const char *b;
  char *end = result + 4090;
  b = template - 1, a = result - 1;
  while ((*++a = *++b)) {
    if (a >= end)
      break;
    if (*b == '%') {
      switch (b[1]) {
      case 'x':
        a--;
        if (pages) {
          char text[8];
          char *e = text - 1;
          sprintf(text, "%i", x);
          while ((*++a = *++e))
            if (a >= end)
              break;
          a--;
        }
        b++;
        break;
      case 'y':
        a--;
        if (pages) {
          char text[8];
          char *e = text - 1;
          sprintf(text, "%i", y);
          while ((*++a = *++e))
            if (a >= end)
              break;
          a--;
        }
        b++;
        break;
      case 'c':
        a--;
        if (pages) {
          char text[8];
          char *e = text - 1;
          sprintf(text, "_%i_%i", x, y);
          while ((*++a = *++e))
            if (a >= end)
              break;
          a--;
        }
        b++;
        break;
      case 'e':
        a--;
        {
          const char *e = extension - 1;
          while ((*++a = *++e))
            if (a >= end)
              break;
          a--;
        }
        b++;
        break;
      case '%':
        a--;
        b++;
        break;
      }
      if (!*b)
        break;
    }
  }
  *a = 0;
  return result;
}


x86 assembly (clang, -O0):
<generate_filename>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x10(%rbp),%rax
add    $0xffa,%rax
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
mov    0x1(%rax),%al
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %al,0x1(%rcx)
cmp    $0x0,%al
je     147b <generate_filename+0x36b>
mov    -0x30(%rbp),%rax
cmp    -0x40(%rbp),%rax
jb     1196 <generate_filename+0x86>
jmp    147b <generate_filename+0x36b>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x25,%eax
jne    1476 <generate_filename+0x366>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
mov    %eax,-0x7c(%rbp)
sub    $0x25,%eax
je     1447 <generate_filename+0x337>
jmp    11bf <generate_filename+0xaf>
mov    -0x7c(%rbp),%eax
sub    $0x63,%eax
je     1333 <generate_filename+0x223>
jmp    11d0 <generate_filename+0xc0>
mov    -0x7c(%rbp),%eax
sub    $0x65,%eax
je     13ce <generate_filename+0x2be>
jmp    11e1 <generate_filename+0xd1>
mov    -0x7c(%rbp),%eax
sub    $0x78,%eax
je     1203 <generate_filename+0xf3>
jmp    11f2 <generate_filename+0xe2>
mov    -0x7c(%rbp),%eax
sub    $0x79,%eax
je     129b <generate_filename+0x18b>
jmp    145f <generate_filename+0x34f>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     128a <generate_filename+0x17a>
lea    -0x48(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x50(%rbp)
lea    -0x48(%rbp),%rdi
mov    -0x14(%rbp),%edx
lea    0xdd1(%rip),%rsi
mov    $0x0,%al
call   1030 <sprintf@plt>
mov    -0x50(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x50(%rbp)
mov    0x1(%rax),%al
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %al,0x1(%rcx)
cmp    $0x0,%al
je     127e <generate_filename+0x16e>
mov    -0x30(%rbp),%rax
cmp    -0x40(%rbp),%rax
jb     1279 <generate_filename+0x169>
jmp    127e <generate_filename+0x16e>
jmp    123a <generate_filename+0x12a>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    145f <generate_filename+0x34f>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1322 <generate_filename+0x212>
lea    -0x58(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x60(%rbp)
lea    -0x58(%rbp),%rdi
mov    -0x18(%rbp),%edx
lea    0xd39(%rip),%rsi
mov    $0x0,%al
call   1030 <sprintf@plt>
mov    -0x60(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x60(%rbp)
mov    0x1(%rax),%al
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %al,0x1(%rcx)
cmp    $0x0,%al
je     1316 <generate_filename+0x206>
mov    -0x30(%rbp),%rax
cmp    -0x40(%rbp),%rax
jb     1311 <generate_filename+0x201>
jmp    1316 <generate_filename+0x206>
jmp    12d2 <generate_filename+0x1c2>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    145f <generate_filename+0x34f>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     13bd <generate_filename+0x2ad>
lea    -0x68(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x70(%rbp)
lea    -0x68(%rbp),%rdi
mov    -0x14(%rbp),%edx
mov    -0x18(%rbp),%ecx
lea    0xc9a(%rip),%rsi
mov    $0x0,%al
call   1030 <sprintf@plt>
mov    -0x70(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x70(%rbp)
mov    0x1(%rax),%al
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %al,0x1(%rcx)
cmp    $0x0,%al
je     13b1 <generate_filename+0x2a1>
mov    -0x30(%rbp),%rax
cmp    -0x40(%rbp),%rax
jb     13ac <generate_filename+0x29c>
jmp    13b1 <generate_filename+0x2a1>
jmp    136d <generate_filename+0x25d>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    145f <generate_filename+0x34f>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x78(%rbp)
mov    -0x78(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x78(%rbp)
mov    0x1(%rax),%al
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %al,0x1(%rcx)
cmp    $0x0,%al
je     142a <generate_filename+0x31a>
mov    -0x30(%rbp),%rax
cmp    -0x40(%rbp),%rax
jb     1425 <generate_filename+0x315>
jmp    142a <generate_filename+0x31a>
jmp    13e6 <generate_filename+0x2d6>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    145f <generate_filename+0x34f>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1471 <generate_filename+0x361>
jmp    147b <generate_filename+0x36b>
jmp    1476 <generate_filename+0x366>
jmp    1157 <generate_filename+0x47>
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x10(%rbp),%rax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<generate_filename>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %r9,0x8(%rsp)
mov    %ecx,0x4(%rsp)
mov    %edx,(%rsp)
mov    %rsi,%rbx
mov    (%rdi),%al
mov    %al,(%rsi)
test   %al,%al
je     12fb <generate_filename+0x1eb>
mov    %r8d,%ebp
lea    -0x1(%rdi),%r15
mov    $0xffffffffffffffff,%r12
lea    0xeb2(%rip),%r14
lea    0x10(%rsp),%r13
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nop
cmpb   $0x25,(%rdi)
jne    11e0 <generate_filename+0xd0>
mov    0x2(%r15),%cl
add    $0x2,%r15
movsbl %cl,%edx
lea    -0x63(%rdx),%esi
cmp    $0x16,%esi
ja     11eb <generate_filename+0xdb>
movslq (%r14,%rsi,4),%rdx
add    %r14,%rdx
jmp    *%rdx
test   %ebp,%ebp
je     12cf <generate_filename+0x1bf>
mov    %r13,%rdi
lea    0xec9(%rip),%rsi
mov    (%rsp),%edx
mov    0x4(%rsp),%ecx
xor    %eax,%eax
call   1030 <sprintf@plt>
mov    %r13,%rcx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl (%rcx),%edx
lea    0x1(%r12),%rax
mov    %dl,0x1(%rbx,%r12,1)
test   %dl,%dl
je     12c0 <generate_filename+0x1b0>
add    $0x1,%rcx
cmp    $0xff9,%r12
mov    %rax,%r12
jl     11b0 <generate_filename+0xa0>
jmp    12c0 <generate_filename+0x1b0>
nopw   0x0(%rax,%rax,1)
mov    %rdi,%r15
mov    %rax,%r12
jmp    12d6 <generate_filename+0x1c6>
cmp    $0x25,%edx
jne    12c7 <generate_filename+0x1b7>
jmp    12cf <generate_filename+0x1bf>
mov    0x8(%rsp),%rcx
xchg   %ax,%ax
movzbl (%rcx),%edx
lea    0x1(%r12),%rax
mov    %dl,0x1(%rbx,%r12,1)
test   %dl,%dl
je     12c0 <generate_filename+0x1b0>
add    $0x1,%rcx
cmp    $0xff9,%r12
mov    %rax,%r12
jl     1200 <generate_filename+0xf0>
jmp    12c0 <generate_filename+0x1b0>
test   %ebp,%ebp
je     12cf <generate_filename+0x1bf>
mov    %r13,%rdi
lea    0xe24(%rip),%rsi
mov    (%rsp),%edx
xor    %eax,%eax
call   1030 <sprintf@plt>
mov    %r13,%rcx
nopl   0x0(%rax)
movzbl (%rcx),%edx
lea    0x1(%r12),%rax
mov    %dl,0x1(%rbx,%r12,1)
test   %dl,%dl
je     12c0 <generate_filename+0x1b0>
add    $0x1,%rcx
cmp    $0xff9,%r12
mov    %rax,%r12
jl     1250 <generate_filename+0x140>
jmp    12c0 <generate_filename+0x1b0>
test   %ebp,%ebp
je     12cf <generate_filename+0x1bf>
mov    %r13,%rdi
lea    0xddf(%rip),%rsi
mov    0x4(%rsp),%edx
xor    %eax,%eax
call   1030 <sprintf@plt>
mov    %r13,%rcx
nop
movzbl (%rcx),%edx
lea    0x1(%r12),%rax
mov    %dl,0x1(%rbx,%r12,1)
test   %dl,%dl
je     12c0 <generate_filename+0x1b0>
add    $0x1,%rcx
cmp    $0xff9,%r12
mov    %rax,%r12
jl     1290 <generate_filename+0x180>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0xffffffffffffffff,%rax
mov    %r15,%rdi
mov    (%rdi),%cl
mov    %rdi,%r15
mov    %rax,%r12
mov    %r12,%rax
test   %cl,%cl
je     12fd <generate_filename+0x1ed>
mov    0x1(%r15),%cl
lea    0x1(%r12),%rax
mov    %cl,0x1(%rbx,%r12,1)
test   %cl,%cl
je     12fd <generate_filename+0x1ed>
lea    0x1(%r15),%rdi
cmp    $0xff9,%r12
jl     1160 <generate_filename+0x50>
jmp    12fd <generate_filename+0x1ed>
xor    %eax,%eax
movb   $0x0,(%rbx,%rax,1)
mov    %rbx,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [3 x i8] c"%i\00"
@.str.1 = [7 x i8] c"_%i_%i\00"
define i8* @generate_filename(i8* nocapture %0, i8* returned writeonly %1, i32 %2, i32 %3, i32 %4, i8* nocapture %5) {
%7 = alloca [8 x i8]
%8 = alloca [8 x i8]
%9 = alloca [8 x i8]
%10 = load i8, i8* %0
store i8 %10, i8* %1
%11 = icmp eq i8 %10, 0
br i1 %11, label %104, label %12
12: ; preds = %6
%13 = getelementptr inbounds i8, i8* %0, i64 -1
%14 = getelementptr inbounds i8, i8* %5, i64 -1
%15 = icmp eq i32 %4, 0
%16 = getelementptr inbounds [8 x i8], [8 x i8]* %9, i64 0, i64 0
%17 = getelementptr inbounds [8 x i8], [8 x i8]* %9, i64 0, i64 -1
%18 = getelementptr inbounds [8 x i8], [8 x i8]* %8, i64 0, i64 0
%19 = getelementptr inbounds [8 x i8], [8 x i8]* %8, i64 0, i64 -1
%20 = getelementptr inbounds [8 x i8], [8 x i8]* %7, i64 0, i64 0
%21 = getelementptr inbounds [8 x i8], [8 x i8]* %7, i64 0, i64 -1
br label %22
22: ; preds = %12, %94
%23 = phi i64 [ 0, %12 ], [ %99, %94 ]
%24 = phi i8* [ %0, %12 ], [ %97, %94 ]
%25 = phi i64 [ -1, %12 ], [ %96, %94 ]
%26 = phi i8* [ %13, %12 ], [ %95, %94 ]
%27 = load i8, i8* %24
%28 = icmp eq i8 %27, 37
br i1 %28, label %29, label %94
29: ; preds = %22
%30 = getelementptr inbounds i8, i8* %26, i64 2
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
switch i32 %32, label %85 [
i32 120, label %33
i32 121, label %47
i32 99, label %61
i32 101, label %75
i32 37, label %89
]
33: ; preds = %29
br i1 %15, label %89, label %34
34: ; preds = %33
%35 = call i32 (i8*, i8*, i32, ...) @sprintf(i8* %20, i8* dereferenceable(1) getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i32 %2)
br label %36
36: ; preds = %36, %34
%37 = phi i64 [ %25, %34 ], [ %41, %36 ]
%38 = phi i8* [ %21, %34 ], [ %39, %36 ]
%39 = getelementptr inbounds i8, i8* %38, i64 1
%40 = load i8, i8* %39
%41 = add nsw i64 %37, 1
%42 = getelementptr inbounds i8, i8* %1, i64 %41
store i8 %40, i8* %42
%43 = icmp ne i8 %40, 0
%44 = icmp slt i64 %37, 4089
%45 = select i1 %43, i1 %44, i1 false
br i1 %45, label %36, label %46
46: ; preds = %36
br label %85
47: ; preds = %29
br i1 %15, label %89, label %48
48: ; preds = %47
%49 = call i32 (i8*, i8*, i32, ...) @sprintf(i8* %18, i8* dereferenceable(1) getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i32 %3)
br label %50
50: ; preds = %50, %48
%51 = phi i64 [ %25, %48 ], [ %55, %50 ]
%52 = phi i8* [ %19, %48 ], [ %53, %50 ]
%53 = getelementptr inbounds i8, i8* %52, i64 1
%54 = load i8, i8* %53
%55 = add nsw i64 %51, 1
%56 = getelementptr inbounds i8, i8* %1, i64 %55
store i8 %54, i8* %56
%57 = icmp ne i8 %54, 0
%58 = icmp slt i64 %51, 4089
%59 = select i1 %57, i1 %58, i1 false
br i1 %59, label %50, label %60
60: ; preds = %50
br label %85
61: ; preds = %29
br i1 %15, label %89, label %62
62: ; preds = %61
%63 = call i32 (i8*, i8*, i32, ...) @sprintf(i8* %16, i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 %2, i32 %3)
br label %64
64: ; preds = %64, %62
%65 = phi i64 [ %25, %62 ], [ %69, %64 ]
%66 = phi i8* [ %17, %62 ], [ %67, %64 ]
%67 = getelementptr inbounds i8, i8* %66, i64 1
%68 = load i8, i8* %67
%69 = add nsw i64 %65, 1
%70 = getelementptr inbounds i8, i8* %1, i64 %69
store i8 %68, i8* %70
%71 = icmp ne i8 %68, 0
%72 = icmp slt i64 %65, 4089
%73 = select i1 %71, i1 %72, i1 false
br i1 %73, label %64, label %74
74: ; preds = %64
br label %85
75: ; preds = %29, %75
%76 = phi i64 [ %80, %75 ], [ %25, %29 ]
%77 = phi i8* [ %78, %75 ], [ %14, %29 ]
%78 = getelementptr inbounds i8, i8* %77, i64 1
%79 = load i8, i8* %78
%80 = add nsw i64 %76, 1
%81 = getelementptr inbounds i8, i8* %1, i64 %80
store i8 %79, i8* %81
%82 = icmp ne i8 %79, 0
%83 = icmp slt i64 %76, 4089
%84 = select i1 %82, i1 %83, i1 false
br i1 %84, label %75, label %85
85: ; preds = %75, %29, %46, %60, %74
%86 = phi i8* [ %30, %74 ], [ %30, %60 ], [ %30, %46 ], [ %24, %29 ], [ %30, %75 ]
%87 = phi i64 [ %65, %74 ], [ %51, %60 ], [ %37, %46 ], [ %23, %29 ], [ %76, %75 ]
%88 = load i8, i8* %86
br label %89
89: ; preds = %29, %85, %61, %47, %33
%90 = phi i8 [ %88, %85 ], [ %31, %61 ], [ %31, %47 ], [ %31, %33 ], [ %31, %29 ]
%91 = phi i8* [ %86, %85 ], [ %30, %61 ], [ %30, %47 ], [ %30, %33 ], [ %30, %29 ]
%92 = phi i64 [ %87, %85 ], [ %25, %61 ], [ %25, %47 ], [ %25, %33 ], [ %25, %29 ]
%93 = icmp eq i8 %90, 0
br i1 %93, label %104, label %94
94: ; preds = %89, %22
%95 = phi i8* [ %91, %89 ], [ %24, %22 ]
%96 = phi i64 [ %92, %89 ], [ %23, %22 ]
%97 = getelementptr inbounds i8, i8* %95, i64 1
%98 = load i8, i8* %97
%99 = add nsw i64 %96, 1
%100 = getelementptr inbounds i8, i8* %1, i64 %99
store i8 %98, i8* %100
%101 = icmp ne i8 %98, 0
%102 = icmp slt i64 %96, 4089
%103 = select i1 %101, i1 %102, i1 false
br i1 %103, label %22, label %104
104: ; preds = %94, %89, %6
%105 = phi i64 [ 0, %6 ], [ %99, %94 ], [ %92, %89 ]
%106 = getelementptr inbounds i8, i8* %1, i64 %105
store i8 0, i8* %106
ret i8* %1
}