#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 atoi(char *);
scalar_t__ strcmp(char *, char *);
int strtoul(char *, char **, int);
int FindOption(char *option, int p, int h, int u, int argc, char **argv) {
  static int t[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  int i;
  char *c;
  if (argc > 128)
    argc = 128;
  if (u) {
    for (i = 1; i < argc; i++) {
      if (!t[i])
        return i;
    }
    return 0;
  }
  if (p) {
    for (i = 1; i < argc; i++) {
      if (strcmp(argv[i], option) == 0) {
        if (i >= argc)
          return 0;
        t[i + 1] = t[i] = 1;
        if (!h)
          return atoi(argv[i + 1]);
        else
          return strtoul(argv[i + 1], &c, 16);
      }
    }
    return 0;
  } else {
    for (i = 1; i < argc; i++) {
      if (strcmp(argv[i], option) == 0) {
        t[i] = 1;
        return i;
      }
    }
    return 0;
  }
}


x86 assembly (clang, -O0):
<FindOption>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
cmpl   $0x80,-0x20(%rbp)
jle    1161 <FindOption+0x31>
movl   $0x80,-0x20(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     11bd <FindOption+0x8d>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    11b1 <FindOption+0x81>
movslq -0x2c(%rbp),%rcx
lea    0x2ec7(%rip),%rax
cmpl   $0x0,(%rax,%rcx,4)
jne    119e <FindOption+0x6e>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1311 <FindOption+0x1e1>
jmp    11a3 <FindOption+0x73>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1172 <FindOption+0x42>
movl   $0x0,-0x4(%rbp)
jmp    1311 <FindOption+0x1e1>
cmpl   $0x0,-0x14(%rbp)
je     12a8 <FindOption+0x178>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    129c <FindOption+0x16c>
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
mov    -0x10(%rbp),%rsi
call   1030 <strcmp@plt>
cmp    $0x0,%rax
jne    1289 <FindOption+0x159>
mov    -0x2c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jl     1211 <FindOption+0xe1>
movl   $0x0,-0x4(%rbp)
jmp    1311 <FindOption+0x1e1>
movslq -0x2c(%rbp),%rcx
lea    0x2e34(%rip),%rax
movl   $0x1,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
movslq %eax,%rcx
lea    0x2e1d(%rip),%rax
movl   $0x1,(%rax,%rcx,4)
cmpl   $0x0,-0x18(%rbp)
jne    1262 <FindOption+0x132>
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdi
call   1050 <atoi@plt>
mov    %eax,-0x4(%rbp)
jmp    1311 <FindOption+0x1e1>
mov    -0x28(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdi
lea    -0x38(%rbp),%rsi
mov    $0x10,%edx
call   1040 <strtoul@plt>
mov    %eax,-0x4(%rbp)
jmp    1311 <FindOption+0x1e1>
jmp    128e <FindOption+0x15e>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11ce <FindOption+0x9e>
movl   $0x0,-0x4(%rbp)
jmp    1311 <FindOption+0x1e1>
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    130a <FindOption+0x1da>
mov    -0x28(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
mov    -0x10(%rbp),%rsi
call   1030 <strcmp@plt>
cmp    $0x0,%rax
jne    12f7 <FindOption+0x1c7>
movslq -0x2c(%rbp),%rcx
lea    0x2d6b(%rip),%rax
movl   $0x1,(%rax,%rcx,4)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1311 <FindOption+0x1e1>
jmp    12fc <FindOption+0x1cc>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    12af <FindOption+0x17f>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<FindOption>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
cmp    $0x80,%r8d
mov    $0x80,%eax
cmovl  %r8d,%eax
test   %ecx,%ecx
je     1184 <FindOption+0x54>
xor    %r14d,%r14d
cmp    $0x2,%eax
jl     1244 <FindOption+0x114>
mov    %eax,%ecx
mov    $0x1,%eax
lea    0x2ee7(%rip),%rdx
nopl   0x0(%rax)
cmpl   $0x0,(%rdx,%rax,4)
je     11cc <FindOption+0x9c>
add    $0x1,%rax
cmp    %rax,%rcx
jne    1170 <FindOption+0x40>
jmp    1244 <FindOption+0x114>
mov    %r9,%r12
mov    %rdi,%rbp
xor    %r14d,%r14d
test   %esi,%esi
je     11d1 <FindOption+0xa1>
cmp    $0x2,%eax
jl     1244 <FindOption+0x114>
mov    %edx,%r15d
mov    %eax,%r13d
mov    $0x1,%ebx
cs nopw 0x0(%rax,%rax,1)
nop
mov    (%r12,%rbx,8),%rdi
mov    %rbp,%rsi
call   1030 <strcmp@plt>
test   %rax,%rax
je     11fc <FindOption+0xcc>
add    $0x1,%rbx
cmp    %rbx,%r13
jne    11b0 <FindOption+0x80>
jmp    1244 <FindOption+0x114>
mov    %eax,%r14d
jmp    1244 <FindOption+0x114>
cmp    $0x2,%eax
jl     1244 <FindOption+0x114>
mov    %eax,%r15d
mov    $0x1,%ebx
xchg   %ax,%ax
mov    (%r12,%rbx,8),%rdi
mov    %rbp,%rsi
call   1030 <strcmp@plt>
test   %rax,%rax
je     1231 <FindOption+0x101>
add    $0x1,%rbx
cmp    %rbx,%r15
jne    11e0 <FindOption+0xb0>
jmp    1244 <FindOption+0x114>
mov    %ebx,%eax
lea    0x2e4b(%rip),%rcx
movl   $0x1,(%rcx,%rax,4)
add    $0x1,%ebx
movl   $0x1,(%rcx,%rbx,4)
mov    (%r12,%rbx,8),%rdi
test   %r15d,%r15d
je     1256 <FindOption+0x126>
mov    %rsp,%rsi
mov    $0x10,%edx
call   1040 <strtoul@plt>
mov    %eax,%r14d
jmp    1244 <FindOption+0x114>
mov    %ebx,%eax
lea    0x2e16(%rip),%rcx
movl   $0x1,(%rcx,%rax,4)
mov    %ebx,%r14d
mov    %r14d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1050 <atoi@plt>

LLVM IR (-O0):
@FindOption.t = internal global [128 x i32] zeroinitializer
define i32 @FindOption(i8* %0, i32 %1, i32 %2, i32 %3, i32 %4, i8** %5) {
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i8**
%14 = alloca i32
%15 = alloca i8*
store i8* %0, i8** %8
store i32 %1, i32* %9
store i32 %2, i32* %10
store i32 %3, i32* %11
store i32 %4, i32* %12
store i8** %5, i8*** %13
%16 = load i32, i32* %12
%17 = icmp sgt i32 %16, 128
br i1 %17, label %18, label %19
18: ; preds = %6
store i32 128, i32* %12
br label %19
19: ; preds = %18, %6
%20 = load i32, i32* %11
%21 = icmp ne i32 %20, 0
br i1 %21, label %22, label %40
22: ; preds = %19
store i32 1, i32* %14
br label %23
23: ; preds = %36, %22
%24 = load i32, i32* %14
%25 = load i32, i32* %12
%26 = icmp slt i32 %24, %25
br i1 %26, label %27, label %39
27: ; preds = %23
%28 = load i32, i32* %14
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds [128 x i32], [128 x i32]* @FindOption.t, i64 0, i64 %29
%31 = load i32, i32* %30
%32 = icmp ne i32 %31, 0
br i1 %32, label %35, label %33
33: ; preds = %27
%34 = load i32, i32* %14
store i32 %34, i32* %7
br label %117
35: ; preds = %27
br label %36
36: ; preds = %35
%37 = load i32, i32* %14
%38 = add nsw i32 %37, 1
store i32 %38, i32* %14
br label %23
39: ; preds = %23
store i32 0, i32* %7
br label %117
40: ; preds = %19
%41 = load i32, i32* %9
%42 = icmp ne i32 %41, 0
br i1 %42, label %43, label %93
43: ; preds = %40
store i32 1, i32* %14
br label %44
44: ; preds = %89, %43
%45 = load i32, i32* %14
%46 = load i32, i32* %12
%47 = icmp slt i32 %45, %46
br i1 %47, label %48, label %92
48: ; preds = %44
%49 = load i8**, i8*** %13
%50 = load i32, i32* %14
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i8*, i8** %49, i64 %51
%53 = load i8*, i8** %52
%54 = load i8*, i8** %8
%55 = call i64 @strcmp(i8* %53, i8* %54)
%56 = icmp eq i64 %55, 0
br i1 %56, label %57, label %88
57: ; preds = %48
%58 = load i32, i32* %14
%59 = load i32, i32* %12
%60 = icmp sge i32 %58, %59
br i1 %60, label %61, label %62
61: ; preds = %57
store i32 0, i32* %7
br label %117
62: ; preds = %57
%63 = load i32, i32* %14
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds [128 x i32], [128 x i32]* @FindOption.t, i64 0, i64 %64
store i32 1, i32* %65
%66 = load i32, i32* %14
%67 = add nsw i32 %66, 1
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds [128 x i32], [128 x i32]* @FindOption.t, i64 0, i64 %68
store i32 1, i32* %69
%70 = load i32, i32* %10
%71 = icmp ne i32 %70, 0
br i1 %71, label %80, label %72
72: ; preds = %62
%73 = load i8**, i8*** %13
%74 = load i32, i32* %14
%75 = add nsw i32 %74, 1
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds i8*, i8** %73, i64 %76
%78 = load i8*, i8** %77
%79 = call i32 @atoi(i8* %78)
store i32 %79, i32* %7
br label %117
80: ; preds = %62
%81 = load i8**, i8*** %13
%82 = load i32, i32* %14
%83 = add nsw i32 %82, 1
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds i8*, i8** %81, i64 %84
%86 = load i8*, i8** %85
%87 = call i32 @strtoul(i8* %86, i8** %15, i32 16)
store i32 %87, i32* %7
br label %117
88: ; preds = %48
br label %89
89: ; preds = %88
%90 = load i32, i32* %14
%91 = add nsw i32 %90, 1
store i32 %91, i32* %14
br label %44
92: ; preds = %44
store i32 0, i32* %7
br label %117
93: ; preds = %40
store i32 1, i32* %14
br label %94
94: ; preds = %113, %93
%95 = load i32, i32* %14
%96 = load i32, i32* %12
%97 = icmp slt i32 %95, %96
br i1 %97, label %98, label %116
98: ; preds = %94
%99 = load i8**, i8*** %13
%100 = load i32, i32* %14
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds i8*, i8** %99, i64 %101
%103 = load i8*, i8** %102
%104 = load i8*, i8** %8
%105 = call i64 @strcmp(i8* %103, i8* %104)
%106 = icmp eq i64 %105, 0
br i1 %106, label %107, label %112
107: ; preds = %98
%108 = load i32, i32* %14
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds [128 x i32], [128 x i32]* @FindOption.t, i64 0, i64 %109
store i32 1, i32* %110
%111 = load i32, i32* %14
store i32 %111, i32* %7
br label %117
112: ; preds = %98
br label %113
113: ; preds = %112
%114 = load i32, i32* %14
%115 = add nsw i32 %114, 1
store i32 %115, i32* %14
br label %94
116: ; preds = %94
store i32 0, i32* %7
br label %117
117: ; preds = %116, %107, %92, %80, %72, %61, %39, %33
%118 = load i32, i32* %7
ret i32 %118
}

LLVM IR (-O2):
@FindOption.t = internal unnamed_addr global [128 x i32] zeroinitializer
define i32 @FindOption(i8* %0, i32 %1, i32 %2, i32 %3, i32 %4, i8** nocapture %5) {
%7 = alloca i8*
%8 = bitcast i8** %7 to i8*
%9 = icmp slt i32 %4, 128
%10 = select i1 %9, i32 %4, i32 128
%11 = icmp eq i32 %3, 0
br i1 %11, label %24, label %12
12: ; preds = %6
%13 = icmp sgt i32 %10, 1
br i1 %13, label %14, label %70
14: ; preds = %12
%15 = zext i32 %10 to i64
br label %16
16: ; preds = %14, %21
%17 = phi i64 [ 1, %14 ], [ %22, %21 ]
%18 = getelementptr inbounds [128 x i32], [128 x i32]* @FindOption.t, i64 0, i64 %17
%19 = load i32, i32* %18
%20 = icmp eq i32 %19, 0
br i1 %20, label %68, label %21
21: ; preds = %16
%22 = add nuw nsw i64 %17, 1
%23 = icmp eq i64 %22, %15
br i1 %23, label %70, label %16
24: ; preds = %6
%25 = icmp eq i32 %1, 0
%26 = icmp sgt i32 %10, 1
br i1 %25, label %30, label %27
27: ; preds = %24
br i1 %26, label %28, label %70
28: ; preds = %27
%29 = zext i32 %10 to i64
br label %33
30: ; preds = %24
br i1 %26, label %31, label %70
31: ; preds = %30
%32 = zext i32 %10 to i64
br label %55
33: ; preds = %28, %52
%34 = phi i64 [ 1, %28 ], [ %53, %52 ]
%35 = getelementptr inbounds i8*, i8** %5, i64 %34
%36 = load i8*, i8** %35
%37 = tail call i64 @strcmp(i8* %36, i8* %0)
%38 = icmp eq i64 %37, 0
br i1 %38, label %39, label %52
39: ; preds = %33
%40 = and i64 %34, 4294967295
%41 = getelementptr inbounds [128 x i32], [128 x i32]* @FindOption.t, i64 0, i64 %40
store i32 1, i32* %41
%42 = add nuw i64 %34, 1
%43 = and i64 %42, 4294967295
%44 = getelementptr inbounds [128 x i32], [128 x i32]* @FindOption.t, i64 0, i64 %43
store i32 1, i32* %44
%45 = icmp eq i32 %2, 0
%46 = getelementptr inbounds i8*, i8** %5, i64 %43
%47 = load i8*, i8** %46
br i1 %45, label %48, label %50
48: ; preds = %39
%49 = tail call i32 @atoi(i8* %47)
br label %70
50: ; preds = %39
%51 = call i32 @strtoul(i8* %47, i8** %7, i32 16)
br label %70
52: ; preds = %33
%53 = add nuw nsw i64 %34, 1
%54 = icmp eq i64 %53, %29
br i1 %54, label %70, label %33
55: ; preds = %31, %65
%56 = phi i64 [ 1, %31 ], [ %66, %65 ]
%57 = getelementptr inbounds i8*, i8** %5, i64 %56
%58 = load i8*, i8** %57
%59 = tail call i64 @strcmp(i8* %58, i8* %0)
%60 = icmp eq i64 %59, 0
br i1 %60, label %61, label %65
61: ; preds = %55
%62 = trunc i64 %56 to i32
%63 = and i64 %56, 4294967295
%64 = getelementptr inbounds [128 x i32], [128 x i32]* @FindOption.t, i64 0, i64 %63
store i32 1, i32* %64
br label %70
65: ; preds = %55
%66 = add nuw nsw i64 %56, 1
%67 = icmp eq i64 %66, %32
br i1 %67, label %70, label %55
68: ; preds = %16
%69 = trunc i64 %17 to i32
br label %70
70: ; preds = %21, %52, %65, %68, %12, %27, %30, %61, %50, %48
%71 = phi i32 [ %51, %50 ], [ %49, %48 ], [ %62, %61 ], [ 0, %30 ], [ 0, %27 ], [ 0, %12 ], [ %69, %68 ], [ 0, %65 ], [ 0, %52 ], [ 0, %21 ]
ret i32 %71
}