#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 *);
void print_help_string(void) {
  printf(
      "BYE clear database and exit\n"
      "HELP display this help message\n"
      "\n"
      "LIST KEYS displays all keys in current state\n"
      "LIST ENTRIES displays all entries in current state\n"
      "LIST SNAPSHOTS displays all snapshots in the database\n"
      "\n"
      "GET <key> displays entry values\n"
      "DEL <key> deletes entry from current state\n"
      "PURGE <key> deletes entry from current state and snapshots\n"
      "\n"
      "SET <key> <value ...> sets entry values\n"
      "PUSH <key> <value ...> pushes each value to the front one at a time\n"
      "APPEND <key> <value ...> append each value to the back one at a time\n"
      "\n"
      "PICK <key> <index> displays entry value at index\n"
      "PLUCK <key> <index> displays and removes entry value at index\n"
      "POP <key> displays and removes the front entry value\n"
      "\n"
      "DROP <id> deletes snapshot\n"
      "ROLLBACK <id> restores to snapshot and deletes newer snapshots\n"
      "CHECKOUT <id> replaces current state with a copy of snapshot\n"
      "SNAPSHOT saves the current state as a snapshot\n"
      "\n"
      "MIN <key> displays minimum entry value\n"
      "MAX <key> displays maximum entry value\n"
      "SUM <key> displays sum of entry values\n"
      "LEN <key> displays number of entry values\n"
      "\n"
      "REV <key> reverses order of entry values\n"
      "UNIQ <key> removes repeated adjacent entry values\n"
      "SORT <key> sorts entry values in ascending order\n");
}


x86 assembly (clang, -O0):
<print_help_string>:
push   %rbp
mov    %rsp,%rbp
lea    0xee5(%rip),%rdi
call   1030 <printf@plt>
pop    %rbp
ret

x86 assembly (clang, -O2):
<print_help_string>:
lea    0xee9(%rip),%rdi
jmp    1030 <puts@plt>

LLVM IR (-O0):
@.str = [1189 x i8] c"BYE clear database and exit\0AHELP display this help message\0A\0ALIST KEYS displays all keys in current state\0ALIST ENTRIES displays all entries in current state\0ALIST SNAPSHOTS displays all snapshots in the database\0A\0AGET <key> displays entry values\0ADEL <key> deletes entry from current state\0APURGE <key> deletes entry from current state and snapshots\0A\0ASET <key> <value ...> sets entry values\0APUSH <key> <value ...> pushes each value to the front one at a time\0AAPPEND <key> <value ...> append each value to the back one at a time\0A\0APICK <key> <index> displays entry value at index\0APLUCK <key> <index> displays and removes entry value at index\0APOP <key> displays and removes the front entry value\0A\0ADROP <id> deletes snapshot\0AROLLBACK <id> restores to snapshot and deletes newer snapshots\0ACHECKOUT <id> replaces current state with a copy of snapshot\0ASNAPSHOT saves the current state as a snapshot\0A\0AMIN <key> displays minimum entry value\0AMAX <key> displays maximum entry value\0ASUM <key> displays sum of entry values\0ALEN <key> displays number of entry values\0A\0AREV <key> reverses order of entry values\0AUNIQ <key> removes repeated adjacent entry values\0ASORT <key> sorts entry values in ascending order\0A\00"
define void @print_help_string() {
%1 = call i32 @printf(i8* getelementptr inbounds ([1189 x i8], [1189 x i8]* @.str, i64 0, i64 0))
ret void
}

LLVM IR (-O2):
@str = [1188 x i8] c"BYE clear database and exit\0AHELP display this help message\0A\0ALIST KEYS displays all keys in current state\0ALIST ENTRIES displays all entries in current state\0ALIST SNAPSHOTS displays all snapshots in the database\0A\0AGET <key> displays entry values\0ADEL <key> deletes entry from current state\0APURGE <key> deletes entry from current state and snapshots\0A\0ASET <key> <value ...> sets entry values\0APUSH <key> <value ...> pushes each value to the front one at a time\0AAPPEND <key> <value ...> append each value to the back one at a time\0A\0APICK <key> <index> displays entry value at index\0APLUCK <key> <index> displays and removes entry value at index\0APOP <key> displays and removes the front entry value\0A\0ADROP <id> deletes snapshot\0AROLLBACK <id> restores to snapshot and deletes newer snapshots\0ACHECKOUT <id> replaces current state with a copy of snapshot\0ASNAPSHOT saves the current state as a snapshot\0A\0AMIN <key> displays minimum entry value\0AMAX <key> displays maximum entry value\0ASUM <key> displays sum of entry values\0ALEN <key> displays number of entry values\0A\0AREV <key> reverses order of entry values\0AUNIQ <key> removes repeated adjacent entry values\0ASORT <key> sorts entry values in ascending order\00"
define void @print_help_string() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([1188 x i8], [1188 x i8]* @str, i64 0, i64 0))
ret void
}