#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*/ isspace(char);
scalar_t__ op_left_assoc(char);
scalar_t__ op_preced(char);
int strlen(char const *);
int shunting_yard(const char *input, char *output, char **err) {
  const char *strpos = input, *strend = input + strlen(input);
  char c, *outpos = output;
  char stack[32];
  unsigned int sl = 0;
  char sc;
  while (strpos < strend) {
    c = *strpos;
    if (!isspace(c)) {
      if ((c != '(' && c != ')' &&
           !(c == '+' || c == '-' || c == '/' || c == '*' || c == '%' ||
             c == '=' || c == '^' || c == '@'))) {
        while ((*strpos != '(' && *strpos != ')' &&
                !(*strpos == '+' || *strpos == '-' || *strpos == '/' ||
                  *strpos == '*' || *strpos == '%' || *strpos == '=' ||
                  *strpos == '^' || *strpos == '@')) &&
               strpos < strend) {
          *outpos = *strpos;
          ++outpos;
          strpos++;
        }
        *outpos = ' ';
        ++outpos;
        --strpos;
      } else if ((c == '+' || c == '-' || c == '/' || c == '*' || c == '%' ||
                  c == '=' || c == '^' || c == '@')) {
        while (sl > 0) {
          sc = stack[sl - 1];
          if ((sc == '+' || sc == '-' || sc == '/' || sc == '*' || sc == '%' ||
               sc == '=' || sc == '^' || sc == '@') &&
              ((op_left_assoc(c) && (op_preced(c) <= op_preced(sc))) ||
               (op_preced(c) < op_preced(sc)))) {
            *outpos = sc;
            ++outpos;
            *outpos = ' ';
            ++outpos;
            sl--;
          } else {
            break;
          }
        }
        stack[sl] = c;
        ++sl;
      } else if (c == '(') {
        stack[sl] = c;
        ++sl;
      } else if (c == ')') {
        int pe = 0;
        while (sl > 0) {
          sc = stack[sl - 1];
          if (sc == '(') {
            pe = 1;
            break;
          } else {
            *outpos = sc;
            ++outpos;
            *outpos = ' ';
            ++outpos;
            sl--;
          }
        }
        if (!pe) {
          *err = "Error: parentheses mismatched\n";
          return 0;
        }
        sl--;
      } else {
        *err = "Unknown token \n";
        return 0;
      }
    }
    ++strpos;
  }
  while (sl > 0) {
    sc = stack[sl - 1];
    if (sc == '(' || sc == ')') {
      *err = "Error: parentheses mismatched\n";
      return 0;
    }
    *outpos = sc;
    ++outpos;
    *outpos = ' ';
    ++outpos;
    --sl;
  }
  *outpos = 0;
  return 1;
}


x86 assembly (clang, -O0):
<shunting_yard>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x10(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x78(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x40(%rbp)
movl   $0x0,-0x64(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
jae    163f <shunting_yard+0x4ff>
mov    -0x28(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl -0x31(%rbp),%edi
call   1060 <isspace@plt>
cmp    $0x0,%eax
jne    162e <shunting_yard+0x4ee>
movsbl -0x31(%rbp),%eax
cmp    $0x28,%eax
je     137c <shunting_yard+0x23c>
movsbl -0x31(%rbp),%eax
cmp    $0x29,%eax
je     137c <shunting_yard+0x23c>
movsbl -0x31(%rbp),%eax
cmp    $0x2b,%eax
je     137c <shunting_yard+0x23c>
movsbl -0x31(%rbp),%eax
cmp    $0x2d,%eax
je     137c <shunting_yard+0x23c>
movsbl -0x31(%rbp),%eax
cmp    $0x2f,%eax
je     137c <shunting_yard+0x23c>
movsbl -0x31(%rbp),%eax
cmp    $0x2a,%eax
je     137c <shunting_yard+0x23c>
movsbl -0x31(%rbp),%eax
cmp    $0x25,%eax
je     137c <shunting_yard+0x23c>
movsbl -0x31(%rbp),%eax
cmp    $0x3d,%eax
je     137c <shunting_yard+0x23c>
movsbl -0x31(%rbp),%eax
cmp    $0x5e,%eax
je     137c <shunting_yard+0x23c>
movsbl -0x31(%rbp),%eax
cmp    $0x40,%eax
je     137c <shunting_yard+0x23c>
jmp    123f <shunting_yard+0xff>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x28,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x29,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2b,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2d,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2f,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2a,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x25,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x3d,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x5e,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x40,%ecx
mov    %al,-0x79(%rbp)
je     131f <shunting_yard+0x1df>
mov    -0x28(%rbp),%rax
cmp    -0x30(%rbp),%rax
setb   %al
mov    %al,-0x79(%rbp)
mov    -0x79(%rbp),%al
test   $0x1,%al
jne    132f <shunting_yard+0x1ef>
jmp    1358 <shunting_yard+0x218>
mov    -0x28(%rbp),%rax
mov    (%rax),%cl
mov    -0x40(%rbp),%rax
mov    %cl,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    123f <shunting_yard+0xff>
mov    -0x40(%rbp),%rax
movb   $0x20,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
jmp    1629 <shunting_yard+0x4e9>
movsbl -0x31(%rbp),%eax
cmp    $0x2b,%eax
je     13e4 <shunting_yard+0x2a4>
movsbl -0x31(%rbp),%eax
cmp    $0x2d,%eax
je     13e4 <shunting_yard+0x2a4>
movsbl -0x31(%rbp),%eax
cmp    $0x2f,%eax
je     13e4 <shunting_yard+0x2a4>
movsbl -0x31(%rbp),%eax
cmp    $0x2a,%eax
je     13e4 <shunting_yard+0x2a4>
movsbl -0x31(%rbp),%eax
cmp    $0x25,%eax
je     13e4 <shunting_yard+0x2a4>
movsbl -0x31(%rbp),%eax
cmp    $0x3d,%eax
je     13e4 <shunting_yard+0x2a4>
movsbl -0x31(%rbp),%eax
cmp    $0x5e,%eax
je     13e4 <shunting_yard+0x2a4>
movsbl -0x31(%rbp),%eax
cmp    $0x40,%eax
jne    152d <shunting_yard+0x3ed>
jmp    13e9 <shunting_yard+0x2a9>
cmpl   $0x0,-0x64(%rbp)
jbe    1515 <shunting_yard+0x3d5>
mov    -0x64(%rbp),%eax
sub    $0x1,%eax
mov    %eax,%eax
mov    -0x60(%rbp,%rax,1),%al
mov    %al,-0x65(%rbp)
movsbl -0x65(%rbp),%eax
cmp    $0x2b,%eax
je     146a <shunting_yard+0x32a>
movsbl -0x65(%rbp),%eax
cmp    $0x2d,%eax
je     146a <shunting_yard+0x32a>
movsbl -0x65(%rbp),%eax
cmp    $0x2f,%eax
je     146a <shunting_yard+0x32a>
movsbl -0x65(%rbp),%eax
cmp    $0x2a,%eax
je     146a <shunting_yard+0x32a>
movsbl -0x65(%rbp),%eax
cmp    $0x25,%eax
je     146a <shunting_yard+0x32a>
movsbl -0x65(%rbp),%eax
cmp    $0x3d,%eax
je     146a <shunting_yard+0x32a>
movsbl -0x65(%rbp),%eax
cmp    $0x5e,%eax
je     146a <shunting_yard+0x32a>
movsbl -0x65(%rbp),%eax
cmp    $0x40,%eax
jne    150b <shunting_yard+0x3cb>
movsbl -0x31(%rbp),%edi
call   1050 <op_left_assoc@plt>
cmp    $0x0,%rax
je     14a9 <shunting_yard+0x369>
movsbl -0x31(%rbp),%edi
call   1030 <op_preced@plt>
mov    %rax,-0x88(%rbp)
movsbl -0x65(%rbp),%edi
call   1030 <op_preced@plt>
mov    %rax,%rcx
mov    -0x88(%rbp),%rax
cmp    %rcx,%rax
jle    14d5 <shunting_yard+0x395>
movsbl -0x31(%rbp),%edi
call   1030 <op_preced@plt>
mov    %rax,-0x90(%rbp)
movsbl -0x65(%rbp),%edi
call   1030 <op_preced@plt>
mov    %rax,%rcx
mov    -0x90(%rbp),%rax
cmp    %rcx,%rax
jge    150b <shunting_yard+0x3cb>
mov    -0x65(%rbp),%cl
mov    -0x40(%rbp),%rax
mov    %cl,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
movb   $0x20,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x64(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x64(%rbp)
jmp    1510 <shunting_yard+0x3d0>
jmp    1515 <shunting_yard+0x3d5>
jmp    13e9 <shunting_yard+0x2a9>
mov    -0x31(%rbp),%cl
mov    -0x64(%rbp),%eax
mov    %cl,-0x60(%rbp,%rax,1)
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    1624 <shunting_yard+0x4e4>
movsbl -0x31(%rbp),%eax
cmp    $0x28,%eax
jne    1552 <shunting_yard+0x412>
mov    -0x31(%rbp),%cl
mov    -0x64(%rbp),%eax
mov    %cl,-0x60(%rbp,%rax,1)
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    161f <shunting_yard+0x4df>
movsbl -0x31(%rbp),%eax
cmp    $0x29,%eax
jne    1600 <shunting_yard+0x4c0>
movl   $0x0,-0x6c(%rbp)
cmpl   $0x0,-0x64(%rbp)
jbe    15ce <shunting_yard+0x48e>
mov    -0x64(%rbp),%eax
sub    $0x1,%eax
mov    %eax,%eax
mov    -0x60(%rbp,%rax,1),%al
mov    %al,-0x65(%rbp)
movsbl -0x65(%rbp),%eax
cmp    $0x28,%eax
jne    1598 <shunting_yard+0x458>
movl   $0x1,-0x6c(%rbp)
jmp    15ce <shunting_yard+0x48e>
mov    -0x65(%rbp),%cl
mov    -0x40(%rbp),%rax
mov    %cl,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
movb   $0x20,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x64(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x64(%rbp)
jmp    1566 <shunting_yard+0x426>
cmpl   $0x0,-0x6c(%rbp)
jne    15f2 <shunting_yard+0x4b2>
mov    -0x20(%rbp),%rax
lea    0xa1d(%rip),%rcx
mov    %rcx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    16d5 <shunting_yard+0x595>
mov    -0x64(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x64(%rbp)
jmp    161a <shunting_yard+0x4da>
mov    -0x20(%rbp),%rax
lea    0xa14(%rip),%rcx
mov    %rcx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    16d5 <shunting_yard+0x595>
jmp    161f <shunting_yard+0x4df>
jmp    1624 <shunting_yard+0x4e4>
jmp    1629 <shunting_yard+0x4e9>
jmp    162e <shunting_yard+0x4ee>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    118f <shunting_yard+0x4f>
jmp    1644 <shunting_yard+0x504>
cmpl   $0x0,-0x64(%rbp)
jbe    16c7 <shunting_yard+0x587>
mov    -0x64(%rbp),%eax
sub    $0x1,%eax
mov    %eax,%eax
mov    -0x60(%rbp,%rax,1),%al
mov    %al,-0x65(%rbp)
movsbl -0x65(%rbp),%eax
cmp    $0x28,%eax
je     1677 <shunting_yard+0x537>
movsbl -0x65(%rbp),%eax
cmp    $0x29,%eax
jne    1691 <shunting_yard+0x551>
mov    -0x20(%rbp),%rax
lea    0x97e(%rip),%rcx
mov    %rcx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    16d5 <shunting_yard+0x595>
mov    -0x65(%rbp),%cl
mov    -0x40(%rbp),%rax
mov    %cl,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
movb   $0x20,(%rax)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x64(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x64(%rbp)
jmp    1644 <shunting_yard+0x504>
mov    -0x40(%rbp),%rax
movb   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<shunting_yard>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %rdx,%rbx
mov    %rsi,%r13
mov    %rdi,%r12
call   1040 <strlen@plt>
test   %eax,%eax
jle    1365 <shunting_yard+0x225>
mov    %rbx,0x28(%rsp)
movslq %eax,%r15
add    %r12,%r15
xor    %r14d,%r14d
mov    %r15,0x10(%rsp)
jmp    1194 <shunting_yard+0x54>
xor    %r14d,%r14d
mov    %r14d,%eax
mov    %bl,0x30(%rsp,%rax,1)
add    $0x1,%r14d
add    $0x1,%r12
cmp    %r15,%r12
jae    1325 <shunting_yard+0x1e5>
mov    (%r12),%bl
movsbl %bl,%ebp
mov    %ebp,%edi
call   1060 <isspace@plt>
test   %eax,%eax
jne    1187 <shunting_yard+0x47>
mov    %ebp,0xc(%rsp)
lea    -0x25(%rbx),%eax
cmp    $0x39,%al
ja     12d8 <shunting_yard+0x198>
movzbl %al,%eax
movabs $0x200000009000561,%rcx
bt     %rax,%rcx
jae    1284 <shunting_yard+0x144>
test   %r14d,%r14d
je     1179 <shunting_yard+0x39>
mov    %rbx,0x18(%rsp)
mov    %r12,0x20(%rsp)
lea    -0x1(%r14),%eax
lea    (%rsp,%rax,1),%r15
add    $0x30,%r15
mov    0xc(%rsp),%ebx
jmp    1221 <shunting_yard+0xe1>
nopl   (%rax)
mov    %ebx,%edi
call   1030 <op_preced@plt>
mov    %rax,%rbx
mov    %ebp,%edi
call   1030 <op_preced@plt>
cmp    %rax,%rbx
mov    0xc(%rsp),%ebx
jge    1270 <shunting_yard+0x130>
mov    %r12b,0x0(%r13)
movb   $0x20,0x1(%r13)
add    $0x2,%r13
add    $0xffffffffffffffff,%r15
add    $0xffffffff,%r14d
je     126d <shunting_yard+0x12d>
movzbl (%r15),%r12d
lea    -0x25(%r12),%eax
cmp    $0x39,%al
ja     1270 <shunting_yard+0x130>
movzbl %al,%eax
movabs $0x200000009000561,%rcx
bt     %rax,%rcx
jae    1270 <shunting_yard+0x130>
mov    %ebx,%edi
call   1050 <op_left_assoc@plt>
movsbl %r12b,%ebp
test   %rax,%rax
je     11f0 <shunting_yard+0xb0>
mov    %ebx,%edi
call   1030 <op_preced@plt>
mov    %rax,%rbx
mov    %ebp,%edi
call   1030 <op_preced@plt>
cmp    %rax,%rbx
mov    0xc(%rsp),%ebx
jg     11f0 <shunting_yard+0xb0>
jmp    120a <shunting_yard+0xca>
xor    %r14d,%r14d
mov    0x20(%rsp),%r12
mov    0x10(%rsp),%r15
mov    0x18(%rsp),%rbx
jmp    117c <shunting_yard+0x3c>
cmp    $0x3,%rax
je     130f <shunting_yard+0x1cf>
cmp    $0x4,%rax
jne    12d8 <shunting_yard+0x198>
test   %r14d,%r14d
je     1371 <shunting_yard+0x231>
mov    %r14d,%r14d
movzbl 0x2f(%rsp,%r14,1),%eax
cmp    $0x28,%al
je     131c <shunting_yard+0x1dc>
add    $0xffffffffffffffff,%r14
mov    %al,0x0(%r13)
movb   $0x20,0x1(%r13)
add    $0x2,%r13
test   %r14,%r14
jne    12a0 <shunting_yard+0x160>
jmp    1371 <shunting_yard+0x231>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %al,-0x1(%r13)
add    $0x1,%r12
add    $0x1,%r13
movzbl (%r12),%eax
lea    -0x25(%rax),%ecx
cmp    $0x39,%cl
ja     12fc <shunting_yard+0x1bc>
movzbl %cl,%ecx
movabs $0x200000009000579,%rdx
bt     %rcx,%rdx
jb     1301 <shunting_yard+0x1c1>
cmp    %r15,%r12
jb     12d0 <shunting_yard+0x190>
movb   $0x20,-0x1(%r13)
add    $0xffffffffffffffff,%r12
jmp    1187 <shunting_yard+0x47>
mov    %r14d,%eax
movb   $0x28,0x30(%rsp,%rax,1)
jmp    1183 <shunting_yard+0x43>
add    $0xffffffff,%r14d
jmp    1187 <shunting_yard+0x47>
test   %r14d,%r14d
je     1365 <shunting_yard+0x225>
mov    %r14d,%eax
mov    0x28(%rsp),%rsi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl 0x2f(%rsp,%rax,1),%ecx
mov    %ecx,%edx
and    $0xfe,%dl
cmp    $0x28,%dl
je     1382 <shunting_yard+0x242>
add    $0xffffffffffffffff,%rax
mov    %cl,0x0(%r13)
movb   $0x20,0x1(%r13)
add    $0x2,%r13
test   %rax,%rax
jne    1340 <shunting_yard+0x200>
movb   $0x0,0x0(%r13)
mov    $0x1,%eax
jmp    138e <shunting_yard+0x24e>
lea    0xc88(%rip),%rax
mov    0x28(%rsp),%rcx
mov    %rax,(%rcx)
jmp    138c <shunting_yard+0x24c>
lea    0xc77(%rip),%rax
mov    %rax,(%rsi)
xor    %eax,%eax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [31 x i8] c"Error: parentheses mismatched\0A\00"
@.str.1 = [16 x i8] c"Unknown token \0A\00"
define i32 @shunting_yard(i8* %0, i8* %1, i8** %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i8**
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i8
%11 = alloca i8*
%12 = alloca [32 x i8]
%13 = alloca i32
%14 = alloca i8
%15 = alloca i32
store i8* %0, i8** %5
store i8* %1, i8** %6
store i8** %2, i8*** %7
%16 = load i8*, i8** %5
store i8* %16, i8** %8
%17 = load i8*, i8** %5
%18 = load i8*, i8** %5
%19 = call i32 @strlen(i8* %18)
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i8, i8* %17, i64 %20
store i8* %21, i8** %9
%22 = load i8*, i8** %6
store i8* %22, i8** %11
store i32 0, i32* %13
br label %23
23: ; preds = %306, %3
%24 = load i8*, i8** %8
%25 = load i8*, i8** %9
%26 = icmp ult i8* %24, %25
br i1 %26, label %27, label %309
27: ; preds = %23
%28 = load i8*, i8** %8
%29 = load i8, i8* %28
store i8 %29, i8* %10
%30 = load i8, i8* %10
%31 = call i32 @isspace(i8 signext %30)
%32 = icmp ne i32 %31, 0
br i1 %32, label %306, label %33
33: ; preds = %27
%34 = load i8, i8* %10
%35 = sext i8 %34 to i32
%36 = icmp ne i32 %35, 40
br i1 %36, label %37, label %144
37: ; preds = %33
%38 = load i8, i8* %10
%39 = sext i8 %38 to i32
%40 = icmp ne i32 %39, 41
br i1 %40, label %41, label %144
41: ; preds = %37
%42 = load i8, i8* %10
%43 = sext i8 %42 to i32
%44 = icmp eq i32 %43, 43
br i1 %44, label %144, label %45
45: ; preds = %41
%46 = load i8, i8* %10
%47 = sext i8 %46 to i32
%48 = icmp eq i32 %47, 45
br i1 %48, label %144, label %49
49: ; preds = %45
%50 = load i8, i8* %10
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %51, 47
br i1 %52, label %144, label %53
53: ; preds = %49
%54 = load i8, i8* %10
%55 = sext i8 %54 to i32
%56 = icmp eq i32 %55, 42
br i1 %56, label %144, label %57
57: ; preds = %53
%58 = load i8, i8* %10
%59 = sext i8 %58 to i32
%60 = icmp eq i32 %59, 37
br i1 %60, label %144, label %61
61: ; preds = %57
%62 = load i8, i8* %10
%63 = sext i8 %62 to i32
%64 = icmp eq i32 %63, 61
br i1 %64, label %144, label %65
65: ; preds = %61
%66 = load i8, i8* %10
%67 = sext i8 %66 to i32
%68 = icmp eq i32 %67, 94
br i1 %68, label %144, label %69
69: ; preds = %65
%70 = load i8, i8* %10
%71 = sext i8 %70 to i32
%72 = icmp eq i32 %71, 64
br i1 %72, label %144, label %73
73: ; preds = %69
br label %74
74: ; preds = %130, %73
%75 = load i8*, i8** %8
%76 = load i8, i8* %75
%77 = sext i8 %76 to i32
%78 = icmp ne i32 %77, 40
br i1 %78, label %79, label %128
79: ; preds = %74
%80 = load i8*, i8** %8
%81 = load i8, i8* %80
%82 = sext i8 %81 to i32
%83 = icmp ne i32 %82, 41
br i1 %83, label %84, label %128
84: ; preds = %79
%85 = load i8*, i8** %8
%86 = load i8, i8* %85
%87 = sext i8 %86 to i32
%88 = icmp eq i32 %87, 43
br i1 %88, label %128, label %89
89: ; preds = %84
%90 = load i8*, i8** %8
%91 = load i8, i8* %90
%92 = sext i8 %91 to i32
%93 = icmp eq i32 %92, 45
br i1 %93, label %128, label %94
94: ; preds = %89
%95 = load i8*, i8** %8
%96 = load i8, i8* %95
%97 = sext i8 %96 to i32
%98 = icmp eq i32 %97, 47
br i1 %98, label %128, label %99
99: ; preds = %94
%100 = load i8*, i8** %8
%101 = load i8, i8* %100
%102 = sext i8 %101 to i32
%103 = icmp eq i32 %102, 42
br i1 %103, label %128, label %104
104: ; preds = %99
%105 = load i8*, i8** %8
%106 = load i8, i8* %105
%107 = sext i8 %106 to i32
%108 = icmp eq i32 %107, 37
br i1 %108, label %128, label %109
109: ; preds = %104
%110 = load i8*, i8** %8
%111 = load i8, i8* %110
%112 = sext i8 %111 to i32
%113 = icmp eq i32 %112, 61
br i1 %113, label %128, label %114
114: ; preds = %109
%115 = load i8*, i8** %8
%116 = load i8, i8* %115
%117 = sext i8 %116 to i32
%118 = icmp eq i32 %117, 94
br i1 %118, label %128, label %119
119: ; preds = %114
%120 = load i8*, i8** %8
%121 = load i8, i8* %120
%122 = sext i8 %121 to i32
%123 = icmp eq i32 %122, 64
br i1 %123, label %128, label %124
124: ; preds = %119
%125 = load i8*, i8** %8
%126 = load i8*, i8** %9
%127 = icmp ult i8* %125, %126
br label %128
128: ; preds = %124, %119, %114, %109, %104, %99, %94, %89, %84, %79, %74
%129 = phi i1 [ false, %119 ], [ false, %114 ], [ false, %109 ], [ false, %104 ], [ false, %99 ], [ false, %94 ], [ false, %89 ], [ false, %84 ], [ false, %79 ], [ false, %74 ], [ %127, %124 ]
br i1 %129, label %130, label %138
130: ; preds = %128
%131 = load i8*, i8** %8
%132 = load i8, i8* %131
%133 = load i8*, i8** %11
store i8 %132, i8* %133
%134 = load i8*, i8** %11
%135 = getelementptr inbounds i8, i8* %134, i32 1
store i8* %135, i8** %11
%136 = load i8*, i8** %8
%137 = getelementptr inbounds i8, i8* %136, i32 1
store i8* %137, i8** %8
br label %74
138: ; preds = %128
%139 = load i8*, i8** %11
store i8 32, i8* %139
%140 = load i8*, i8** %11
%141 = getelementptr inbounds i8, i8* %140, i32 1
store i8* %141, i8** %11
%142 = load i8*, i8** %8
%143 = getelementptr inbounds i8, i8* %142, i32 -1
store i8* %143, i8** %8
br label %305
144: ; preds = %69, %65, %61, %57, %53, %49, %45, %41, %37, %33
%145 = load i8, i8* %10
%146 = sext i8 %145 to i32
%147 = icmp eq i32 %146, 43
br i1 %147, label %176, label %148
148: ; preds = %144
%149 = load i8, i8* %10
%150 = sext i8 %149 to i32
%151 = icmp eq i32 %150, 45
br i1 %151, label %176, label %152
152: ; preds = %148
%153 = load i8, i8* %10
%154 = sext i8 %153 to i32
%155 = icmp eq i32 %154, 47
br i1 %155, label %176, label %156
156: ; preds = %152
%157 = load i8, i8* %10
%158 = sext i8 %157 to i32
%159 = icmp eq i32 %158, 42
br i1 %159, label %176, label %160
160: ; preds = %156
%161 = load i8, i8* %10
%162 = sext i8 %161 to i32
%163 = icmp eq i32 %162, 37
br i1 %163, label %176, label %164
164: ; preds = %160
%165 = load i8, i8* %10
%166 = sext i8 %165 to i32
%167 = icmp eq i32 %166, 61
br i1 %167, label %176, label %168
168: ; preds = %164
%169 = load i8, i8* %10
%170 = sext i8 %169 to i32
%171 = icmp eq i32 %170, 94
br i1 %171, label %176, label %172
172: ; preds = %168
%173 = load i8, i8* %10
%174 = sext i8 %173 to i32
%175 = icmp eq i32 %174, 64
br i1 %175, label %176, label %252
176: ; preds = %172, %168, %164, %160, %156, %152, %148, %144
br label %177
177: ; preds = %244, %176
%178 = load i32, i32* %13
%179 = icmp ugt i32 %178, 0
br i1 %179, label %180, label %245
180: ; preds = %177
%181 = load i32, i32* %13
%182 = sub i32 %181, 1
%183 = zext i32 %182 to i64
%184 = getelementptr inbounds [32 x i8], [32 x i8]* %12, i64 0, i64 %183
%185 = load i8, i8* %184
store i8 %185, i8* %14
%186 = load i8, i8* %14
%187 = sext i8 %186 to i32
%188 = icmp eq i32 %187, 43
br i1 %188, label %217, label %189
189: ; preds = %180
%190 = load i8, i8* %14
%191 = sext i8 %190 to i32
%192 = icmp eq i32 %191, 45
br i1 %192, label %217, label %193
193: ; preds = %189
%194 = load i8, i8* %14
%195 = sext i8 %194 to i32
%196 = icmp eq i32 %195, 47
br i1 %196, label %217, label %197
197: ; preds = %193
%198 = load i8, i8* %14
%199 = sext i8 %198 to i32
%200 = icmp eq i32 %199, 42
br i1 %200, label %217, label %201
201: ; preds = %197
%202 = load i8, i8* %14
%203 = sext i8 %202 to i32
%204 = icmp eq i32 %203, 37
br i1 %204, label %217, label %205
205: ; preds = %201
%206 = load i8, i8* %14
%207 = sext i8 %206 to i32
%208 = icmp eq i32 %207, 61
br i1 %208, label %217, label %209
209: ; preds = %205
%210 = load i8, i8* %14
%211 = sext i8 %210 to i32
%212 = icmp eq i32 %211, 94
br i1 %212, label %217, label %213
213: ; preds = %209
%214 = load i8, i8* %14
%215 = sext i8 %214 to i32
%216 = icmp eq i32 %215, 64
br i1 %216, label %217, label %243
217: ; preds = %213, %209, %205, %201, %197, %193, %189, %180
%218 = load i8, i8* %10
%219 = call i64 @op_left_assoc(i8 signext %218)
%220 = icmp ne i64 %219, 0
br i1 %220, label %221, label %227
221: ; preds = %217
%222 = load i8, i8* %10
%223 = call i64 @op_preced(i8 signext %222)
%224 = load i8, i8* %14
%225 = call i64 @op_preced(i8 signext %224)
%226 = icmp sle i64 %223, %225
br i1 %226, label %233, label %227
227: ; preds = %221, %217
%228 = load i8, i8* %10
%229 = call i64 @op_preced(i8 signext %228)
%230 = load i8, i8* %14
%231 = call i64 @op_preced(i8 signext %230)
%232 = icmp slt i64 %229, %231
br i1 %232, label %233, label %243
233: ; preds = %227, %221
%234 = load i8, i8* %14
%235 = load i8*, i8** %11
store i8 %234, i8* %235
%236 = load i8*, i8** %11
%237 = getelementptr inbounds i8, i8* %236, i32 1
store i8* %237, i8** %11
%238 = load i8*, i8** %11
store i8 32, i8* %238
%239 = load i8*, i8** %11
%240 = getelementptr inbounds i8, i8* %239, i32 1
store i8* %240, i8** %11
%241 = load i32, i32* %13
%242 = add i32 %241, -1
store i32 %242, i32* %13
br label %244
243: ; preds = %227, %213
br label %245
244: ; preds = %233
br label %177
245: ; preds = %243, %177
%246 = load i8, i8* %10
%247 = load i32, i32* %13
%248 = zext i32 %247 to i64
%249 = getelementptr inbounds [32 x i8], [32 x i8]* %12, i64 0, i64 %248
store i8 %246, i8* %249
%250 = load i32, i32* %13
%251 = add i32 %250, 1
store i32 %251, i32* %13
br label %304
252: ; preds = %172
%253 = load i8, i8* %10
%254 = sext i8 %253 to i32
%255 = icmp eq i32 %254, 40
br i1 %255, label %256, label %263
256: ; preds = %252
%257 = load i8, i8* %10
%258 = load i32, i32* %13
%259 = zext i32 %258 to i64
%260 = getelementptr inbounds [32 x i8], [32 x i8]* %12, i64 0, i64 %259
store i8 %257, i8* %260
%261 = load i32, i32* %13
%262 = add i32 %261, 1
store i32 %262, i32* %13
br label %303
263: ; preds = %252
%264 = load i8, i8* %10
%265 = sext i8 %264 to i32
%266 = icmp eq i32 %265, 41
br i1 %266, label %267, label %300
267: ; preds = %263
store i32 0, i32* %15
br label %268
268: ; preds = %291, %267
%269 = load i32, i32* %13
%270 = icmp ugt i32 %269, 0
br i1 %270, label %271, label %292
271: ; preds = %268
%272 = load i32, i32* %13
%273 = sub i32 %272, 1
%274 = zext i32 %273 to i64
%275 = getelementptr inbounds [32 x i8], [32 x i8]* %12, i64 0, i64 %274
%276 = load i8, i8* %275
store i8 %276, i8* %14
%277 = load i8, i8* %14
%278 = sext i8 %277 to i32
%279 = icmp eq i32 %278, 40
br i1 %279, label %280, label %281
280: ; preds = %271
store i32 1, i32* %15
br label %292
281: ; preds = %271
%282 = load i8, i8* %14
%283 = load i8*, i8** %11
store i8 %282, i8* %283
%284 = load i8*, i8** %11
%285 = getelementptr inbounds i8, i8* %284, i32 1
store i8* %285, i8** %11
%286 = load i8*, i8** %11
store i8 32, i8* %286
%287 = load i8*, i8** %11
%288 = getelementptr inbounds i8, i8* %287, i32 1
store i8* %288, i8** %11
%289 = load i32, i32* %13
%290 = add i32 %289, -1
store i32 %290, i32* %13
br label %291
291: ; preds = %281
br label %268
292: ; preds = %280, %268
%293 = load i32, i32* %15
%294 = icmp ne i32 %293, 0
br i1 %294, label %297, label %295
295: ; preds = %292
%296 = load i8**, i8*** %7
store i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i64 0, i64 0), i8** %296
store i32 0, i32* %4
br label %340
297: ; preds = %292
%298 = load i32, i32* %13
%299 = add i32 %298, -1
store i32 %299, i32* %13
br label %302
300: ; preds = %263
%301 = load i8**, i8*** %7
store i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i64 0, i64 0), i8** %301
store i32 0, i32* %4
br label %340
302: ; preds = %297
br label %303
303: ; preds = %302, %256
br label %304
304: ; preds = %303, %245
br label %305
305: ; preds = %304, %138
br label %306
306: ; preds = %305, %27
%307 = load i8*, i8** %8
%308 = getelementptr inbounds i8, i8* %307, i32 1
store i8* %308, i8** %8
br label %23
309: ; preds = %23
br label %310
310: ; preds = %328, %309
%311 = load i32, i32* %13
%312 = icmp ugt i32 %311, 0
br i1 %312, label %313, label %338
313: ; preds = %310
%314 = load i32, i32* %13
%315 = sub i32 %314, 1
%316 = zext i32 %315 to i64
%317 = getelementptr inbounds [32 x i8], [32 x i8]* %12, i64 0, i64 %316
%318 = load i8, i8* %317
store i8 %318, i8* %14
%319 = load i8, i8* %14
%320 = sext i8 %319 to i32
%321 = icmp eq i32 %320, 40
br i1 %321, label %326, label %322
322: ; preds = %313
%323 = load i8, i8* %14
%324 = sext i8 %323 to i32
%325 = icmp eq i32 %324, 41
br i1 %325, label %326, label %328
326: ; preds = %322, %313
%327 = load i8**, i8*** %7
store i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i64 0, i64 0), i8** %327
store i32 0, i32* %4
br label %340
328: ; preds = %322
%329 = load i8, i8* %14
%330 = load i8*, i8** %11
store i8 %329, i8* %330
%331 = load i8*, i8** %11
%332 = getelementptr inbounds i8, i8* %331, i32 1
store i8* %332, i8** %11
%333 = load i8*, i8** %11
store i8 32, i8* %333
%334 = load i8*, i8** %11
%335 = getelementptr inbounds i8, i8* %334, i32 1
store i8* %335, i8** %11
%336 = load i32, i32* %13
%337 = add i32 %336, -1
store i32 %337, i32* %13
br label %310
338: ; preds = %310
%339 = load i8*, i8** %11
store i8 0, i8* %339
store i32 1, i32* %4
br label %340
340: ; preds = %338, %326, %300, %295
%341 = load i32, i32* %4
ret i32 %341
}

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