#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*/ printf(char *, char const *);
void print_usage(const char *prog_name) {
  printf("Usage: %s [OPTIONS] FILES\nCompare files line by line.\nOptions:\n"
         "     -i --ignore-case: Ignore case differences in file contents.\n"
         "     -w --ignore-white-space: Ignore all white space.\n"
         "     -c --console:     Print file differences to the console.\n"
         "                       Console symbols are as follows:\n"
         "                            < Lines from FILE1\n"
         "                            > Lines from FILE2\n"
         "     -e --editor:      Display a split-screen view in vim with "
         "differences between the two files highlighted.\n"
         "     -b --brief:       Print a simple message stating whether the "
         "files differ or are identical.\n"
         "     -d --directory:   Find differences between the contents of two "
         "directories including text files within\n"
         "                       those directories.\n"
         "     -r --recursive:   Recursively compare subdirectories and their "
         "contents.\n\n"
         "     -h --help:        Display this help file.\n"
         "     FILES are 'FILE1 FILE2' or 'DIR1 DIR2'\n"
         "\nReport bugs to <Ivan.E.Guerra-1@ou.edu>\n",
         prog_name);
  return;
}


x86 assembly (clang, -O0):
<print_usage>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rsi
lea    0xed9(%rip),%rdi
call   1030 <printf@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<print_usage>:
mov    %rdi,%rsi
lea    0xee6(%rip),%rdi
jmp    1030 <printf@plt>

LLVM IR (-O0):
@.str = [962 x i8] c"Usage: %s [OPTIONS] FILES\0ACompare files line by line.\0AOptions:\0A -i --ignore-case: Ignore case differences in file contents.\0A -w --ignore-white-space: Ignore all white space.\0A -c --console: Print file differences to the console.\0A Console symbols are as follows:\0A < Lines from FILE1\0A > Lines from FILE2\0A -e --editor: Display a split-screen view in vim with differences between the two files highlighted.\0A -b --brief: Print a simple message stating whether the files differ or are identical.\0A -d --directory: Find differences between the contents of two directories including text files within\0A those directories.\0A -r --recursive: Recursively compare subdirectories and their contents.\0A\0A -h --help: Display this help file.\0A FILES are 'FILE1 FILE2' or 'DIR1 DIR2'\0A\0AReport bugs to <Ivan.E.Guerra-1@ou.edu>\0A\00"
define void @print_usage(i8* %0) {
%2 = alloca i8*
store i8* %0, i8** %2
%3 = load i8*, i8** %2
%4 = call i32 @printf(i8* getelementptr inbounds ([962 x i8], [962 x i8]* @.str, i64 0, i64 0), i8* %3)
ret void
}

LLVM IR (-O2):
@.str = [962 x i8] c"Usage: %s [OPTIONS] FILES\0ACompare files line by line.\0AOptions:\0A -i --ignore-case: Ignore case differences in file contents.\0A -w --ignore-white-space: Ignore all white space.\0A -c --console: Print file differences to the console.\0A Console symbols are as follows:\0A < Lines from FILE1\0A > Lines from FILE2\0A -e --editor: Display a split-screen view in vim with differences between the two files highlighted.\0A -b --brief: Print a simple message stating whether the files differ or are identical.\0A -d --directory: Find differences between the contents of two directories including text files within\0A those directories.\0A -r --recursive: Recursively compare subdirectories and their contents.\0A\0A -h --help: Display this help file.\0A FILES are 'FILE1 FILE2' or 'DIR1 DIR2'\0A\0AReport bugs to <Ivan.E.Guerra-1@ou.edu>\0A\00"
define void @print_usage(i8* %0) {
%2 = tail call i32 @printf(i8* getelementptr inbounds ([962 x i8], [962 x i8]* @.str, i64 0, i64 0), i8* %0)
ret void
}