#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*/ abort();
int atoi(char *);
int /*<<< orphan*/ brightnessMap(char *);
int /*<<< orphan*/ carve(int, char *);
int /*<<< orphan*/ energyMap(char *);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *, ...);
int getopt(int const, char **, char *);
int /*<<< orphan*/ help();
int /*<<< orphan*/ isprint(int);
int /*<<< orphan*/ minimalSeam(int, char *);
int optind;
int optopt;
int /*<<< orphan*/ printf(char *);
int /*<<< orphan*/ stats(char *);
int /*<<< orphan*/ stderr;
int main(int const argc, char **const argv) {
  if (argc < 2) {
    printf("Too few arguments.\n");
    return 1;
  }
  char *argv2[argc + 1];
  for (int i = 0; i <= argc; i++) {
    argv2[i] = argv[i];
  }
  int h_flag = 0;
  int s_flag = 0;
  int b_flag = 0;
  int e_flag = 0;
  int p_flag = 0;
  int p_argidx = 0;
  int p_arg = 0;
  int n_flag = 0;
  int n_argidx = 0;
  int n_arg = 0;
  char *p_argStr = NULL;
  char *n_argStr = NULL;
  char *imgPath = NULL;
  int c;
  while ((c = getopt(argc, argv2, ":hsbep:n:")) != -1) {
    switch (c) {
    case 'h':
      h_flag = 1;
      break;
    case 's':
      s_flag = 1;
      break;
    case 'b':
      b_flag = 1;
      break;
    case 'e':
      e_flag = 1;
      break;
    case 'p':
      p_flag = 1;
      p_argidx = optind - 1;
      break;
    case 'n':
      n_flag = 1;
      n_argidx = optind - 1;
      break;
    case ':':
      fprintf(stderr, "Option -%c missing argument\n", optopt);
      break;
    case '?':
      if (isprint(optopt))
        fprintf(stderr, "Unknown option '-%c'.\n", optopt);
      else
        fprintf(stderr, "Unknown option character '\\x%x'.\n", optopt);
      return 1;
    default:
      abort();
    }
  }
  if (n_argidx >= 2)
    n_argStr = argv[n_argidx];
  if (p_argidx >= 2)
    p_argStr = argv[p_argidx];
  if (n_argStr)
    n_arg = atoi(n_argStr);
  if (p_argStr)
    p_arg = atoi(p_argStr);
  imgPath = argv2[optind];
  if (h_flag) {
    help();
    return 0;
  }
  if (!imgPath) {
    fprintf(stderr, "No image path.\n");
    return 1;
  }
  if (s_flag) {
    stats(imgPath);
    return 0;
  }
  if (b_flag) {
    brightnessMap(imgPath);
    return 0;
  }
  if (e_flag) {
    energyMap(imgPath);
    return 0;
  }
  if (p_flag) {
    minimalSeam(p_arg, imgPath);
    return 0;
  }
  if (n_flag) {
    carve(n_arg, imgPath);
    return 0;
  }
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
cmpl   $0x2,-0x8(%rbp)
jge    11fb <main+0x3b>
lea    0xefe(%rip),%rdi
call   1060 <printf@plt>
movl   $0x1,-0x4(%rbp)
jmp    15b4 <main+0x3f4>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %rsp,%rcx
mov    %rcx,-0x18(%rbp)
lea    0xf(,%rax,8),%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0x78(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x8(%rbp),%eax
jg     125e <main+0x9e>
mov    -0x78(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x24(%rbp),%rdx
mov    (%rcx,%rdx,8),%rdx
movslq -0x24(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    122c <main+0x6c>
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
movq   $0x0,-0x58(%rbp)
movq   $0x0,-0x60(%rbp)
movq   $0x0,-0x68(%rbp)
mov    -0x78(%rbp),%rsi
mov    -0x8(%rbp),%edi
lea    0xe32(%rip),%rdx
call   10b0 <getopt@plt>
mov    %eax,-0x6c(%rbp)
cmp    $0xffffffff,%eax
je     140a <main+0x24a>
mov    -0x6c(%rbp),%eax
add    $0xffffffc6,%eax
mov    %eax,%ecx
mov    %rcx,-0x80(%rbp)
sub    $0x39,%eax
ja     13fe <main+0x23e>
mov    -0x80(%rbp),%rax
lea    0xd05(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x1,-0x28(%rbp)
jmp    1405 <main+0x245>
movl   $0x1,-0x2c(%rbp)
jmp    1405 <main+0x245>
movl   $0x1,-0x30(%rbp)
jmp    1405 <main+0x245>
movl   $0x1,-0x34(%rbp)
jmp    1405 <main+0x245>
movl   $0x1,-0x38(%rbp)
mov    0x2c9e(%rip),%rax
mov    (%rax),%eax
sub    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1405 <main+0x245>
movl   $0x1,-0x44(%rbp)
mov    0x2c83(%rip),%rax
mov    (%rax),%eax
sub    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1405 <main+0x245>
mov    0x2c5f(%rip),%rax
mov    (%rax),%edi
mov    0x2c6e(%rip),%rax
mov    (%rax),%edx
lea    0xd83(%rip),%rsi
mov    $0x0,%al
call   1080 <fprintf@plt>
jmp    1405 <main+0x245>
mov    0x2c52(%rip),%rax
mov    (%rax),%edi
call   1090 <isprint@plt>
cmp    $0x0,%eax
je     13cb <main+0x20b>
mov    0x2c23(%rip),%rax
mov    (%rax),%edi
mov    0x2c32(%rip),%rax
mov    (%rax),%edx
lea    0xd64(%rip),%rsi
mov    $0x0,%al
call   1080 <fprintf@plt>
jmp    13eb <main+0x22b>
mov    0x2bfe(%rip),%rax
mov    (%rax),%edi
mov    0x2c0d(%rip),%rax
mov    (%rax),%edx
lea    0xd56(%rip),%rsi
mov    $0x0,%al
call   1080 <fprintf@plt>
movl   $0x1,-0x4(%rbp)
movl   $0x1,-0x70(%rbp)
jmp    15ad <main+0x3ed>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    12bc <main+0xfc>
cmpl   $0x2,-0x48(%rbp)
jl     1424 <main+0x264>
mov    -0x10(%rbp),%rax
movslq -0x48(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x60(%rbp)
cmpl   $0x2,-0x3c(%rbp)
jl     143e <main+0x27e>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x60(%rbp)
je     1455 <main+0x295>
mov    -0x60(%rbp),%rdi
call   10d0 <atoi@plt>
mov    %eax,-0x4c(%rbp)
cmpq   $0x0,-0x58(%rbp)
je     146c <main+0x2ac>
mov    -0x58(%rbp),%rdi
call   10d0 <atoi@plt>
mov    %eax,-0x40(%rbp)
mov    -0x78(%rbp),%rax
mov    0x2b69(%rip),%rcx
movslq (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x68(%rbp)
cmpl   $0x0,-0x28(%rbp)
je     14a6 <main+0x2e6>
mov    $0x0,%al
call   10c0 <help@plt>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x70(%rbp)
jmp    15ad <main+0x3ed>
cmpq   $0x0,-0x68(%rbp)
jne    14db <main+0x31b>
mov    0x2b18(%rip),%rax
mov    (%rax),%edi
lea    0xc9b(%rip),%rsi
mov    $0x0,%al
call   1080 <fprintf@plt>
movl   $0x1,-0x4(%rbp)
movl   $0x1,-0x70(%rbp)
jmp    15ad <main+0x3ed>
cmpl   $0x0,-0x2c(%rbp)
je     1501 <main+0x341>
mov    -0x68(%rbp),%rdi
call   1040 <stats@plt>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x70(%rbp)
jmp    15ad <main+0x3ed>
cmpl   $0x0,-0x30(%rbp)
je     1527 <main+0x367>
mov    -0x68(%rbp),%rdi
call   10e0 <brightnessMap@plt>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x70(%rbp)
jmp    15ad <main+0x3ed>
cmpl   $0x0,-0x34(%rbp)
je     154d <main+0x38d>
mov    -0x68(%rbp),%rdi
call   1070 <energyMap@plt>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x70(%rbp)
jmp    15ad <main+0x3ed>
cmpl   $0x0,-0x38(%rbp)
je     1576 <main+0x3b6>
mov    -0x40(%rbp),%edi
mov    -0x68(%rbp),%rsi
call   10a0 <minimalSeam@plt>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x70(%rbp)
jmp    15ad <main+0x3ed>
cmpl   $0x0,-0x44(%rbp)
je     159f <main+0x3df>
mov    -0x4c(%rbp),%edi
mov    -0x68(%rbp),%rsi
call   1050 <carve@plt>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x70(%rbp)
jmp    15ad <main+0x3ed>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x70(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rsp
mov    -0x4(%rbp),%eax
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
cmp    $0x1,%edi
jg     11fc <main+0x2c>
lea    0xf57(%rip),%rdi
call   1040 <puts@plt>
mov    $0x1,%ebx
jmp    1455 <main+0x285>
mov    %edi,%ebx
mov    %rsp,-0x30(%rbp)
mov    %rsp,%r15
mov    %edi,%eax
lea    0x17(,%rax,8),%rcx
and    $0xfffffffffffffff0,%rcx
sub    %rcx,%r15
mov    %r15,%rsp
lea    0x8(,%rax,8),%rdx
mov    %r15,%rdi
mov    %rsi,-0x58(%rbp)
call   1090 <memcpy@plt>
mov    $0x1,%al
mov    %eax,-0x38(%rbp)
lea    0xe9b(%rip),%r12
mov    0x2da8(%rip),%r14
lea    0xe97(%rip),%r13
movl   $0x0,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x50(%rbp)
jmp    1296 <main+0xc6>
nopw   0x0(%rax,%rax,1)
mov    0x2d49(%rip),%rax
mov    (%rax),%edi
mov    (%r14),%edx
mov    %r13,%rsi
xor    %eax,%eax
call   1080 <fprintf@plt>
mov    %ebx,%edi
mov    %r15,%rsi
mov    %r12,%rdx
call   10c0 <getopt@plt>
cmp    $0x3a,%eax
je     1280 <main+0xb0>
lea    -0x3f(%rax),%ecx
cmp    $0x34,%ecx
ja     1314 <main+0x144>
lea    0xd49(%rip),%rdx
movslq (%rdx,%rcx,4),%rax
add    %rdx,%rax
jmp    *%rax
movl   $0x1,-0x48(%rbp)
jmp    1296 <main+0xc6>
movl   $0x1,-0x44(%rbp)
jmp    1296 <main+0xc6>
movl   $0x0,-0x38(%rbp)
jmp    1296 <main+0xc6>
mov    0x2cfe(%rip),%rax
mov    (%rax),%eax
add    $0xffffffff,%eax
mov    %eax,-0x50(%rbp)
movl   $0x1,-0x3c(%rbp)
jmp    1296 <main+0xc6>
mov    0x2ce6(%rip),%rax
mov    (%rax),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
movl   $0x1,-0x40(%rbp)
jmp    1296 <main+0xc6>
movl   $0x1,-0x4c(%rbp)
jmp    1296 <main+0xc6>
cmp    $0xffffffff,%eax
jne    1466 <main+0x296>
mov    -0x50(%rbp),%eax
cmp    $0x2,%eax
jl     1355 <main+0x185>
mov    %eax,%eax
mov    -0x58(%rbp),%rcx
mov    (%rcx,%rax,8),%rdi
mov    -0x38(%rbp),%r14d
jmp    135f <main+0x18f>
mov    (%r14),%ebx
mov    %ebx,%edi
call   10a0 <isprint@plt>
mov    0x2c8a(%rip),%rcx
mov    (%rcx),%edi
test   %eax,%eax
je     13c1 <main+0x1f1>
lea    0xda8(%rip),%rsi
jmp    13c8 <main+0x1f8>
xor    %edi,%edi
mov    -0x38(%rbp),%r14d
mov    -0x58(%rbp),%rcx
mov    -0x34(%rbp),%eax
xor    %r12d,%r12d
cmp    $0x2,%eax
jl     1377 <main+0x1a7>
mov    %eax,%eax
mov    (%rcx,%rax,8),%rbx
test   %rdi,%rdi
jne    137e <main+0x1ae>
jmp    1386 <main+0x1b6>
xor    %ebx,%ebx
test   %rdi,%rdi
je     1386 <main+0x1b6>
call   10e0 <atoi@plt>
mov    %eax,%r12d
test   %rbx,%rbx
je     13d8 <main+0x208>
mov    %rbx,%rdi
call   10e0 <atoi@plt>
test   $0x1,%r14b
je     13e0 <main+0x210>
mov    0x2c40(%rip),%rcx
movslq (%rcx),%rcx
mov    (%r15,%rcx,8),%rsi
test   %rsi,%rsi
je     13eb <main+0x21b>
cmpl   $0x0,-0x4c(%rbp)
je     1409 <main+0x239>
mov    %rsi,%rdi
call   1050 <stats@plt>
xor    %ebx,%ebx
jmp    144e <main+0x27e>
lea    0xd4a(%rip),%rsi
mov    %ebx,%edx
xor    %eax,%eax
call   1080 <fprintf@plt>
mov    $0x1,%ebx
jmp    144e <main+0x27e>
xor    %eax,%eax
test   $0x1,%r14b
jne    1399 <main+0x1c9>
xor    %ebx,%ebx
xor    %eax,%eax
call   10d0 <help@plt>
jmp    144e <main+0x27e>
mov    0x2bde(%rip),%rax
mov    (%rax),%edi
lea    0xd39(%rip),%rsi
xor    %eax,%eax
call   1080 <fprintf@plt>
mov    $0x1,%ebx
jmp    144e <main+0x27e>
cmpl   $0x0,-0x48(%rbp)
je     141b <main+0x24b>
mov    %rsi,%rdi
call   10f0 <brightnessMap@plt>
xor    %ebx,%ebx
jmp    144e <main+0x27e>
cmpl   $0x0,-0x44(%rbp)
je     142d <main+0x25d>
mov    %rsi,%rdi
call   1070 <energyMap@plt>
xor    %ebx,%ebx
jmp    144e <main+0x27e>
cmpl   $0x0,-0x40(%rbp)
je     143e <main+0x26e>
mov    %eax,%edi
call   10b0 <minimalSeam@plt>
xor    %ebx,%ebx
jmp    144e <main+0x27e>
xor    %ebx,%ebx
cmpl   $0x0,-0x3c(%rbp)
je     144e <main+0x27e>
mov    %r12d,%edi
call   1060 <carve@plt>
mov    -0x30(%rbp),%rax
mov    %rax,%rsp
mov    %ebx,%eax
lea    -0x28(%rbp),%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %eax,%eax
call   1030 <abort@plt>

LLVM IR (-O0):
@.str = [20 x i8] c"Too few arguments.\0A\00"
@.str.1 = [10 x i8] c":hsbep:n:\00"
@optind = global i32 0
@stderr = global i32 0
@.str.2 = [29 x i8] c"Option -%c missing argument\0A\00"
@optopt = global i32 0
@.str.3 = [23 x i8] c"Unknown option '-%c'.\0A\00"
@.str.4 = [34 x i8] c"Unknown option character '\\x%x'.\0A\00"
@.str.5 = [16 x i8] c"No image path.\0A\00"
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i8*
%20 = alloca i8*
%21 = alloca i8*
%22 = alloca i32
%23 = alloca i32
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
%24 = load i32, i32* %4
%25 = icmp slt i32 %24, 2
br i1 %25, label %26, label %28
26: ; preds = %2
%27 = call i32 @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i64 0, i64 0))
store i32 1, i32* %3
br label %167
28: ; preds = %2
%29 = load i32, i32* %4
%30 = add nsw i32 %29, 1
%31 = zext i32 %30 to i64
%32 = call i8* @llvm.stacksave()
store i8* %32, i8** %6
%33 = alloca i8*, i64 %31
store i64 %31, i64* %7
store i32 0, i32* %8
br label %34
34: ; preds = %47, %28
%35 = load i32, i32* %8
%36 = load i32, i32* %4
%37 = icmp sle i32 %35, %36
br i1 %37, label %38, label %50
38: ; preds = %34
%39 = load i8**, i8*** %5
%40 = load i32, i32* %8
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i8*, i8** %39, i64 %41
%43 = load i8*, i8** %42
%44 = load i32, i32* %8
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i8*, i8** %33, i64 %45
store i8* %43, i8** %46
br label %47
47: ; preds = %38
%48 = load i32, i32* %8
%49 = add nsw i32 %48, 1
store i32 %49, i32* %8
br label %34
50: ; preds = %34
store i32 0, i32* %9
store i32 0, i32* %10
store i32 0, i32* %11
store i32 0, i32* %12
store i32 0, i32* %13
store i32 0, i32* %14
store i32 0, i32* %15
store i32 0, i32* %16
store i32 0, i32* %17
store i32 0, i32* %18
store i8* null, i8** %19
store i8* null, i8** %20
store i8* null, i8** %21
br label %51
51: ; preds = %86, %50
%52 = load i32, i32* %4
%53 = call i32 @getopt(i32 %52, i8** %33, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i64 0, i64 0))
store i32 %53, i32* %22
%54 = icmp ne i32 %53, -1
br i1 %54, label %55, label %87
55: ; preds = %51
%56 = load i32, i32* %22
switch i32 %56, label %84 [
i32 104, label %57
i32 115, label %58
i32 98, label %59
i32 101, label %60
i32 112, label %61
i32 110, label %64
i32 58, label %67
i32 63, label %71
]
57: ; preds = %55
store i32 1, i32* %9
br label %86
58: ; preds = %55
store i32 1, i32* %10
br label %86
59: ; preds = %55
store i32 1, i32* %11
br label %86
60: ; preds = %55
store i32 1, i32* %12
br label %86
61: ; preds = %55
store i32 1, i32* %13
%62 = load i32, i32* @optind
%63 = sub nsw i32 %62, 1
store i32 %63, i32* %14
br label %86
64: ; preds = %55
store i32 1, i32* %16
%65 = load i32, i32* @optind
%66 = sub nsw i32 %65, 1
store i32 %66, i32* %17
br label %86
67: ; preds = %55
%68 = load i32, i32* @stderr
%69 = load i32, i32* @optopt
%70 = call i32 (i32, i8*, ...) @fprintf(i32 %68, i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.2, i64 0, i64 0), i32 %69)
br label %86
71: ; preds = %55
%72 = load i32, i32* @optopt
%73 = call i32 @isprint(i32 %72)
%74 = icmp ne i32 %73, 0
br i1 %74, label %75, label %79
75: ; preds = %71
%76 = load i32, i32* @stderr
%77 = load i32, i32* @optopt
%78 = call i32 (i32, i8*, ...) @fprintf(i32 %76, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.3, i64 0, i64 0), i32 %77)
br label %83
79: ; preds = %71
%80 = load i32, i32* @stderr
%81 = load i32, i32* @optopt
%82 = call i32 (i32, i8*, ...) @fprintf(i32 %80, i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.4, i64 0, i64 0), i32 %81)
br label %83
83: ; preds = %79, %75
store i32 1, i32* %3
store i32 1, i32* %23
br label %165
84: ; preds = %55
%85 = call i32 (...) @abort()
unreachable
86: ; preds = %67, %64, %61, %60, %59, %58, %57
br label %51
87: ; preds = %51
%88 = load i32, i32* %17
%89 = icmp sge i32 %88, 2
br i1 %89, label %90, label %96
90: ; preds = %87
%91 = load i8**, i8*** %5
%92 = load i32, i32* %17
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i8*, i8** %91, i64 %93
%95 = load i8*, i8** %94
store i8* %95, i8** %20
br label %96
96: ; preds = %90, %87
%97 = load i32, i32* %14
%98 = icmp sge i32 %97, 2
br i1 %98, label %99, label %105
99: ; preds = %96
%100 = load i8**, i8*** %5
%101 = load i32, i32* %14
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds i8*, i8** %100, i64 %102
%104 = load i8*, i8** %103
store i8* %104, i8** %19
br label %105
105: ; preds = %99, %96
%106 = load i8*, i8** %20
%107 = icmp ne i8* %106, null
br i1 %107, label %108, label %111
108: ; preds = %105
%109 = load i8*, i8** %20
%110 = call i32 @atoi(i8* %109)
store i32 %110, i32* %18
br label %111
111: ; preds = %108, %105
%112 = load i8*, i8** %19
%113 = icmp ne i8* %112, null
br i1 %113, label %114, label %117
114: ; preds = %111
%115 = load i8*, i8** %19
%116 = call i32 @atoi(i8* %115)
store i32 %116, i32* %15
br label %117
117: ; preds = %114, %111
%118 = load i32, i32* @optind
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds i8*, i8** %33, i64 %119
%121 = load i8*, i8** %120
store i8* %121, i8** %21
%122 = load i32, i32* %9
%123 = icmp ne i32 %122, 0
br i1 %123, label %124, label %126
124: ; preds = %117
%125 = call i32 (...) @help()
store i32 0, i32* %3
store i32 1, i32* %23
br label %165
126: ; preds = %117
%127 = load i8*, i8** %21
%128 = icmp ne i8* %127, null
br i1 %128, label %132, label %129
129: ; preds = %126
%130 = load i32, i32* @stderr
%131 = call i32 (i32, i8*, ...) @fprintf(i32 %130, i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.5, i64 0, i64 0))
store i32 1, i32* %3
store i32 1, i32* %23
br label %165
132: ; preds = %126
%133 = load i32, i32* %10
%134 = icmp ne i32 %133, 0
br i1 %134, label %135, label %138
135: ; preds = %132
%136 = load i8*, i8** %21
%137 = call i32 @stats(i8* %136)
store i32 0, i32* %3
store i32 1, i32* %23
br label %165
138: ; preds = %132
%139 = load i32, i32* %11
%140 = icmp ne i32 %139, 0
br i1 %140, label %141, label %144
141: ; preds = %138
%142 = load i8*, i8** %21
%143 = call i32 @brightnessMap(i8* %142)
store i32 0, i32* %3
store i32 1, i32* %23
br label %165
144: ; preds = %138
%145 = load i32, i32* %12
%146 = icmp ne i32 %145, 0
br i1 %146, label %147, label %150
147: ; preds = %144
%148 = load i8*, i8** %21
%149 = call i32 @energyMap(i8* %148)
store i32 0, i32* %3
store i32 1, i32* %23
br label %165
150: ; preds = %144
%151 = load i32, i32* %13
%152 = icmp ne i32 %151, 0
br i1 %152, label %153, label %157
153: ; preds = %150
%154 = load i32, i32* %15
%155 = load i8*, i8** %21
%156 = call i32 @minimalSeam(i32 %154, i8* %155)
store i32 0, i32* %3
store i32 1, i32* %23
br label %165
157: ; preds = %150
%158 = load i32, i32* %16
%159 = icmp ne i32 %158, 0
br i1 %159, label %160, label %164
160: ; preds = %157
%161 = load i32, i32* %18
%162 = load i8*, i8** %21
%163 = call i32 @carve(i32 %161, i8* %162)
store i32 0, i32* %3
store i32 1, i32* %23
br label %165
164: ; preds = %157
store i32 0, i32* %3
store i32 1, i32* %23
br label %165
165: ; preds = %164, %160, %153, %147, %141, %135, %129, %124, %83
%166 = load i8*, i8** %6
br label %167
167: ; preds = %165, %26
%168 = load i32, i32* %3
ret i32 %168
}

LLVM IR (-O2):
@.str.1 = [10 x i8] c":hsbep:n:\00"
@optind = global i32 0
@stderr = global i32 0
@.str.2 = [29 x i8] c"Option -%c missing argument\0A\00"
@optopt = global i32 0
@.str.3 = [23 x i8] c"Unknown option '-%c'.\0A\00"
@.str.4 = [34 x i8] c"Unknown option character '\\x%x'.\0A\00"
@.str.5 = [16 x i8] c"No image path.\0A\00"
@str = [19 x i8] c"Too few arguments.\00"
define i32 @main(i32 %0, i8** nocapture %1) {
%3 = icmp slt i32 %0, 2
br i1 %3, label %4, label %6
4: ; preds = %2
%5 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([19 x i8], [19 x i8]* @str, i64 0, i64 0))
br label %135
6: ; preds = %2
%7 = bitcast i8** %1 to i8*
%8 = add nuw nsw i32 %0, 1
%9 = zext i32 %8 to i64
%10 = tail call i8* @llvm.stacksave()
%11 = alloca i8*, i64 %9
%12 = bitcast i8** %11 to i8*
%13 = zext i32 %0 to i64
%14 = shl nuw nsw i64 %13, 3
%15 = add nuw nsw i64 %14, 8
br label %16
16: ; preds = %54, %6
%17 = phi i1 [ true, %6 ], [ false, %54 ]
%18 = phi i32 [ 0, %6 ], [ %26, %54 ]
%19 = phi i32 [ 0, %6 ], [ %34, %54 ]
%20 = phi i32 [ 0, %6 ], [ %41, %54 ]
%21 = phi i32 [ 0, %6 ], [ %47, %54 ]
%22 = phi i32 [ 0, %6 ], [ %48, %54 ]
%23 = phi i32 [ 0, %6 ], [ %52, %54 ]
%24 = phi i32 [ 0, %6 ], [ %53, %54 ]
br label %25
25: ; preds = %54, %16
%26 = phi i32 [ %18, %16 ], [ 1, %54 ]
%27 = phi i32 [ %19, %16 ], [ %34, %54 ]
%28 = phi i32 [ %20, %16 ], [ %41, %54 ]
%29 = phi i32 [ %21, %16 ], [ %47, %54 ]
%30 = phi i32 [ %22, %16 ], [ %48, %54 ]
%31 = phi i32 [ %23, %16 ], [ %52, %54 ]
%32 = phi i32 [ %24, %16 ], [ %53, %54 ]
br label %33
33: ; preds = %54, %25
%34 = phi i32 [ %27, %25 ], [ 1, %54 ]
%35 = phi i32 [ %28, %25 ], [ %41, %54 ]
%36 = phi i32 [ %29, %25 ], [ %47, %54 ]
%37 = phi i32 [ %30, %25 ], [ %48, %54 ]
%38 = phi i32 [ %31, %25 ], [ %52, %54 ]
%39 = phi i32 [ %32, %25 ], [ %53, %54 ]
br label %40
40: ; preds = %54, %33
%41 = phi i32 [ %35, %33 ], [ 1, %54 ]
%42 = phi i32 [ %36, %33 ], [ %47, %54 ]
%43 = phi i32 [ %37, %33 ], [ %48, %54 ]
%44 = phi i32 [ %38, %33 ], [ %52, %54 ]
%45 = phi i32 [ %39, %33 ], [ %53, %54 ]
br label %46
46: ; preds = %40, %56
%47 = phi i32 [ %42, %40 ], [ 1, %56 ]
%48 = phi i32 [ %43, %40 ], [ %58, %56 ]
%49 = phi i32 [ %44, %40 ], [ %52, %56 ]
%50 = phi i32 [ %45, %40 ], [ %53, %56 ]
br label %51
51: ; preds = %46, %59
%52 = phi i32 [ %49, %46 ], [ 1, %59 ]
%53 = phi i32 [ %50, %46 ], [ %61, %59 ]
br label %54
54: ; preds = %51, %62
%55 = call i32 @getopt(i32 %0, i8** %11, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i64 0, i64 0))
switch i32 %55, label %75 [
i32 -1, label %77
i32 104, label %16
i32 115, label %25
i32 98, label %33
i32 101, label %40
i32 112, label %56
i32 110, label %59
i32 58, label %62
i32 63, label %66
]
56: ; preds = %54
%57 = load i32, i32* @optind
%58 = add nsw i32 %57, -1
br label %46
59: ; preds = %54
%60 = load i32, i32* @optind
%61 = add nsw i32 %60, -1
br label %51
62: ; preds = %54
%63 = load i32, i32* @stderr
%64 = load i32, i32* @optopt
%65 = call i32 (i32, i8*, ...) @fprintf(i32 %63, i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.2, i64 0, i64 0), i32 %64)
br label %54
66: ; preds = %54
%67 = load i32, i32* @optopt
%68 = call i32 @isprint(i32 %67)
%69 = icmp eq i32 %68, 0
%70 = load i32, i32* @stderr
br i1 %69, label %73, label %71
71: ; preds = %66
%72 = call i32 (i32, i8*, ...) @fprintf(i32 %70, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.3, i64 0, i64 0), i32 %67)
br label %133
73: ; preds = %66
%74 = call i32 (i32, i8*, ...) @fprintf(i32 %70, i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.4, i64 0, i64 0), i32 %67)
br label %133
75: ; preds = %54
%76 = call i32 (...) @abort()
unreachable
77: ; preds = %54
%78 = icmp sgt i32 %53, 1
br i1 %78, label %79, label %83
79: ; preds = %77
%80 = zext i32 %53 to i64
%81 = getelementptr inbounds i8*, i8** %1, i64 %80
%82 = load i8*, i8** %81
br label %83
83: ; preds = %79, %77
%84 = phi i8* [ %82, %79 ], [ null, %77 ]
%85 = icmp sgt i32 %48, 1
br i1 %85, label %86, label %90
86: ; preds = %83
%87 = zext i32 %48 to i64
%88 = getelementptr inbounds i8*, i8** %1, i64 %87
%89 = load i8*, i8** %88
br label %90
90: ; preds = %86, %83
%91 = phi i8* [ %89, %86 ], [ null, %83 ]
%92 = icmp eq i8* %84, null
br i1 %92, label %95, label %93
93: ; preds = %90
%94 = call i32 @atoi(i8* %84)
br label %95
95: ; preds = %93, %90
%96 = phi i32 [ %94, %93 ], [ 0, %90 ]
%97 = icmp eq i8* %91, null
br i1 %97, label %100, label %98
98: ; preds = %95
%99 = call i32 @atoi(i8* %91)
br label %100
100: ; preds = %98, %95
%101 = phi i32 [ %99, %98 ], [ 0, %95 ]
%102 = load i32, i32* @optind
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8*, i8** %11, i64 %103
%105 = load i8*, i8** %104
br i1 %17, label %108, label %106
106: ; preds = %100
%107 = call i32 (...) @help()
br label %133
108: ; preds = %100
%109 = icmp eq i8* %105, null
br i1 %109, label %110, label %113
110: ; preds = %108
%111 = load i32, i32* @stderr
%112 = call i32 (i32, i8*, ...) @fprintf(i32 %111, i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.5, i64 0, i64 0))
br label %133
113: ; preds = %108
%114 = icmp eq i32 %26, 0
br i1 %114, label %117, label %115
115: ; preds = %113
%116 = call i32 @stats(i8* %105)
br label %133
117: ; preds = %113
%118 = icmp eq i32 %34, 0
br i1 %118, label %121, label %119
119: ; preds = %117
%120 = call i32 @brightnessMap(i8* %105)
br label %133
121: ; preds = %117
%122 = icmp eq i32 %41, 0
br i1 %122, label %125, label %123
123: ; preds = %121
%124 = call i32 @energyMap(i8* %105)
br label %133
125: ; preds = %121
%126 = icmp eq i32 %47, 0
br i1 %126, label %129, label %127
127: ; preds = %125
%128 = call i32 @minimalSeam(i32 %101, i8* %105)
br label %133
129: ; preds = %125
%130 = icmp eq i32 %52, 0
br i1 %130, label %133, label %131
131: ; preds = %129
%132 = call i32 @carve(i32 %96, i8* %105)
br label %133
133: ; preds = %129, %71, %73, %131, %127, %123, %119, %115, %110, %106
%134 = phi i32 [ 0, %106 ], [ 0, %115 ], [ 0, %119 ], [ 0, %123 ], [ 0, %127 ], [ 0, %131 ], [ 1, %110 ], [ 1, %73 ], [ 1, %71 ], [ 0, %129 ]
br label %135
135: ; preds = %133, %4
%136 = phi i32 [ 1, %4 ], [ %134, %133 ]
ret i32 %136
}