#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 */
bool is_balanced(char expression[]) {
  char stack[512000];
  int stack_size = 0;
  for (int i = 0; expression[i] != '\0'; i++) {
    char current = expression[i];
    if (current == '{' || current == '(' || current == '[')
      stack[stack_size++] = current;
    else {
      if (stack_size == 0)
        return false;
      char matching = stack[--stack_size];
      if (current == '}' && matching == '{')
        continue;
      else if (current == ')' && matching == '(')
        continue;
      else if (current == ']' && matching == '[')
        continue;
      else
        return false;
    }
  }
  if (stack_size > 0)
    return false;
  else
    return true;
}


x86 assembly (clang, -O0):
<is_balanced>:
push   %rbp
mov    %rsp,%rbp
sub    $0x7cfa0,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x7d014(%rbp)
movl   $0x0,-0x7d018(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x7d018(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     126f <is_balanced+0x16f>
mov    -0x10(%rbp),%rax
movslq -0x7d018(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x7d019(%rbp)
movsbl -0x7d019(%rbp),%eax
cmp    $0x7b,%eax
je     117f <is_balanced+0x7f>
movsbl -0x7d019(%rbp),%eax
cmp    $0x28,%eax
je     117f <is_balanced+0x7f>
movsbl -0x7d019(%rbp),%eax
cmp    $0x5b,%eax
jne    11a4 <is_balanced+0xa4>
mov    -0x7d019(%rbp),%cl
mov    -0x7d014(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x7d014(%rbp)
cltq
mov    %cl,-0x7d010(%rbp,%rax,1)
jmp    1256 <is_balanced+0x156>
cmpl   $0x0,-0x7d014(%rbp)
jne    11bd <is_balanced+0xbd>
movl   $0x0,-0x4(%rbp)
jmp    128f <is_balanced+0x18f>
mov    -0x7d014(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x7d014(%rbp)
cltq
mov    -0x7d010(%rbp,%rax,1),%al
mov    %al,-0x7d01a(%rbp)
movsbl -0x7d019(%rbp),%eax
cmp    $0x7d,%eax
jne    1200 <is_balanced+0x100>
movsbl -0x7d01a(%rbp),%eax
cmp    $0x7b,%eax
jne    1200 <is_balanced+0x100>
jmp    125b <is_balanced+0x15b>
movsbl -0x7d019(%rbp),%eax
cmp    $0x29,%eax
jne    1225 <is_balanced+0x125>
movsbl -0x7d01a(%rbp),%eax
cmp    $0x28,%eax
jne    1225 <is_balanced+0x125>
jmp    125b <is_balanced+0x15b>
movsbl -0x7d019(%rbp),%eax
cmp    $0x5d,%eax
jne    124a <is_balanced+0x14a>
movsbl -0x7d01a(%rbp),%eax
cmp    $0x5b,%eax
jne    124a <is_balanced+0x14a>
jmp    125b <is_balanced+0x15b>
movl   $0x0,-0x4(%rbp)
jmp    128f <is_balanced+0x18f>
jmp    125b <is_balanced+0x15b>
mov    -0x7d018(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x7d018(%rbp)
jmp    1123 <is_balanced+0x23>
cmpl   $0x0,-0x7d014(%rbp)
jle    1288 <is_balanced+0x188>
movl   $0x0,-0x4(%rbp)
jmp    128f <is_balanced+0x18f>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x7cfa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_balanced>:
sub    $0x7cf88,%rsp
xor    %eax,%eax
xor    %esi,%esi
jmp    1123 <is_balanced+0x23>
nopl   (%rax)
cmp    $0x28,%cl
jne    1137 <is_balanced+0x37>
movslq %eax,%rdx
add    $0x1,%eax
mov    %cl,-0x80(%rsp,%rdx,1)
add    $0x1,%rdi
movzbl (%rdi),%ecx
cmp    $0x5a,%cl
jle    1110 <is_balanced+0x10>
cmp    $0x7b,%cl
je     1115 <is_balanced+0x15>
cmp    $0x5b,%cl
je     1115 <is_balanced+0x15>
jmp    113b <is_balanced+0x3b>
test   %cl,%cl
je     1171 <is_balanced+0x71>
test   %eax,%eax
je     1187 <is_balanced+0x87>
cltq
movzbl -0x81(%rsp,%rax,1),%edx
ff
add    $0xffffffffffffffff,%rax
cmp    $0x7d,%cl
jne    1157 <is_balanced+0x57>
cmp    $0x7b,%dl
je     116b <is_balanced+0x6b>
cmp    $0x29,%cl
jne    1161 <is_balanced+0x61>
cmp    $0x28,%dl
je     116b <is_balanced+0x6b>
cmp    $0x5d,%cl
jne    1174 <is_balanced+0x74>
cmp    $0x5b,%dl
jne    1174 <is_balanced+0x74>
add    $0x1,%rdi
jmp    1123 <is_balanced+0x23>
mov    $0x1,%sil
test   %eax,%eax
setle  %al
and    %sil,%al
movzbl %al,%eax
add    $0x7cf88,%rsp
ret
xor    %eax,%eax
add    $0x7cf88,%rsp
ret

LLVM IR (-O0):
define i32 @is_balanced(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca [512000 x i8]
%5 = alloca i32
%6 = alloca i32
%7 = alloca i8
%8 = alloca i8
store i8* %0, i8** %3
store i32 0, i32* %5
store i32 0, i32* %6
br label %9
9: ; preds = %78, %1
%10 = load i8*, i8** %3
%11 = load i32, i32* %6
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds i8, i8* %10, i64 %12
%14 = load i8, i8* %13
%15 = sext i8 %14 to i32
%16 = icmp ne i32 %15, 0
br i1 %16, label %17, label %81
17: ; preds = %9
%18 = load i8*, i8** %3
%19 = load i32, i32* %6
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i8, i8* %18, i64 %20
%22 = load i8, i8* %21
store i8 %22, i8* %7
%23 = load i8, i8* %7
%24 = sext i8 %23 to i32
%25 = icmp eq i32 %24, 123
br i1 %25, label %34, label %26
26: ; preds = %17
%27 = load i8, i8* %7
%28 = sext i8 %27 to i32
%29 = icmp eq i32 %28, 40
br i1 %29, label %34, label %30
30: ; preds = %26
%31 = load i8, i8* %7
%32 = sext i8 %31 to i32
%33 = icmp eq i32 %32, 91
br i1 %33, label %34, label %40
34: ; preds = %30, %26, %17
%35 = load i8, i8* %7
%36 = load i32, i32* %5
%37 = add nsw i32 %36, 1
store i32 %37, i32* %5
%38 = sext i32 %36 to i64
%39 = getelementptr inbounds [512000 x i8], [512000 x i8]* %4, i64 0, i64 %38
store i8 %35, i8* %39
br label %77
40: ; preds = %30
%41 = load i32, i32* %5
%42 = icmp eq i32 %41, 0
br i1 %42, label %43, label %44
43: ; preds = %40
store i32 0, i32* %2
br label %86
44: ; preds = %40
%45 = load i32, i32* %5
%46 = add nsw i32 %45, -1
store i32 %46, i32* %5
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds [512000 x i8], [512000 x i8]* %4, i64 0, i64 %47
%49 = load i8, i8* %48
store i8 %49, i8* %8
%50 = load i8, i8* %7
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %51, 125
br i1 %52, label %53, label %58
53: ; preds = %44
%54 = load i8, i8* %8
%55 = sext i8 %54 to i32
%56 = icmp eq i32 %55, 123
br i1 %56, label %57, label %58
57: ; preds = %53
br label %78
58: ; preds = %53, %44
%59 = load i8, i8* %7
%60 = sext i8 %59 to i32
%61 = icmp eq i32 %60, 41
br i1 %61, label %62, label %67
62: ; preds = %58
%63 = load i8, i8* %8
%64 = sext i8 %63 to i32
%65 = icmp eq i32 %64, 40
br i1 %65, label %66, label %67
66: ; preds = %62
br label %78
67: ; preds = %62, %58
%68 = load i8, i8* %7
%69 = sext i8 %68 to i32
%70 = icmp eq i32 %69, 93
br i1 %70, label %71, label %76
71: ; preds = %67
%72 = load i8, i8* %8
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 91
br i1 %74, label %75, label %76
75: ; preds = %71
br label %78
76: ; preds = %71, %67
store i32 0, i32* %2
br label %86
77: ; preds = %34
br label %78
78: ; preds = %77, %75, %66, %57
%79 = load i32, i32* %6
%80 = add nsw i32 %79, 1
store i32 %80, i32* %6
br label %9
81: ; preds = %9
%82 = load i32, i32* %5
%83 = icmp sgt i32 %82, 0
br i1 %83, label %84, label %85
84: ; preds = %81
store i32 0, i32* %2
br label %86
85: ; preds = %81
store i32 1, i32* %2
br label %86
86: ; preds = %85, %84, %76, %43
%87 = load i32, i32* %2
ret i32 %87
}

LLVM IR (-O2):
define i32 @is_balanced(i8* nocapture %0) {
%2 = alloca [512000 x i8]
%3 = getelementptr inbounds [512000 x i8], [512000 x i8]* %2, i64 0, i64 0
br label %4
4: ; preds = %31, %1
%5 = phi i64 [ %33, %31 ], [ 0, %1 ]
%6 = phi i32 [ %32, %31 ], [ 0, %1 ]
%7 = getelementptr inbounds i8, i8* %0, i64 %5
%8 = load i8, i8* %7
switch i8 %8, label %13 [
i8 0, label %34
i8 123, label %9
i8 91, label %9
i8 40, label %9
]
9: ; preds = %4, %4, %4
%10 = add nsw i32 %6, 1
%11 = sext i32 %6 to i64
%12 = getelementptr inbounds [512000 x i8], [512000 x i8]* %2, i64 0, i64 %11
store i8 %8, i8* %12
br label %31
13: ; preds = %4
%14 = icmp eq i32 %6, 0
br i1 %14, label %40, label %15
15: ; preds = %13
%16 = add nsw i32 %6, -1
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds [512000 x i8], [512000 x i8]* %2, i64 0, i64 %17
%19 = load i8, i8* %18
%20 = icmp eq i8 %8, 125
%21 = icmp eq i8 %19, 123
%22 = select i1 %20, i1 %21, i1 false
br i1 %22, label %31, label %23
23: ; preds = %15
%24 = icmp eq i8 %8, 41
%25 = icmp eq i8 %19, 40
%26 = select i1 %24, i1 %25, i1 false
br i1 %26, label %31, label %27
27: ; preds = %23
%28 = icmp eq i8 %8, 93
%29 = icmp eq i8 %19, 91
%30 = select i1 %28, i1 %29, i1 false
br i1 %30, label %31, label %34
31: ; preds = %27, %9, %15, %23
%32 = phi i32 [ %16, %15 ], [ %16, %23 ], [ %10, %9 ], [ %16, %27 ]
%33 = add nuw i64 %5, 1
br label %4
34: ; preds = %27, %4
%35 = phi i1 [ false, %27 ], [ true, %4 ]
%36 = phi i32 [ %16, %27 ], [ %6, %4 ]
%37 = icmp slt i32 %36, 1
%38 = select i1 %35, i1 %37, i1 false
%39 = zext i1 %38 to i32
br label %40
40: ; preds = %13, %34
%41 = phi i32 [ %39, %34 ], [ 0, %13 ]
ret i32 %41
}