#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*/ exit(int);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *, char *);
int /*<<< orphan*/ stderr;
void usage(char *argv0) {
  char *help = "\nUsage: %s [switches] -i filename\n\n"
               "    -i filename      :file containing data to be clustered\n"
               "    -m max_nclusters :maximum number of clusters allowed    "
               "[default=5]\n"
               "    -n min_nclusters :minimum number of clusters allowed    "
               "[default=5]\n"
               "    -t threshold     :threshold value                       "
               "[default=0.001]\n"
               "    -l nloops        :iteration for each number of clusters "
               "[default=1]\n"
               "    -b               :input file is in binary format\n"
               "    -r               :calculate RMSE                        "
               "[default=off]\n"
               "    -o               :output cluster center coordinates     "
               "[default=off]\n";
  fprintf(stderr, help, argv0);
  exit(-1);
}


x86 assembly (clang, -O0):
<usage>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
lea    0xecd(%rip),%rax
mov    %rax,-0x10(%rbp)
mov    0x2ea2(%rip),%rax
mov    (%rax),%edi
mov    -0x10(%rbp),%rsi
mov    -0x8(%rbp),%rdx
call   1030 <fprintf@plt>
mov    $0xffffffff,%edi
call   1040 <exit@plt>

x86 assembly (clang, -O2):
<usage>:
push   %rax
mov    %rdi,%rdx
mov    0x2eb5(%rip),%rax
mov    (%rax),%edi
lea    0xecc(%rip),%rsi
call   1030 <fprintf@plt>
mov    $0xffffffff,%edi
call   1040 <exit@plt>

LLVM IR (-O0):
@.str = [588 x i8] c"\0AUsage: %s [switches] -i filename\0A\0A -i filename :file containing data to be clustered\0A -m max_nclusters :maximum number of clusters allowed [default=5]\0A -n min_nclusters :minimum number of clusters allowed [default=5]\0A -t threshold :threshold value [default=0.001]\0A -l nloops :iteration for each number of clusters [default=1]\0A -b :input file is in binary format\0A -r :calculate RMSE [default=off]\0A -o :output cluster center coordinates [default=off]\0A\00"
@stderr = global i32 0
define void @usage(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
store i8* %0, i8** %2
store i8* getelementptr inbounds ([588 x i8], [588 x i8]* @.str, i64 0, i64 0), i8** %3
%4 = load i32, i32* @stderr
%5 = load i8*, i8** %3
%6 = load i8*, i8** %2
%7 = call i32 @fprintf(i32 %4, i8* %5, i8* %6)
%8 = call i32 @exit(i32 -1)
unreachable
}

LLVM IR (-O2):
@.str = [588 x i8] c"\0AUsage: %s [switches] -i filename\0A\0A -i filename :file containing data to be clustered\0A -m max_nclusters :maximum number of clusters allowed [default=5]\0A -n min_nclusters :minimum number of clusters allowed [default=5]\0A -t threshold :threshold value [default=0.001]\0A -l nloops :iteration for each number of clusters [default=1]\0A -b :input file is in binary format\0A -r :calculate RMSE [default=off]\0A -o :output cluster center coordinates [default=off]\0A\00"
@stderr = global i32 0
define void @usage(i8* %0) {
%2 = load i32, i32* @stderr
%3 = tail call i32 @fprintf(i32 %2, i8* getelementptr inbounds ([588 x i8], [588 x i8]* @.str, i64 0, i64 0), i8* %0)
%4 = tail call i32 @exit(i32 -1)
unreachable
}