#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 strlen(char *);
char *regexp_infx2postfx(char *infx) {
  size_t alternate_cnt = 0, atomic_cnt = 0;
  static char buffer[8192];
  char *dest = buffer;
  struct {
    size_t alternate_cnt;
    size_t atomic_cnt;
  } subexpr_stack[100], *stack_ptr;
  stack_ptr = subexpr_stack;
  if (strlen(infx) >= 8192 / 2) {
    return NULL;
  }
  for (; *infx; infx++) {
    switch (*infx) {
    case '(':
      if (atomic_cnt > 1) {
        atomic_cnt--;
        *dest++ = 16;
      }
      if (stack_ptr >= subexpr_stack + 100) {
        return NULL;
      }
      stack_ptr->alternate_cnt = alternate_cnt;
      stack_ptr->atomic_cnt = atomic_cnt;
      stack_ptr++;
      alternate_cnt = 0;
      atomic_cnt = 0;
      break;
    case ')':
      if (stack_ptr == subexpr_stack) {
        return NULL;
      }
      if (atomic_cnt == 0) {
        return NULL;
      }
      while (--atomic_cnt > 0) {
        *dest++ = 16;
      }
      for (; alternate_cnt > 0; alternate_cnt--) {
        *dest++ = '|';
      }
      stack_ptr--;
      alternate_cnt = stack_ptr->alternate_cnt;
      atomic_cnt = stack_ptr->atomic_cnt;
      atomic_cnt++;
      break;
    case '|':
      if (atomic_cnt == 0) {
        return NULL;
      }
      while (--atomic_cnt > 0) {
        *dest++ = 16;
      }
      alternate_cnt++;
      break;
    case '*':
    case '+':
    case '?':
      if (atomic_cnt == 0) {
        return NULL;
      }
      *dest++ = *infx;
      break;
    default:
      if (atomic_cnt > 1) {
        atomic_cnt--;
        *dest++ = 16;
      }
      *dest++ = *infx;
      atomic_cnt++;
      break;
    }
  }
  if (stack_ptr != subexpr_stack) {
    return NULL;
  }
  while (--atomic_cnt > 0) {
    *dest++ = 16;
  }
  for (; alternate_cnt > 0; alternate_cnt--) {
    *dest++ = '|';
  }
  *dest = 0;
  return buffer;
}


x86 assembly (clang, -O0):
<regexp_infx2postfx>:
push   %rbp
mov    %rsp,%rbp
sub    $0x680,%rsp
mov    %rdi,-0x10(%rbp)
movq   $0x0,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
lea    0x2f0a(%rip),%rax
mov    %rax,-0x28(%rbp)
lea    -0x670(%rbp),%rax
mov    %rax,-0x678(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0x1000,%eax
jl     1169 <regexp_infx2postfx+0x59>
movq   $0x0,-0x8(%rbp)
jmp    14ee <regexp_infx2postfx+0x3de>
jmp    116e <regexp_infx2postfx+0x5e>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     1453 <regexp_infx2postfx+0x343>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x67c(%rbp)
sub    $0x28,%eax
je     11e9 <regexp_infx2postfx+0xd9>
jmp    1196 <regexp_infx2postfx+0x86>
mov    -0x67c(%rbp),%eax
sub    $0x29,%eax
je     1281 <regexp_infx2postfx+0x171>
jmp    11aa <regexp_infx2postfx+0x9a>
mov    -0x67c(%rbp),%eax
add    $0xffffffd6,%eax
sub    $0x2,%eax
jb     13bd <regexp_infx2postfx+0x2ad>
jmp    11c1 <regexp_infx2postfx+0xb1>
mov    -0x67c(%rbp),%eax
sub    $0x3f,%eax
je     13bd <regexp_infx2postfx+0x2ad>
jmp    11d5 <regexp_infx2postfx+0xc5>
mov    -0x67c(%rbp),%eax
sub    $0x7c,%eax
je     1362 <regexp_infx2postfx+0x252>
jmp    13f1 <regexp_infx2postfx+0x2e1>
cmpq   $0x1,-0x20(%rbp)
jbe    1212 <regexp_infx2postfx+0x102>
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x10,(%rax)
mov    -0x678(%rbp),%rax
lea    -0x670(%rbp),%rcx
add    $0x640,%rcx
cmp    %rcx,%rax
jb     123d <regexp_infx2postfx+0x12d>
movq   $0x0,-0x8(%rbp)
jmp    14ee <regexp_infx2postfx+0x3de>
mov    -0x18(%rbp),%rcx
mov    -0x678(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rcx
mov    -0x678(%rbp),%rax
mov    %rcx,0x8(%rax)
mov    -0x678(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x678(%rbp)
movq   $0x0,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
jmp    143d <regexp_infx2postfx+0x32d>
mov    -0x678(%rbp),%rax
lea    -0x670(%rbp),%rcx
cmp    %rcx,%rax
jne    12a5 <regexp_infx2postfx+0x195>
movq   $0x0,-0x8(%rbp)
jmp    14ee <regexp_infx2postfx+0x3de>
cmpq   $0x0,-0x20(%rbp)
jne    12bd <regexp_infx2postfx+0x1ad>
movq   $0x0,-0x8(%rbp)
jmp    14ee <regexp_infx2postfx+0x3de>
jmp    12c2 <regexp_infx2postfx+0x1b2>
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
jbe    12ef <regexp_infx2postfx+0x1df>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x10,(%rax)
jmp    12c2 <regexp_infx2postfx+0x1b2>
jmp    12f4 <regexp_infx2postfx+0x1e4>
cmpq   $0x0,-0x18(%rbp)
jbe    1322 <regexp_infx2postfx+0x212>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x7c,(%rax)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    12f4 <regexp_infx2postfx+0x1e4>
mov    -0x678(%rbp),%rax
add    $0xfffffffffffffff0,%rax
mov    %rax,-0x678(%rbp)
mov    -0x678(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x18(%rbp)
mov    -0x678(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    143d <regexp_infx2postfx+0x32d>
cmpq   $0x0,-0x20(%rbp)
jne    137a <regexp_infx2postfx+0x26a>
movq   $0x0,-0x8(%rbp)
jmp    14ee <regexp_infx2postfx+0x3de>
jmp    137f <regexp_infx2postfx+0x26f>
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
jbe    13ac <regexp_infx2postfx+0x29c>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x10,(%rax)
jmp    137f <regexp_infx2postfx+0x26f>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    143d <regexp_infx2postfx+0x32d>
cmpq   $0x0,-0x20(%rbp)
jne    13d5 <regexp_infx2postfx+0x2c5>
movq   $0x0,-0x8(%rbp)
jmp    14ee <regexp_infx2postfx+0x3de>
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    143d <regexp_infx2postfx+0x32d>
cmpq   $0x1,-0x20(%rbp)
jbe    141a <regexp_infx2postfx+0x30a>
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x10,(%rax)
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1442 <regexp_infx2postfx+0x332>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    116e <regexp_infx2postfx+0x5e>
mov    -0x678(%rbp),%rax
lea    -0x670(%rbp),%rcx
cmp    %rcx,%rax
je     1477 <regexp_infx2postfx+0x367>
movq   $0x0,-0x8(%rbp)
jmp    14ee <regexp_infx2postfx+0x3de>
jmp    147c <regexp_infx2postfx+0x36c>
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
jbe    14a9 <regexp_infx2postfx+0x399>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x10,(%rax)
jmp    147c <regexp_infx2postfx+0x36c>
jmp    14ae <regexp_infx2postfx+0x39e>
cmpq   $0x0,-0x18(%rbp)
jbe    14dc <regexp_infx2postfx+0x3cc>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x7c,(%rax)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    14ae <regexp_infx2postfx+0x39e>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
lea    0x2b56(%rip),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x680,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<regexp_infx2postfx>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x658,%rsp
mov    %rdi,%rbx
call   1030 <strlen@plt>
cmp    $0xfff,%eax
jle    1147 <regexp_infx2postfx+0x27>
xor    %eax,%eax
jmp    12f3 <regexp_infx2postfx+0x1d3>
mov    (%rbx),%al
test   %al,%al
je     12ab <regexp_infx2postfx+0x18b>
lea    0x10(%rsp),%r14
add    $0x1,%rbx
lea    0x2edf(%rip),%r12
xor    %ecx,%ecx
mov    %rcx,0x8(%rsp)
lea    0xe91(%rip),%rbp
xor    %r13d,%r13d
xor    %r15d,%r15d
jmp    1192 <regexp_infx2postfx+0x72>
mov    %al,(%r12)
add    $0x1,%r12
add    $0x1,%r13
movzbl (%rbx),%eax
add    $0x1,%rbx
test   %al,%al
je     130f <regexp_infx2postfx+0x1ef>
movsbl %al,%ecx
lea    -0x28(%rcx),%edx
cmp    $0x17,%edx
ja     11c0 <regexp_infx2postfx+0xa0>
movslq 0x0(%rbp,%rdx,4),%rcx
add    %rbp,%rcx
jmp    *%rcx
test   %r13,%r13
je     12f8 <regexp_infx2postfx+0x1d8>
mov    %al,(%r12)
add    $0x1,%r12
jmp    1183 <regexp_infx2postfx+0x63>
nopw   0x0(%rax,%rax,1)
cmp    $0x7c,%ecx
jne    11f4 <regexp_infx2postfx+0xd4>
test   %r13,%r13
je     12f8 <regexp_infx2postfx+0x1d8>
mov    %r13,%rdx
add    $0xffffffffffffffff,%rdx
je     11eb <regexp_infx2postfx+0xcb>
mov    %r12,%rdi
mov    $0x10,%esi
call   1040 <memset@plt>
add    %r13,%r12
add    $0xffffffffffffffff,%r12
add    $0x1,%r15
xor    %r13d,%r13d
jmp    1183 <regexp_infx2postfx+0x63>
cmp    $0x2,%r13
jb     1177 <regexp_infx2postfx+0x57>
add    $0xffffffffffffffff,%r13
movb   $0x10,(%r12)
add    $0x1,%r12
movzbl -0x1(%rbx),%eax
jmp    1177 <regexp_infx2postfx+0x57>
cmp    $0x2,%r13
jb     1227 <regexp_infx2postfx+0x107>
add    $0xffffffffffffffff,%r13
movb   $0x10,(%r12)
add    $0x1,%r12
lea    0x650(%rsp),%rax
cmp    %rax,%r14
jae    12f8 <regexp_infx2postfx+0x1d8>
mov    %r15,(%r14)
mov    %r13,0x8(%r14)
add    $0x10,%r14
xor    %r15d,%r15d
xor    %r13d,%r13d
jmp    1183 <regexp_infx2postfx+0x63>
lea    0x10(%rsp),%rax
cmp    %rax,%r14
je     12f8 <regexp_infx2postfx+0x1d8>
test   %r13,%r13
je     12f8 <regexp_infx2postfx+0x1d8>
mov    %r13,%rdx
add    $0xffffffffffffffff,%rdx
je     1282 <regexp_infx2postfx+0x162>
mov    %r12,%rdi
mov    $0x10,%esi
call   1040 <memset@plt>
add    %r13,%r12
add    $0xffffffffffffffff,%r12
test   %r15,%r15
je     129a <regexp_infx2postfx+0x17a>
mov    %r12,%rdi
mov    $0x7c,%esi
mov    %r15,%rdx
call   1040 <memset@plt>
add    %r15,%r12
mov    -0x10(%r14),%r15
mov    -0x8(%r14),%r13
add    $0xfffffffffffffff0,%r14
jmp    117f <regexp_infx2postfx+0x5f>
lea    0x2d8e(%rip),%r12
mov    $0xffffffffffffffff,%r13
xor    %r15d,%r15d
mov    %r12,%rdi
mov    $0x10,%esi
mov    %r13,%rdx
call   1040 <memset@plt>
add    %r13,%r12
test   %r15,%r15
je     12e7 <regexp_infx2postfx+0x1c7>
mov    %r12,%rdi
mov    $0x7c,%esi
mov    %r15,%rdx
call   1040 <memset@plt>
add    %r15,%r12
movb   $0x0,(%r12)
lea    0x2d4d(%rip),%rax
mov    %rax,0x8(%rsp)
mov    0x8(%rsp),%rax
add    $0x658,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0x10(%rsp),%rax
cmp    %rax,%r14
jne    1140 <regexp_infx2postfx+0x20>
add    $0xffffffffffffffff,%r13
jne    12bc <regexp_infx2postfx+0x19c>
jmp    12cf <regexp_infx2postfx+0x1af>

LLVM IR (-O0):
%struct.anon = type { i64, i64 }
@regexp_infx2postfx.buffer = internal global [8192 x i8] zeroinitializer
define i8* @regexp_infx2postfx(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
%4 = alloca i64
%5 = alloca i64
%6 = alloca i8*
%7 = alloca [100 x %struct.anon]
%8 = alloca %struct.anon*
store i8* %0, i8** %3
store i64 0, i64* %4
store i64 0, i64* %5
store i8* getelementptr inbounds ([8192 x i8], [8192 x i8]* @regexp_infx2postfx.buffer, i64 0, i64 0), i8** %6
%9 = getelementptr inbounds [100 x %struct.anon], [100 x %struct.anon]* %7, i64 0, i64 0
store %struct.anon* %9, %struct.anon** %8
%10 = load i8*, i8** %3
%11 = call i32 @strlen(i8* %10)
%12 = icmp sge i32 %11, 4096
br i1 %12, label %13, label %14
13: ; preds = %1
store i8* null, i8** %2
br label %152
14: ; preds = %1
br label %15
15: ; preds = %124, %14
%16 = load i8*, i8** %3
%17 = load i8, i8* %16
%18 = icmp ne i8 %17, 0
br i1 %18, label %19, label %127
19: ; preds = %15
%20 = load i8*, i8** %3
%21 = load i8, i8* %20
%22 = sext i8 %21 to i32
switch i32 %22, label %108 [
i32 40, label %23
i32 41, label %46
i32 124, label %84
i32 42, label %99
i32 43, label %99
i32 63, label %99
]
23: ; preds = %19
%24 = load i64, i64* %5
%25 = icmp ugt i64 %24, 1
br i1 %25, label %26, label %31
26: ; preds = %23
%27 = load i64, i64* %5
%28 = add i64 %27, -1
store i64 %28, i64* %5
%29 = load i8*, i8** %6
%30 = getelementptr inbounds i8, i8* %29, i32 1
store i8* %30, i8** %6
store i8 16, i8* %29
br label %31
31: ; preds = %26, %23
%32 = load %struct.anon*, %struct.anon** %8
%33 = getelementptr inbounds [100 x %struct.anon], [100 x %struct.anon]* %7, i64 0, i64 0
%34 = getelementptr inbounds %struct.anon, %struct.anon* %33, i64 100
%35 = icmp uge %struct.anon* %32, %34
br i1 %35, label %36, label %37
36: ; preds = %31
store i8* null, i8** %2
br label %152
37: ; preds = %31
%38 = load i64, i64* %4
%39 = load %struct.anon*, %struct.anon** %8
%40 = getelementptr inbounds %struct.anon, %struct.anon* %39, i32 0, i32 0
store i64 %38, i64* %40
%41 = load i64, i64* %5
%42 = load %struct.anon*, %struct.anon** %8
%43 = getelementptr inbounds %struct.anon, %struct.anon* %42, i32 0, i32 1
store i64 %41, i64* %43
%44 = load %struct.anon*, %struct.anon** %8
%45 = getelementptr inbounds %struct.anon, %struct.anon* %44, i32 1
store %struct.anon* %45, %struct.anon** %8
store i64 0, i64* %4
store i64 0, i64* %5
br label %123
46: ; preds = %19
%47 = load %struct.anon*, %struct.anon** %8
%48 = getelementptr inbounds [100 x %struct.anon], [100 x %struct.anon]* %7, i64 0, i64 0
%49 = icmp eq %struct.anon* %47, %48
br i1 %49, label %50, label %51
50: ; preds = %46
store i8* null, i8** %2
br label %152
51: ; preds = %46
%52 = load i64, i64* %5
%53 = icmp eq i64 %52, 0
br i1 %53, label %54, label %55
54: ; preds = %51
store i8* null, i8** %2
br label %152
55: ; preds = %51
br label %56
56: ; preds = %60, %55
%57 = load i64, i64* %5
%58 = add i64 %57, -1
store i64 %58, i64* %5
%59 = icmp ugt i64 %58, 0
br i1 %59, label %60, label %63
60: ; preds = %56
%61 = load i8*, i8** %6
%62 = getelementptr inbounds i8, i8* %61, i32 1
store i8* %62, i8** %6
store i8 16, i8* %61
br label %56
63: ; preds = %56
br label %64
64: ; preds = %70, %63
%65 = load i64, i64* %4
%66 = icmp ugt i64 %65, 0
br i1 %66, label %67, label %73
67: ; preds = %64
%68 = load i8*, i8** %6
%69 = getelementptr inbounds i8, i8* %68, i32 1
store i8* %69, i8** %6
store i8 124, i8* %68
br label %70
70: ; preds = %67
%71 = load i64, i64* %4
%72 = add i64 %71, -1
store i64 %72, i64* %4
br label %64
73: ; preds = %64
%74 = load %struct.anon*, %struct.anon** %8
%75 = getelementptr inbounds %struct.anon, %struct.anon* %74, i32 -1
store %struct.anon* %75, %struct.anon** %8
%76 = load %struct.anon*, %struct.anon** %8
%77 = getelementptr inbounds %struct.anon, %struct.anon* %76, i32 0, i32 0
%78 = load i64, i64* %77
store i64 %78, i64* %4
%79 = load %struct.anon*, %struct.anon** %8
%80 = getelementptr inbounds %struct.anon, %struct.anon* %79, i32 0, i32 1
%81 = load i64, i64* %80
store i64 %81, i64* %5
%82 = load i64, i64* %5
%83 = add i64 %82, 1
store i64 %83, i64* %5
br label %123
84: ; preds = %19
%85 = load i64, i64* %5
%86 = icmp eq i64 %85, 0
br i1 %86, label %87, label %88
87: ; preds = %84
store i8* null, i8** %2
br label %152
88: ; preds = %84
br label %89
89: ; preds = %93, %88
%90 = load i64, i64* %5
%91 = add i64 %90, -1
store i64 %91, i64* %5
%92 = icmp ugt i64 %91, 0
br i1 %92, label %93, label %96
93: ; preds = %89
%94 = load i8*, i8** %6
%95 = getelementptr inbounds i8, i8* %94, i32 1
store i8* %95, i8** %6
store i8 16, i8* %94
br label %89
96: ; preds = %89
%97 = load i64, i64* %4
%98 = add i64 %97, 1
store i64 %98, i64* %4
br label %123
99: ; preds = %19, %19, %19
%100 = load i64, i64* %5
%101 = icmp eq i64 %100, 0
br i1 %101, label %102, label %103
102: ; preds = %99
store i8* null, i8** %2
br label %152
103: ; preds = %99
%104 = load i8*, i8** %3
%105 = load i8, i8* %104
%106 = load i8*, i8** %6
%107 = getelementptr inbounds i8, i8* %106, i32 1
store i8* %107, i8** %6
store i8 %105, i8* %106
br label %123
108: ; preds = %19
%109 = load i64, i64* %5
%110 = icmp ugt i64 %109, 1
br i1 %110, label %111, label %116
111: ; preds = %108
%112 = load i64, i64* %5
%113 = add i64 %112, -1
store i64 %113, i64* %5
%114 = load i8*, i8** %6
%115 = getelementptr inbounds i8, i8* %114, i32 1
store i8* %115, i8** %6
store i8 16, i8* %114
br label %116
116: ; preds = %111, %108
%117 = load i8*, i8** %3
%118 = load i8, i8* %117
%119 = load i8*, i8** %6
%120 = getelementptr inbounds i8, i8* %119, i32 1
store i8* %120, i8** %6
store i8 %118, i8* %119
%121 = load i64, i64* %5
%122 = add i64 %121, 1
store i64 %122, i64* %5
br label %123
123: ; preds = %116, %103, %96, %73, %37
br label %124
124: ; preds = %123
%125 = load i8*, i8** %3
%126 = getelementptr inbounds i8, i8* %125, i32 1
store i8* %126, i8** %3
br label %15
127: ; preds = %15
%128 = load %struct.anon*, %struct.anon** %8
%129 = getelementptr inbounds [100 x %struct.anon], [100 x %struct.anon]* %7, i64 0, i64 0
%130 = icmp ne %struct.anon* %128, %129
br i1 %130, label %131, label %132
131: ; preds = %127
store i8* null, i8** %2
br label %152
132: ; preds = %127
br label %133
133: ; preds = %137, %132
%134 = load i64, i64* %5
%135 = add i64 %134, -1
store i64 %135, i64* %5
%136 = icmp ugt i64 %135, 0
br i1 %136, label %137, label %140
137: ; preds = %133
%138 = load i8*, i8** %6
%139 = getelementptr inbounds i8, i8* %138, i32 1
store i8* %139, i8** %6
store i8 16, i8* %138
br label %133
140: ; preds = %133
br label %141
141: ; preds = %147, %140
%142 = load i64, i64* %4
%143 = icmp ugt i64 %142, 0
br i1 %143, label %144, label %150
144: ; preds = %141
%145 = load i8*, i8** %6
%146 = getelementptr inbounds i8, i8* %145, i32 1
store i8* %146, i8** %6
store i8 124, i8* %145
br label %147
147: ; preds = %144
%148 = load i64, i64* %4
%149 = add i64 %148, -1
store i64 %149, i64* %4
br label %141
150: ; preds = %141
%151 = load i8*, i8** %6
store i8 0, i8* %151
store i8* getelementptr inbounds ([8192 x i8], [8192 x i8]* @regexp_infx2postfx.buffer, i64 0, i64 0), i8** %2
br label %152
152: ; preds = %150, %131, %102, %87, %54, %50, %36, %13
%153 = load i8*, i8** %2
ret i8* %153
}

LLVM IR (-O2):
%struct.anon = type { i64, i64 }
@regexp_infx2postfx.buffer = internal global [8192 x i8] zeroinitializer
define i8* @regexp_infx2postfx(i8* %0) {
%2 = alloca [100 x %struct.anon]
%3 = bitcast [100 x %struct.anon]* %2 to i8*
%4 = getelementptr inbounds [100 x %struct.anon], [100 x %struct.anon]* %2, i64 0, i64 0
%5 = tail call i32 @strlen(i8* %0)
%6 = icmp sgt i32 %5, 4095
br i1 %6, label %109, label %7
7: ; preds = %1
%8 = load i8, i8* %0
%9 = icmp eq i8 %8, 0
br i1 %9, label %96, label %10
10: ; preds = %7
%11 = getelementptr inbounds [100 x %struct.anon], [100 x %struct.anon]* %2, i64 0, i64 100
br label %12
12: ; preds = %10, %83
%13 = phi i8 [ %8, %10 ], [ %89, %83 ]
%14 = phi %struct.anon* [ %4, %10 ], [ %87, %83 ]
%15 = phi i8* [ getelementptr inbounds ([8192 x i8], [8192 x i8]* @regexp_infx2postfx.buffer, i64 0, i64 0), %10 ], [ %86, %83 ]
%16 = phi i64 [ 0, %10 ], [ %85, %83 ]
%17 = phi i64 [ 0, %10 ], [ %84, %83 ]
%18 = phi i8* [ %0, %10 ], [ %88, %83 ]
%19 = sext i8 %13 to i32
switch i32 %19, label %71 [
i32 40, label %20
i32 41, label %33
i32 124, label %56
i32 42, label %67
i32 43, label %67
i32 63, label %67
]
20: ; preds = %12
%21 = icmp ugt i64 %16, 1
br i1 %21, label %22, label %25
22: ; preds = %20
%23 = add i64 %16, -1
%24 = getelementptr inbounds i8, i8* %15, i64 1
store i8 16, i8* %15
br label %25
25: ; preds = %22, %20
%26 = phi i64 [ %23, %22 ], [ %16, %20 ]
%27 = phi i8* [ %24, %22 ], [ %15, %20 ]
%28 = icmp ult %struct.anon* %14, %11
br i1 %28, label %29, label %109
29: ; preds = %25
%30 = getelementptr inbounds %struct.anon, %struct.anon* %14, i64 0, i32 0
store i64 %17, i64* %30
%31 = getelementptr inbounds %struct.anon, %struct.anon* %14, i64 0, i32 1
store i64 %26, i64* %31
%32 = getelementptr inbounds %struct.anon, %struct.anon* %14, i64 1
br label %83
33: ; preds = %12
%34 = icmp eq %struct.anon* %14, %4
%35 = icmp eq i64 %16, 0
%36 = select i1 %34, i1 true, i1 %35
br i1 %36, label %109, label %37
37: ; preds = %33
%38 = add i64 %16, -1
%39 = icmp eq i64 %38, 0
br i1 %39, label %43, label %40
40: ; preds = %37
%41 = getelementptr i8, i8* %15, i64 -1
%42 = getelementptr i8, i8* %41, i64 %16
br label %43
43: ; preds = %40, %37
%44 = phi i8* [ %15, %37 ], [ %42, %40 ]
%45 = icmp eq i64 %17, 0
br i1 %45, label %48, label %46
46: ; preds = %43
%47 = getelementptr i8, i8* %44, i64 %17
br label %48
48: ; preds = %46, %43
%49 = phi i8* [ %44, %43 ], [ %47, %46 ]
%50 = getelementptr inbounds %struct.anon, %struct.anon* %14, i64 -1
%51 = getelementptr inbounds %struct.anon, %struct.anon* %50, i64 0, i32 0
%52 = load i64, i64* %51
%53 = getelementptr inbounds %struct.anon, %struct.anon* %14, i64 -1, i32 1
%54 = load i64, i64* %53
%55 = add i64 %54, 1
br label %83
56: ; preds = %12
%57 = icmp eq i64 %16, 0
br i1 %57, label %109, label %58
58: ; preds = %56
%59 = add i64 %16, -1
%60 = icmp eq i64 %59, 0
br i1 %60, label %64, label %61
61: ; preds = %58
%62 = getelementptr i8, i8* %15, i64 -1
%63 = getelementptr i8, i8* %62, i64 %16
br label %64
64: ; preds = %61, %58
%65 = phi i8* [ %15, %58 ], [ %63, %61 ]
%66 = add i64 %17, 1
br label %83
67: ; preds = %12, %12, %12
%68 = icmp eq i64 %16, 0
br i1 %68, label %109, label %69
69: ; preds = %67
%70 = getelementptr inbounds i8, i8* %15, i64 1
store i8 %13, i8* %15
br label %83
71: ; preds = %12
%72 = icmp ugt i64 %16, 1
br i1 %72, label %73, label %77
73: ; preds = %71
%74 = add i64 %16, -1
%75 = getelementptr inbounds i8, i8* %15, i64 1
store i8 16, i8* %15
%76 = load i8, i8* %18
br label %77
77: ; preds = %73, %71
%78 = phi i8 [ %76, %73 ], [ %13, %71 ]
%79 = phi i64 [ %74, %73 ], [ %16, %71 ]
%80 = phi i8* [ %75, %73 ], [ %15, %71 ]
%81 = getelementptr inbounds i8, i8* %80, i64 1
store i8 %78, i8* %80
%82 = add nuw i64 %79, 1
br label %83
83: ; preds = %29, %48, %64, %69, %77
%84 = phi i64 [ %17, %77 ], [ %17, %69 ], [ %66, %64 ], [ %52, %48 ], [ 0, %29 ]
%85 = phi i64 [ %82, %77 ], [ %16, %69 ], [ 0, %64 ], [ %55, %48 ], [ 0, %29 ]
%86 = phi i8* [ %81, %77 ], [ %70, %69 ], [ %65, %64 ], [ %49, %48 ], [ %27, %29 ]
%87 = phi %struct.anon* [ %14, %77 ], [ %14, %69 ], [ %14, %64 ], [ %50, %48 ], [ %32, %29 ]
%88 = getelementptr inbounds i8, i8* %18, i64 1
%89 = load i8, i8* %88
%90 = icmp eq i8 %89, 0
br i1 %90, label %91, label %12
91: ; preds = %83
%92 = icmp eq %struct.anon* %87, %4
br i1 %92, label %93, label %109
93: ; preds = %91
%94 = add i64 %85, -1
%95 = icmp eq i64 %94, 0
br i1 %95, label %101, label %96
96: ; preds = %7, %93
%97 = phi i64 [ %94, %93 ], [ -1, %7 ]
%98 = phi i64 [ %84, %93 ], [ 0, %7 ]
%99 = phi i8* [ %86, %93 ], [ getelementptr inbounds ([8192 x i8], [8192 x i8]* @regexp_infx2postfx.buffer, i64 0, i64 0), %7 ]
%100 = getelementptr i8, i8* %99, i64 %97
br label %101
101: ; preds = %96, %93
%102 = phi i64 [ %84, %93 ], [ %98, %96 ]
%103 = phi i8* [ %86, %93 ], [ %100, %96 ]
%104 = icmp eq i64 %102, 0
br i1 %104, label %107, label %105
105: ; preds = %101
%106 = getelementptr i8, i8* %103, i64 %102
br label %107
107: ; preds = %105, %101
%108 = phi i8* [ %103, %101 ], [ %106, %105 ]
store i8 0, i8* %108
br label %109
109: ; preds = %67, %56, %33, %25, %91, %1, %107
%110 = phi i8* [ getelementptr inbounds ([8192 x i8], [8192 x i8]* @regexp_infx2postfx.buffer, i64 0, i64 0), %107 ], [ null, %1 ], [ null, %91 ], [ null, %25 ], [ null, %33 ], [ null, %56 ], [ null, %67 ]
ret i8* %110
}