#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() {
  printf("Usage: sudo ./correlator_test [opts]\n\n");
  printf("Options:\n");
  printf("  --help (-h)                               Display the available "
         "run options.\n");
  printf("  --device (-d) [device_number]             Default: 0. For "
         "multi-GPU computers, can choose larger values.\n");
  printf("  --iterations (-i) [number]                Default: 100. Number of "
         "iterations to test the code.\n");
  printf("  --time_accum (-t) [number]                Default: 256. Range "
         "[1,291] for version from conference, [1,1912] for new alg.\n");
  printf("  --time_steps (-T) [number]                Default: Automatically "
         "generated. Number of time steps of element data.\n");
  printf("  --num_freq (-f) [number]                  Default: 1. Number of "
         "frequency channels to process simultaneously.\n");
  printf("  --num_elements (-e) [number]              Default: 2048. Number of "
         "elements to correlate.\n");
  printf("  --timer_without_copies (-w) [number]      Default: off. When on, "
         "it separates the copy section from the iterations. \n");
  printf("                                                     Not realistic "
         "behaviour, but helpful for timing without using profiler tools.\n");
  printf("  --upper_triangle_convention (-U) [number] Default: 1. (range: "
         "[0,1]). 1 uses the standard pairwise correlation convention. 0 does "
         "not (i.e. complex conjugate of expected results).\n");
  printf("  --check_results (-c)                      Default: off. Calculates "
         "and checks GPU results with CPU calculations.\n");
  printf("  --verbose (-v)                            Default: off. Verbose "
         "calculation check. (Dumps all correlation products).\n");
  printf("  --gen_type (-g) [number]                  Default: 4. (1 = "
         "Constant, 2 = Ramp up, 3 = Ramp down, 4 = Random (seeded)).\n");
  printf("  --random_seed (-r) [number]               Default: 42. The seed "
         "for the pseudorandom generator.\n");
  printf(
      "  --no_repeat_random (-p)                   Default: off. Whether the "
      "random sequence repeats at each time step (and frequency channel).\n");
  printf("  --generate_frequency -q [number]          Default: -1 (All "
         "frequencies). Other numbers generate non-default values for that "
         "frequency channel.\n");
  printf("  --default_real (-x) [number]              Default: 0. (range: [-8, "
         "7]). Only used for higher frequency channels when generate_freq != "
         "ALL_FREQUENCIES.\n");
  printf("  --default_imaginary (-y) [number]         Default: 0. (range: [-8, "
         "7]). Only used for higher frequency channels when generate_freq != "
         "ALL_FREQUENCIES.\n");
  printf("  --initial_real (-X) [number]              Default: 0. (range: [-8, "
         "7]). Only matters for ramped modes.\n");
  printf("  --initial_imaginary (-Y) [number]         Default: 0. (range: [-8, "
         "7]). Only matters for ramped modes.\n");
  printf("  --kernel_batch (-k) [number]              Default: 0. (0= Kernels "
         "from IEEE conference, 1= New more-packed version).\n");
}


x86 assembly (clang, -O0):
<print_help>:
push   %rbp
mov    %rsp,%rbp
lea    0xee5(%rip),%rdi
call   1030 <printf@plt>
lea    0xf00(%rip),%rdi
call   1030 <printf@plt>
lea    0xefe(%rip),%rdi
call   1030 <printf@plt>
lea    0xf42(%rip),%rdi
call   1030 <printf@plt>
lea    0xfa2(%rip),%rdi
call   1030 <printf@plt>
lea    0xff8(%rip),%rdi
call   1030 <printf@plt>
lea    0x1068(%rip),%rdi
call   1030 <printf@plt>
lea    0x10d1(%rip),%rdi
call   1030 <printf@plt>
lea    0x1136(%rip),%rdi
call   1030 <printf@plt>
lea    0x1187(%rip),%rdi
call   1030 <printf@plt>
lea    0x11f3(%rip),%rdi
call   1030 <printf@plt>
lea    0x126b(%rip),%rdi
call   1030 <printf@plt>
lea    0x1316(%rip),%rdi
call   1030 <printf@plt>
lea    0x137e(%rip),%rdi
call   1030 <printf@plt>
lea    0x13ea(%rip),%rdi
call   1030 <printf@plt>
lea    0x1458(%rip),%rdi
call   1030 <printf@plt>
lea    0x14af(%rip),%rdi
call   1030 <printf@plt>
lea    0x152d(%rip),%rdi
call   1030 <printf@plt>
lea    0x15b3(%rip),%rdi
call   1030 <printf@plt>
lea    0x1641(%rip),%rdi
call   1030 <printf@plt>
lea    0x16cf(%rip),%rdi
call   1030 <printf@plt>
lea    0x172d(%rip),%rdi
call   1030 <printf@plt>
lea    0x178b(%rip),%rdi
call   1030 <printf@plt>
pop    %rbp
ret

x86 assembly (clang, -O2):
<print_help>:
push   %rax
lea    0xee8(%rip),%rdi
call   1030 <puts@plt>
lea    0xf02(%rip),%rdi
call   1030 <puts@plt>
lea    0xeff(%rip),%rdi
call   1030 <puts@plt>
lea    0xf42(%rip),%rdi
call   1030 <puts@plt>
lea    0xfa1(%rip),%rdi
call   1030 <puts@plt>
lea    0xff6(%rip),%rdi
call   1030 <puts@plt>
lea    0x1065(%rip),%rdi
call   1030 <puts@plt>
lea    0x10cd(%rip),%rdi
call   1030 <puts@plt>
lea    0x1131(%rip),%rdi
call   1030 <puts@plt>
lea    0x1181(%rip),%rdi
call   1030 <puts@plt>
lea    0x11ec(%rip),%rdi
call   1030 <puts@plt>
lea    0x1263(%rip),%rdi
call   1030 <puts@plt>
lea    0x130d(%rip),%rdi
call   1030 <puts@plt>
lea    0x1374(%rip),%rdi
call   1030 <puts@plt>
lea    0x13df(%rip),%rdi
call   1030 <puts@plt>
lea    0x144c(%rip),%rdi
call   1030 <puts@plt>
lea    0x14a2(%rip),%rdi
call   1030 <puts@plt>
lea    0x151f(%rip),%rdi
call   1030 <puts@plt>
lea    0x15a4(%rip),%rdi
call   1030 <puts@plt>
lea    0x1631(%rip),%rdi
call   1030 <puts@plt>
lea    0x16be(%rip),%rdi
call   1030 <puts@plt>
lea    0x171b(%rip),%rdi
call   1030 <puts@plt>
lea    0x1778(%rip),%rdi
pop    %rax
jmp    1030 <puts@plt>

LLVM IR (-O0):
@.str = [39 x i8] c"Usage: sudo ./correlator_test [opts]\0A\0A\00"
@.str.1 = [10 x i8] c"Options:\0A\00"
@.str.2 = [80 x i8] c" --help (-h) Display the available run options.\0A\00"
@.str.3 = [108 x i8] c" --device (-d) [device_number] Default: 0. For multi-GPU computers, can choose larger values.\0A\00"
@.str.4 = [98 x i8] c" --iterations (-i) [number] Default: 100. Number of iterations to test the code.\0A\00"
@.str.5 = [124 x i8] c" --time_accum (-t) [number] Default: 256. Range [1,291] for version from conference, [1,1912] for new alg.\0A\00"
@.str.6 = [117 x i8] c" --time_steps (-T) [number] Default: Automatically generated. Number of time steps of element data.\0A\00"
@.str.7 = [113 x i8] c" --num_freq (-f) [number] Default: 1. Number of frequency channels to process simultaneously.\0A\00"
@.str.8 = [93 x i8] c" --num_elements (-e) [number] Default: 2048. Number of elements to correlate.\0A\00"
@.str.9 = [120 x i8] c" --timer_without_copies (-w) [number] Default: off. When on, it separates the copy section from the iterations. \0A\00"
@.str.10 = [132 x i8] c" Not realistic behaviour, but helpful for timing without using profiler tools.\0A\00"
@.str.11 = [183 x i8] c" --upper_triangle_convention (-U) [number] Default: 1. (range: [0,1]). 1 uses the standard pairwise correlation convention. 0 does not (i.e. complex conjugate of expected results).\0A\00"
@.str.12 = [116 x i8] c" --check_results (-c) Default: off. Calculates and checks GPU results with CPU calculations.\0A\00"
@.str.13 = [120 x i8] c" --verbose (-v) Default: off. Verbose calculation check. (Dumps all correlation products).\0A\00"
@.str.14 = [122 x i8] c" --gen_type (-g) [number] Default: 4. (1 = Constant, 2 = Ramp up, 3 = Ramp down, 4 = Random (seeded)).\0A\00"
@.str.15 = [99 x i8] c" --random_seed (-r) [number] Default: 42. The seed for the pseudorandom generator.\0A\00"
@.str.16 = [138 x i8] c" --no_repeat_random (-p) Default: off. Whether the random sequence repeats at each time step (and frequency channel).\0A\00"
@.str.17 = [146 x i8] c" --generate_frequency -q [number] Default: -1 (All frequencies). Other numbers generate non-default values for that frequency channel.\0A\00"
@.str.18 = [154 x i8] c" --default_real (-x) [number] Default: 0. (range: [-8, 7]). Only used for higher frequency channels when generate_freq != ALL_FREQUENCIES.\0A\00"
@.str.19 = [154 x i8] c" --default_imaginary (-y) [number] Default: 0. (range: [-8, 7]). Only used for higher frequency channels when generate_freq != ALL_FREQUENCIES.\0A\00"
@.str.20 = [106 x i8] c" --initial_real (-X) [number] Default: 0. (range: [-8, 7]). Only matters for ramped modes.\0A\00"
@.str.21 = [106 x i8] c" --initial_imaginary (-Y) [number] Default: 0. (range: [-8, 7]). Only matters for ramped modes.\0A\00"
@.str.22 = [120 x i8] c" --kernel_batch (-k) [number] Default: 0. (0= Kernels from IEEE conference, 1= New more-packed version).\0A\00"
define void @print_help() {
%1 = call i32 @printf(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str, i64 0, i64 0))
%2 = call i32 @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i64 0, i64 0))
%3 = call i32 @printf(i8* getelementptr inbounds ([80 x i8], [80 x i8]* @.str.2, i64 0, i64 0))
%4 = call i32 @printf(i8* getelementptr inbounds ([108 x i8], [108 x i8]* @.str.3, i64 0, i64 0))
%5 = call i32 @printf(i8* getelementptr inbounds ([98 x i8], [98 x i8]* @.str.4, i64 0, i64 0))
%6 = call i32 @printf(i8* getelementptr inbounds ([124 x i8], [124 x i8]* @.str.5, i64 0, i64 0))
%7 = call i32 @printf(i8* getelementptr inbounds ([117 x i8], [117 x i8]* @.str.6, i64 0, i64 0))
%8 = call i32 @printf(i8* getelementptr inbounds ([113 x i8], [113 x i8]* @.str.7, i64 0, i64 0))
%9 = call i32 @printf(i8* getelementptr inbounds ([93 x i8], [93 x i8]* @.str.8, i64 0, i64 0))
%10 = call i32 @printf(i8* getelementptr inbounds ([120 x i8], [120 x i8]* @.str.9, i64 0, i64 0))
%11 = call i32 @printf(i8* getelementptr inbounds ([132 x i8], [132 x i8]* @.str.10, i64 0, i64 0))
%12 = call i32 @printf(i8* getelementptr inbounds ([183 x i8], [183 x i8]* @.str.11, i64 0, i64 0))
%13 = call i32 @printf(i8* getelementptr inbounds ([116 x i8], [116 x i8]* @.str.12, i64 0, i64 0))
%14 = call i32 @printf(i8* getelementptr inbounds ([120 x i8], [120 x i8]* @.str.13, i64 0, i64 0))
%15 = call i32 @printf(i8* getelementptr inbounds ([122 x i8], [122 x i8]* @.str.14, i64 0, i64 0))
%16 = call i32 @printf(i8* getelementptr inbounds ([99 x i8], [99 x i8]* @.str.15, i64 0, i64 0))
%17 = call i32 @printf(i8* getelementptr inbounds ([138 x i8], [138 x i8]* @.str.16, i64 0, i64 0))
%18 = call i32 @printf(i8* getelementptr inbounds ([146 x i8], [146 x i8]* @.str.17, i64 0, i64 0))
%19 = call i32 @printf(i8* getelementptr inbounds ([154 x i8], [154 x i8]* @.str.18, i64 0, i64 0))
%20 = call i32 @printf(i8* getelementptr inbounds ([154 x i8], [154 x i8]* @.str.19, i64 0, i64 0))
%21 = call i32 @printf(i8* getelementptr inbounds ([106 x i8], [106 x i8]* @.str.20, i64 0, i64 0))
%22 = call i32 @printf(i8* getelementptr inbounds ([106 x i8], [106 x i8]* @.str.21, i64 0, i64 0))
%23 = call i32 @printf(i8* getelementptr inbounds ([120 x i8], [120 x i8]* @.str.22, i64 0, i64 0))
ret void
}

LLVM IR (-O2):
@str = [38 x i8] c"Usage: sudo ./correlator_test [opts]\0A\00"
@str.23 = [9 x i8] c"Options:\00"
@str.24 = [79 x i8] c" --help (-h) Display the available run options.\00"
@str.25 = [107 x i8] c" --device (-d) [device_number] Default: 0. For multi-GPU computers, can choose larger values.\00"
@str.26 = [97 x i8] c" --iterations (-i) [number] Default: 100. Number of iterations to test the code.\00"
@str.27 = [123 x i8] c" --time_accum (-t) [number] Default: 256. Range [1,291] for version from conference, [1,1912] for new alg.\00"
@str.28 = [116 x i8] c" --time_steps (-T) [number] Default: Automatically generated. Number of time steps of element data.\00"
@str.29 = [112 x i8] c" --num_freq (-f) [number] Default: 1. Number of frequency channels to process simultaneously.\00"
@str.30 = [92 x i8] c" --num_elements (-e) [number] Default: 2048. Number of elements to correlate.\00"
@str.31 = [119 x i8] c" --timer_without_copies (-w) [number] Default: off. When on, it separates the copy section from the iterations. \00"
@str.32 = [131 x i8] c" Not realistic behaviour, but helpful for timing without using profiler tools.\00"
@str.33 = [182 x i8] c" --upper_triangle_convention (-U) [number] Default: 1. (range: [0,1]). 1 uses the standard pairwise correlation convention. 0 does not (i.e. complex conjugate of expected results).\00"
@str.34 = [115 x i8] c" --check_results (-c) Default: off. Calculates and checks GPU results with CPU calculations.\00"
@str.35 = [119 x i8] c" --verbose (-v) Default: off. Verbose calculation check. (Dumps all correlation products).\00"
@str.36 = [121 x i8] c" --gen_type (-g) [number] Default: 4. (1 = Constant, 2 = Ramp up, 3 = Ramp down, 4 = Random (seeded)).\00"
@str.37 = [98 x i8] c" --random_seed (-r) [number] Default: 42. The seed for the pseudorandom generator.\00"
@str.38 = [137 x i8] c" --no_repeat_random (-p) Default: off. Whether the random sequence repeats at each time step (and frequency channel).\00"
@str.39 = [145 x i8] c" --generate_frequency -q [number] Default: -1 (All frequencies). Other numbers generate non-default values for that frequency channel.\00"
@str.40 = [153 x i8] c" --default_real (-x) [number] Default: 0. (range: [-8, 7]). Only used for higher frequency channels when generate_freq != ALL_FREQUENCIES.\00"
@str.41 = [153 x i8] c" --default_imaginary (-y) [number] Default: 0. (range: [-8, 7]). Only used for higher frequency channels when generate_freq != ALL_FREQUENCIES.\00"
@str.42 = [105 x i8] c" --initial_real (-X) [number] Default: 0. (range: [-8, 7]). Only matters for ramped modes.\00"
@str.43 = [105 x i8] c" --initial_imaginary (-Y) [number] Default: 0. (range: [-8, 7]). Only matters for ramped modes.\00"
@str.44 = [119 x i8] c" --kernel_batch (-k) [number] Default: 0. (0= Kernels from IEEE conference, 1= New more-packed version).\00"
define void @print_help() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([38 x i8], [38 x i8]* @str, i64 0, i64 0))
%2 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @str.23, i64 0, i64 0))
%3 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([79 x i8], [79 x i8]* @str.24, i64 0, i64 0))
%4 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([107 x i8], [107 x i8]* @str.25, i64 0, i64 0))
%5 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([97 x i8], [97 x i8]* @str.26, i64 0, i64 0))
%6 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([123 x i8], [123 x i8]* @str.27, i64 0, i64 0))
%7 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([116 x i8], [116 x i8]* @str.28, i64 0, i64 0))
%8 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([112 x i8], [112 x i8]* @str.29, i64 0, i64 0))
%9 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([92 x i8], [92 x i8]* @str.30, i64 0, i64 0))
%10 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([119 x i8], [119 x i8]* @str.31, i64 0, i64 0))
%11 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([131 x i8], [131 x i8]* @str.32, i64 0, i64 0))
%12 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([182 x i8], [182 x i8]* @str.33, i64 0, i64 0))
%13 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([115 x i8], [115 x i8]* @str.34, i64 0, i64 0))
%14 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([119 x i8], [119 x i8]* @str.35, i64 0, i64 0))
%15 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([121 x i8], [121 x i8]* @str.36, i64 0, i64 0))
%16 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([98 x i8], [98 x i8]* @str.37, i64 0, i64 0))
%17 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([137 x i8], [137 x i8]* @str.38, i64 0, i64 0))
%18 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([145 x i8], [145 x i8]* @str.39, i64 0, i64 0))
%19 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([153 x i8], [153 x i8]* @str.40, i64 0, i64 0))
%20 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([153 x i8], [153 x i8]* @str.41, i64 0, i64 0))
%21 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([105 x i8], [105 x i8]* @str.42, i64 0, i64 0))
%22 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([105 x i8], [105 x i8]* @str.43, i64 0, i64 0))
%23 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([119 x i8], [119 x i8]* @str.44, i64 0, i64 0))
ret void
}