#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 */
struct string {
  int dummy;
};

/* Variables and functions */
int /*<<< orphan*/ _prim_float_string(double);
int /*<<< orphan*/ _prim_int_str(int);
int _prim_str_int(struct string *);
int /*<<< orphan*/ _prim_string_concat(struct string *, struct string *);
int /*<<< orphan*/ _prim_string_cons(int, struct string *);
int _prim_string_eq(struct string *, struct string *);
scalar_t__ _prim_string_head(struct string *);
int _prim_string_lt(struct string *, struct string *);
int /*<<< orphan*/ _prim_string_print(int /*<<< orphan*/);
int /*<<< orphan*/ _prim_string_reverse(struct string *);
int /*<<< orphan*/ _prim_string_tail(struct string *);
struct string *create_string_copy(char *);
struct string *create_string_len(int /*<<< orphan*/);
int feof(int /*<<< orphan*/);
int /*<<< orphan*/ printf(char *, ...);
int /*<<< orphan*/ stdin;
int main() {
  struct string *r = create_string_len(0);
  struct string *s1;
  struct string *s2;
  struct string *s3;
  struct string *s4;
  s1 = create_string_copy("Hello.");
  s2 = create_string_copy("World");
  s3 = create_string_len(0);
  s4 = create_string_copy("");
  _prim_string_print(_prim_string_concat(s1, s2));
  printf(" == Hello.World\n");
  _prim_string_print(_prim_string_concat(s1, s3));
  printf(" == Hello.\n");
  _prim_string_print(_prim_string_concat(s3, s2));
  printf(" == World\n");
  _prim_string_print(_prim_string_concat(s1, s4));
  printf(" == Hello.\n");
  _prim_string_print(_prim_string_concat(s4, s2));
  printf(" == World\n");
  _prim_string_print(_prim_string_concat(s3, s4));
  printf(" == \n");
  _prim_string_print(_prim_string_concat(s3, s4));
  printf(" == \n");
  _prim_string_print(_prim_string_reverse(create_string_copy("")));
  printf(" == \n");
  _prim_string_print(_prim_string_reverse(create_string_copy("a")));
  printf(" == a\n");
  _prim_string_print(_prim_string_reverse(create_string_copy("ab")));
  printf(" == ba \n");
  _prim_string_print(_prim_string_reverse(create_string_copy("abc")));
  printf(" == cba\n");
  printf("%ld == 1\n", _prim_string_eq(s1, s1));
  printf("%ld == 1\n", _prim_string_eq(s2, s2));
  printf("%ld == 1\n", _prim_string_eq(s3, s3));
  printf("%ld == 1\n", _prim_string_eq(s4, s4));
  printf("%ld == 1\n", _prim_string_eq(s3, s4));
  printf("%ld == 0\n", _prim_string_eq(s1, s2));
  printf("%ld == 0\n", _prim_string_eq(s3, s1));
  printf("%c == H\n", (char)_prim_string_head(s1));
  _prim_string_print(_prim_string_tail(create_string_copy("a")));
  printf(" == \n");
  _prim_string_print(_prim_string_tail(create_string_copy("ab")));
  printf(" == b\n");
  _prim_string_print(_prim_string_tail(create_string_copy("abc")));
  printf(" == bc\n");
  _prim_string_print(_prim_string_cons(65, s3));
  printf(" == A\n");
  _prim_string_print(_prim_string_cons(65, create_string_copy("b")));
  printf(" == Ab\n");
  _prim_string_print(_prim_string_cons(65, create_string_copy("bc")));
  printf(" == Abc\n");
  printf("%ld == 0\n",
         _prim_string_lt(create_string_copy(""), create_string_copy("")));
  printf("%ld == 1\n",
         _prim_string_lt(create_string_copy(""), create_string_copy("a")));
  printf("%ld == 0\n",
         _prim_string_lt(create_string_copy("a"), create_string_copy("a")));
  printf("%ld == 1\n",
         _prim_string_lt(create_string_copy("a"), create_string_copy("aa")));
  printf("%ld == 1\n",
         _prim_string_lt(create_string_copy("aa"), create_string_copy("ab")));
  printf("%ld == 1\n",
         _prim_string_lt(create_string_copy("aa"), create_string_copy("ab")));
  printf("%ld == 1\n",
         _prim_string_lt(create_string_copy("aaa"), create_string_copy("ab")));
  printf("%ld == 0\n",
         _prim_string_lt(create_string_copy("aaa"), create_string_copy("")));
  printf("%ld == 0\n",
         _prim_string_lt(create_string_copy("bbb"), create_string_copy("aaa")));
  _prim_string_print(_prim_int_str(0));
  printf(" == 0\n");
  _prim_string_print(_prim_int_str(10));
  printf(" == 10\n");
  _prim_string_print(_prim_int_str(-10));
  printf(" == -10\n");
  printf("%ld == 0\n", _prim_str_int(create_string_copy("0")));
  printf("%ld == 10\n", _prim_str_int(create_string_copy("10")));
  printf("%ld == +10\n", _prim_str_int(create_string_copy("+10")));
  printf("%ld == -10\n", _prim_str_int(create_string_copy("-10")));
  _prim_string_print(_prim_float_string(0.0));
  printf(" == 0.0\n");
  _prim_string_print(_prim_float_string(10.123));
  printf(" == 10.123\n");
  _prim_string_print(_prim_float_string(-10.34));
  printf(" = -10.34\n");
  printf("%d == 0\n", feof(stdin));
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
movl   $0x0,-0x4(%rbp)
xor    %edi,%edi
call   1110 <create_string_len@plt>
mov    %rax,-0x10(%rbp)
lea    0xdfc(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x18(%rbp)
lea    0xdf3(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x20(%rbp)
xor    %edi,%edi
call   1110 <create_string_len@plt>
mov    %rax,-0x28(%rbp)
lea    0xe0b(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1070 <_prim_string_concat@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xdba(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x18(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1070 <_prim_string_concat@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xda9(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x28(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1070 <_prim_string_concat@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xd93(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x18(%rbp),%rdi
mov    -0x30(%rbp),%rsi
call   1070 <_prim_string_concat@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xd65(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x30(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   1070 <_prim_string_concat@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xd4f(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rsi
call   1070 <_prim_string_concat@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xd38(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rsi
call   1070 <_prim_string_concat@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xd16(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xd0d(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   10d0 <_prim_string_reverse@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xced(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xd4b(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   10d0 <_prim_string_reverse@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xcca(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xcc3(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   10d0 <_prim_string_reverse@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xcab(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xca6(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   10d0 <_prim_string_reverse@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xc8f(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x18(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   10f0 <_prim_string_eq@plt>
mov    %eax,%esi
lea    0xc7b(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x20(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   10f0 <_prim_string_eq@plt>
mov    %eax,%esi
lea    0xc5e(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x28(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   10f0 <_prim_string_eq@plt>
mov    %eax,%esi
lea    0xc41(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x30(%rbp),%rdi
mov    -0x30(%rbp),%rsi
call   10f0 <_prim_string_eq@plt>
mov    %eax,%esi
lea    0xc24(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rsi
call   10f0 <_prim_string_eq@plt>
mov    %eax,%esi
lea    0xc07(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x18(%rbp),%rdi
mov    -0x20(%rbp),%rsi
call   10f0 <_prim_string_eq@plt>
mov    %eax,%esi
lea    0xbf4(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x28(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   10f0 <_prim_string_eq@plt>
mov    %eax,%esi
lea    0xbd7(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x18(%rbp),%rdi
call   1060 <_prim_string_head@plt>
movsbl %al,%esi
lea    0xbc7(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xbeb(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   10e0 <_prim_string_tail@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xb64(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xb63(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   10e0 <_prim_string_tail@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xb7e(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xb46(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   10e0 <_prim_string_tail@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xb5c(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    -0x28(%rbp),%rsi
mov    $0x41,%edi
call   10a0 <_prim_string_cons@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xb41(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xaef(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rsi
mov    $0x41,%edi
call   10a0 <_prim_string_cons@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xb1a(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xacd(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rsi
mov    $0x41,%edi
call   10a0 <_prim_string_cons@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0xaf4(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xa8a(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x78(%rbp)
lea    0xa7a(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    -0x78(%rbp),%rdi
mov    %rax,%rsi
call   10c0 <_prim_string_lt@plt>
mov    %eax,%esi
lea    0xa8b(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xa52(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x70(%rbp)
lea    0xaa9(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    -0x70(%rbp),%rdi
mov    %rax,%rsi
call   10c0 <_prim_string_lt@plt>
mov    %eax,%esi
lea    0xa49(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xa81(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x68(%rbp)
lea    0xa71(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    -0x68(%rbp),%rdi
mov    %rax,%rsi
call   10c0 <_prim_string_lt@plt>
mov    %eax,%esi
lea    0xa1b(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xa49(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x60(%rbp)
lea    0xa38(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    -0x60(%rbp),%rdi
mov    %rax,%rsi
call   10c0 <_prim_string_lt@plt>
mov    %eax,%esi
lea    0x9d9(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0xa10(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x58(%rbp)
lea    0x9a2(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    -0x58(%rbp),%rdi
mov    %rax,%rsi
call   10c0 <_prim_string_lt@plt>
mov    %eax,%esi
lea    0x9a1(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0x9d8(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x50(%rbp)
lea    0x96a(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    -0x50(%rbp),%rdi
mov    %rax,%rsi
call   10c0 <_prim_string_lt@plt>
mov    %eax,%esi
lea    0x969(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0x99f(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x48(%rbp)
lea    0x932(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    -0x48(%rbp),%rdi
mov    %rax,%rsi
call   10c0 <_prim_string_lt@plt>
mov    %eax,%esi
lea    0x931(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0x967(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x40(%rbp)
lea    0x8f2(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    -0x40(%rbp),%rdi
mov    %rax,%rsi
call   10c0 <_prim_string_lt@plt>
mov    %eax,%esi
lea    0x903(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0x933(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,-0x38(%rbp)
lea    0x91f(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    -0x38(%rbp),%rdi
mov    %rax,%rsi
call   10c0 <_prim_string_lt@plt>
mov    %eax,%esi
lea    0x8cb(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
xor    %edi,%edi
call   1040 <_prim_int_str@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0x93e(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    $0xa,%edi
call   1040 <_prim_int_str@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0x8d5(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    $0xfffffff6,%edi
call   1040 <_prim_int_str@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0x8d1(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0x8be(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   1030 <_prim_str_int@plt>
mov    %eax,%esi
lea    0x84d(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0x899(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   1030 <_prim_str_int@plt>
mov    %eax,%esi
lea    0x86b(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0x874(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   1030 <_prim_str_int@plt>
mov    %eax,%esi
lea    0x852(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
lea    0x860(%rip),%rdi
call   1080 <create_string_copy@plt>
mov    %rax,%rdi
call   1030 <_prim_str_int@plt>
mov    %eax,%esi
lea    0x83e(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
xorps  %xmm0,%xmm0
call   1100 <_prim_float_string@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0x831(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
movsd  0x748(%rip),%xmm0
call   1100 <_prim_float_string@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0x818(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
movsd  0x71e(%rip),%xmm0
call   1100 <_prim_float_string@plt>
mov    %eax,%edi
call   1090 <_prim_string_print@plt>
lea    0x802(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
mov    0x26e5(%rip),%rax
mov    (%rax),%edi
call   10b0 <feof@plt>
mov    %eax,%esi
lea    0x7ef(%rip),%rdi
mov    $0x0,%al
call   1050 <printf@plt>
xor    %eax,%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
xor    %edi,%edi
call   1120 <create_string_len@plt>
lea    0xe67(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%r14
lea    0xe63(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%r12
xor    %edi,%edi
call   1120 <create_string_len@plt>
mov    %rax,%r15
lea    0xe2a(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbp
mov    %r14,%rdi
mov    %r12,%rsi
call   1080 <_prim_string_concat@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xe0a(%rip),%rdi
call   1040 <puts@plt>
mov    %r14,%rdi
mov    %r15,%rsi
call   1080 <_prim_string_concat@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xdfc(%rip),%r13
mov    %r13,%rdi
call   1040 <puts@plt>
mov    %r15,%rdi
mov    %r12,%rsi
call   1080 <_prim_string_concat@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xde6(%rip),%rbx
mov    %rbx,%rdi
call   1040 <puts@plt>
mov    %r14,%rdi
mov    %rbp,%rsi
call   1080 <_prim_string_concat@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
mov    %r13,%rdi
call   1040 <puts@plt>
mov    %rbp,%rdi
mov    %r12,%rsi
call   1080 <_prim_string_concat@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
mov    %rbx,%rdi
call   1040 <puts@plt>
mov    %r15,%rdi
mov    %rbp,%rsi
call   1080 <_prim_string_concat@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xdb1(%rip),%rbx
mov    %rbx,%rdi
call   1040 <puts@plt>
mov    %r15,%rdi
mov    %rbp,%rsi
call   1080 <_prim_string_concat@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
mov    %rbx,%rdi
call   1040 <puts@plt>
lea    0xd4c(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   10e0 <_prim_string_reverse@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
mov    %rbx,%rdi
call   1040 <puts@plt>
lea    0xd53(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   10e0 <_prim_string_reverse@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xd34(%rip),%rdi
call   1040 <puts@plt>
lea    0xca7(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   10e0 <_prim_string_reverse@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xd13(%rip),%rdi
call   1040 <puts@plt>
lea    0xc83(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   10e0 <_prim_string_reverse@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xcf4(%rip),%rdi
call   1040 <puts@plt>
mov    %r14,%rdi
mov    %r14,%rsi
call   1100 <_prim_string_eq@plt>
lea    0xc55(%rip),%r13
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %r12,%rdi
mov    %r12,%rsi
call   1100 <_prim_string_eq@plt>
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %r15,%rdi
mov    %r15,%rsi
call   1100 <_prim_string_eq@plt>
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %rbp,%rdi
mov    %rbp,%rsi
call   1100 <_prim_string_eq@plt>
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %r15,%rdi
mov    %rbp,%rsi
call   1100 <_prim_string_eq@plt>
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %r14,%rdi
mov    %r12,%rsi
call   1100 <_prim_string_eq@plt>
lea    0xbe5(%rip),%r12
mov    %r12,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %r15,%rdi
mov    %r14,%rsi
call   1100 <_prim_string_eq@plt>
mov    %r12,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %r14,%rdi
call   1070 <_prim_string_head@plt>
movsbl %al,%esi
lea    0xbba(%rip),%rdi
xor    %eax,%eax
call   1060 <printf@plt>
lea    0xc16(%rip),%rbp
mov    %rbp,%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   10f0 <_prim_string_tail@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
mov    %rbx,%rdi
call   1040 <puts@plt>
lea    0xb6b(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   10f0 <_prim_string_tail@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xbec(%rip),%rdi
call   1040 <puts@plt>
lea    0xb47(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   10f0 <_prim_string_tail@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xbcb(%rip),%rdi
call   1040 <puts@plt>
mov    $0x41,%edi
mov    %r15,%rsi
call   10b0 <_prim_string_cons@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xbb2(%rip),%rdi
call   1040 <puts@plt>
lea    0xb9d(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    $0x41,%edi
mov    %rax,%rsi
call   10b0 <_prim_string_cons@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xb8c(%rip),%rdi
call   1040 <puts@plt>
lea    0xb77(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    $0x41,%edi
mov    %rax,%rsi
call   10b0 <_prim_string_cons@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0xb67(%rip),%rdi
call   1040 <puts@plt>
lea    0xb00(%rip),%r14
mov    %r14,%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbx
mov    %r14,%rdi
call   1090 <create_string_copy@plt>
mov    %rbx,%rdi
mov    %rax,%rsi
call   10d0 <_prim_string_lt@plt>
mov    %r12,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %r14,%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbx
mov    %rbp,%rdi
call   1090 <create_string_copy@plt>
mov    %rbx,%rdi
mov    %rax,%rsi
call   10d0 <_prim_string_lt@plt>
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %rbp,%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbx
mov    %rbp,%rdi
call   1090 <create_string_copy@plt>
mov    %rbx,%rdi
mov    %rax,%rsi
call   10d0 <_prim_string_lt@plt>
mov    %r12,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %rbp,%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbp
lea    0xa3a(%rip),%rbx
mov    %rbx,%rdi
call   1090 <create_string_copy@plt>
mov    %rbp,%rdi
mov    %rax,%rsi
call   10d0 <_prim_string_lt@plt>
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %rbx,%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbp
lea    0x9e4(%rip),%r15
mov    %r15,%rdi
call   1090 <create_string_copy@plt>
mov    %rbp,%rdi
mov    %rax,%rsi
call   10d0 <_prim_string_lt@plt>
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %rbx,%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbx
mov    %r15,%rdi
call   1090 <create_string_copy@plt>
mov    %rbx,%rdi
mov    %rax,%rsi
call   10d0 <_prim_string_lt@plt>
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
lea    0x9b8(%rip),%rbx
mov    %rbx,%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbp
mov    %r15,%rdi
call   1090 <create_string_copy@plt>
mov    %rbp,%rdi
mov    %rax,%rsi
call   10d0 <_prim_string_lt@plt>
mov    %r13,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
mov    %rbx,%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbp
mov    %r14,%rdi
call   1090 <create_string_copy@plt>
mov    %rbp,%rdi
mov    %rax,%rsi
call   10d0 <_prim_string_lt@plt>
mov    %r12,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
lea    0x961(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rbp
mov    %rbx,%rdi
call   1090 <create_string_copy@plt>
mov    %rbp,%rdi
mov    %rax,%rsi
call   10d0 <_prim_string_lt@plt>
mov    %r12,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
xor    %edi,%edi
call   1050 <_prim_int_str@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0x9bb(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1050 <_prim_int_str@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0x9a4(%rip),%rdi
call   1040 <puts@plt>
mov    $0xfffffff6,%edi
call   1050 <_prim_int_str@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0x98e(%rip),%rdi
call   1040 <puts@plt>
lea    0x979(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   1030 <_prim_str_int@plt>
mov    %r12,%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
lea    0x95f(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   1030 <_prim_str_int@plt>
lea    0x8af(%rip),%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
lea    0x8b6(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   1030 <_prim_str_int@plt>
lea    0x896(%rip),%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
lea    0x91e(%rip),%rdi
call   1090 <create_string_copy@plt>
mov    %rax,%rdi
call   1030 <_prim_str_int@plt>
lea    0x882(%rip),%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
xorps  %xmm0,%xmm0
call   1110 <_prim_float_string@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0x8ef(%rip),%rdi
call   1040 <puts@plt>
movsd  0x7ff(%rip),%xmm0
call   1110 <_prim_float_string@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0x8d7(%rip),%rdi
call   1040 <puts@plt>
movsd  0x7e7(%rip),%xmm0
call   1110 <_prim_float_string@plt>
mov    %eax,%edi
call   10a0 <_prim_string_print@plt>
lea    0x8c2(%rip),%rdi
call   1040 <puts@plt>
mov    0x27a8(%rip),%rax
mov    (%rax),%edi
call   10c0 <feof@plt>
lea    0x815(%rip),%rdi
mov    %eax,%esi
xor    %eax,%eax
call   1060 <printf@plt>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
%struct.string = type { i32 }
@.str = [7 x i8] c"Hello.\00"
@.str.1 = [6 x i8] c"World\00"
@.str.2 = [1 x i8] zeroinitializer
@.str.3 = [17 x i8] c" == Hello.World\0A\00"
@.str.4 = [12 x i8] c" == Hello.\0A\00"
@.str.5 = [11 x i8] c" == World\0A\00"
@.str.6 = [6 x i8] c" == \0A\00"
@.str.7 = [2 x i8] c"a\00"
@.str.8 = [7 x i8] c" == a\0A\00"
@.str.9 = [3 x i8] c"ab\00"
@.str.10 = [9 x i8] c" == ba \0A\00"
@.str.11 = [4 x i8] c"abc\00"
@.str.12 = [9 x i8] c" == cba\0A\00"
@.str.13 = [10 x i8] c"%ld == 1\0A\00"
@.str.14 = [10 x i8] c"%ld == 0\0A\00"
@.str.15 = [9 x i8] c"%c == H\0A\00"
@.str.16 = [7 x i8] c" == b\0A\00"
@.str.17 = [8 x i8] c" == bc\0A\00"
@.str.18 = [7 x i8] c" == A\0A\00"
@.str.19 = [2 x i8] c"b\00"
@.str.20 = [8 x i8] c" == Ab\0A\00"
@.str.21 = [3 x i8] c"bc\00"
@.str.22 = [9 x i8] c" == Abc\0A\00"
@.str.23 = [3 x i8] c"aa\00"
@.str.24 = [4 x i8] c"aaa\00"
@.str.25 = [4 x i8] c"bbb\00"
@.str.26 = [7 x i8] c" == 0\0A\00"
@.str.27 = [8 x i8] c" == 10\0A\00"
@.str.28 = [9 x i8] c" == -10\0A\00"
@.str.29 = [2 x i8] c"0\00"
@.str.30 = [11 x i8] c"%ld == 10\0A\00"
@.str.31 = [3 x i8] c"10\00"
@.str.32 = [12 x i8] c"%ld == +10\0A\00"
@.str.33 = [4 x i8] c"+10\00"
@.str.34 = [12 x i8] c"%ld == -10\0A\00"
@.str.35 = [4 x i8] c"-10\00"
@.str.36 = [9 x i8] c" == 0.0\0A\00"
@.str.37 = [12 x i8] c" == 10.123\0A\00"
@.str.38 = [11 x i8] c" = -10.34\0A\00"
@.str.39 = [9 x i8] c"%d == 0\0A\00"
@stdin = global i32 0
define i32 @main() {
%1 = alloca i32
%2 = alloca %struct.string*
%3 = alloca %struct.string*
%4 = alloca %struct.string*
%5 = alloca %struct.string*
%6 = alloca %struct.string*
store i32 0, i32* %1
%7 = call %struct.string* @create_string_len(i32 0)
store %struct.string* %7, %struct.string** %2
%8 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0))
store %struct.string* %8, %struct.string** %3
%9 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i64 0, i64 0))
store %struct.string* %9, %struct.string** %4
%10 = call %struct.string* @create_string_len(i32 0)
store %struct.string* %10, %struct.string** %5
%11 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
store %struct.string* %11, %struct.string** %6
%12 = load %struct.string*, %struct.string** %3
%13 = load %struct.string*, %struct.string** %4
%14 = call i32 @_prim_string_concat(%struct.string* %12, %struct.string* %13)
%15 = call i32 @_prim_string_print(i32 %14)
%16 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i64 0, i64 0))
%17 = load %struct.string*, %struct.string** %3
%18 = load %struct.string*, %struct.string** %5
%19 = call i32 @_prim_string_concat(%struct.string* %17, %struct.string* %18)
%20 = call i32 @_prim_string_print(i32 %19)
%21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.4, i64 0, i64 0))
%22 = load %struct.string*, %struct.string** %5
%23 = load %struct.string*, %struct.string** %4
%24 = call i32 @_prim_string_concat(%struct.string* %22, %struct.string* %23)
%25 = call i32 @_prim_string_print(i32 %24)
%26 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i64 0, i64 0))
%27 = load %struct.string*, %struct.string** %3
%28 = load %struct.string*, %struct.string** %6
%29 = call i32 @_prim_string_concat(%struct.string* %27, %struct.string* %28)
%30 = call i32 @_prim_string_print(i32 %29)
%31 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.4, i64 0, i64 0))
%32 = load %struct.string*, %struct.string** %6
%33 = load %struct.string*, %struct.string** %4
%34 = call i32 @_prim_string_concat(%struct.string* %32, %struct.string* %33)
%35 = call i32 @_prim_string_print(i32 %34)
%36 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.5, i64 0, i64 0))
%37 = load %struct.string*, %struct.string** %5
%38 = load %struct.string*, %struct.string** %6
%39 = call i32 @_prim_string_concat(%struct.string* %37, %struct.string* %38)
%40 = call i32 @_prim_string_print(i32 %39)
%41 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0))
%42 = load %struct.string*, %struct.string** %5
%43 = load %struct.string*, %struct.string** %6
%44 = call i32 @_prim_string_concat(%struct.string* %42, %struct.string* %43)
%45 = call i32 @_prim_string_print(i32 %44)
%46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0))
%47 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%48 = call i32 @_prim_string_reverse(%struct.string* %47)
%49 = call i32 @_prim_string_print(i32 %48)
%50 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0))
%51 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%52 = call i32 @_prim_string_reverse(%struct.string* %51)
%53 = call i32 @_prim_string_print(i32 %52)
%54 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.8, i64 0, i64 0))
%55 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%56 = call i32 @_prim_string_reverse(%struct.string* %55)
%57 = call i32 @_prim_string_print(i32 %56)
%58 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.10, i64 0, i64 0))
%59 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i64 0, i64 0))
%60 = call i32 @_prim_string_reverse(%struct.string* %59)
%61 = call i32 @_prim_string_print(i32 %60)
%62 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.12, i64 0, i64 0))
%63 = load %struct.string*, %struct.string** %3
%64 = load %struct.string*, %struct.string** %3
%65 = call i32 @_prim_string_eq(%struct.string* %63, %struct.string* %64)
%66 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %65)
%67 = load %struct.string*, %struct.string** %4
%68 = load %struct.string*, %struct.string** %4
%69 = call i32 @_prim_string_eq(%struct.string* %67, %struct.string* %68)
%70 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %69)
%71 = load %struct.string*, %struct.string** %5
%72 = load %struct.string*, %struct.string** %5
%73 = call i32 @_prim_string_eq(%struct.string* %71, %struct.string* %72)
%74 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %73)
%75 = load %struct.string*, %struct.string** %6
%76 = load %struct.string*, %struct.string** %6
%77 = call i32 @_prim_string_eq(%struct.string* %75, %struct.string* %76)
%78 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %77)
%79 = load %struct.string*, %struct.string** %5
%80 = load %struct.string*, %struct.string** %6
%81 = call i32 @_prim_string_eq(%struct.string* %79, %struct.string* %80)
%82 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %81)
%83 = load %struct.string*, %struct.string** %3
%84 = load %struct.string*, %struct.string** %4
%85 = call i32 @_prim_string_eq(%struct.string* %83, %struct.string* %84)
%86 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %85)
%87 = load %struct.string*, %struct.string** %5
%88 = load %struct.string*, %struct.string** %3
%89 = call i32 @_prim_string_eq(%struct.string* %87, %struct.string* %88)
%90 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %89)
%91 = load %struct.string*, %struct.string** %3
%92 = call i64 @_prim_string_head(%struct.string* %91)
%93 = trunc i64 %92 to i8
%94 = sext i8 %93 to i32
%95 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.15, i64 0, i64 0), i32 %94)
%96 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%97 = call i32 @_prim_string_tail(%struct.string* %96)
%98 = call i32 @_prim_string_print(i32 %97)
%99 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.6, i64 0, i64 0))
%100 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%101 = call i32 @_prim_string_tail(%struct.string* %100)
%102 = call i32 @_prim_string_print(i32 %101)
%103 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.16, i64 0, i64 0))
%104 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i64 0, i64 0))
%105 = call i32 @_prim_string_tail(%struct.string* %104)
%106 = call i32 @_prim_string_print(i32 %105)
%107 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.17, i64 0, i64 0))
%108 = load %struct.string*, %struct.string** %5
%109 = call i32 @_prim_string_cons(i32 65, %struct.string* %108)
%110 = call i32 @_prim_string_print(i32 %109)
%111 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.18, i64 0, i64 0))
%112 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.19, i64 0, i64 0))
%113 = call i32 @_prim_string_cons(i32 65, %struct.string* %112)
%114 = call i32 @_prim_string_print(i32 %113)
%115 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.20, i64 0, i64 0))
%116 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i64 0, i64 0))
%117 = call i32 @_prim_string_cons(i32 65, %struct.string* %116)
%118 = call i32 @_prim_string_print(i32 %117)
%119 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.22, i64 0, i64 0))
%120 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%121 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%122 = call i32 @_prim_string_lt(%struct.string* %120, %struct.string* %121)
%123 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %122)
%124 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%125 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%126 = call i32 @_prim_string_lt(%struct.string* %124, %struct.string* %125)
%127 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %126)
%128 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%129 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%130 = call i32 @_prim_string_lt(%struct.string* %128, %struct.string* %129)
%131 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %130)
%132 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%133 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i64 0, i64 0))
%134 = call i32 @_prim_string_lt(%struct.string* %132, %struct.string* %133)
%135 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %134)
%136 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i64 0, i64 0))
%137 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%138 = call i32 @_prim_string_lt(%struct.string* %136, %struct.string* %137)
%139 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %138)
%140 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i64 0, i64 0))
%141 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%142 = call i32 @_prim_string_lt(%struct.string* %140, %struct.string* %141)
%143 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %142)
%144 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.24, i64 0, i64 0))
%145 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%146 = call i32 @_prim_string_lt(%struct.string* %144, %struct.string* %145)
%147 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %146)
%148 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.24, i64 0, i64 0))
%149 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%150 = call i32 @_prim_string_lt(%struct.string* %148, %struct.string* %149)
%151 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %150)
%152 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.25, i64 0, i64 0))
%153 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.24, i64 0, i64 0))
%154 = call i32 @_prim_string_lt(%struct.string* %152, %struct.string* %153)
%155 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %154)
%156 = call i32 @_prim_int_str(i32 0)
%157 = call i32 @_prim_string_print(i32 %156)
%158 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.26, i64 0, i64 0))
%159 = call i32 @_prim_int_str(i32 10)
%160 = call i32 @_prim_string_print(i32 %159)
%161 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.27, i64 0, i64 0))
%162 = call i32 @_prim_int_str(i32 -10)
%163 = call i32 @_prim_string_print(i32 %162)
%164 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.28, i64 0, i64 0))
%165 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.29, i64 0, i64 0))
%166 = call i32 @_prim_str_int(%struct.string* %165)
%167 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %166)
%168 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i64 0, i64 0))
%169 = call i32 @_prim_str_int(%struct.string* %168)
%170 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.30, i64 0, i64 0), i32 %169)
%171 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.33, i64 0, i64 0))
%172 = call i32 @_prim_str_int(%struct.string* %171)
%173 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.32, i64 0, i64 0), i32 %172)
%174 = call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.35, i64 0, i64 0))
%175 = call i32 @_prim_str_int(%struct.string* %174)
%176 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.34, i64 0, i64 0), i32 %175)
%177 = call i32 @_prim_float_string(double 0.000000e+00)
%178 = call i32 @_prim_string_print(i32 %177)
%179 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.36, i64 0, i64 0))
%180 = call i32 @_prim_float_string(double 1.012300e+01)
%181 = call i32 @_prim_string_print(i32 %180)
%182 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.37, i64 0, i64 0))
%183 = call i32 @_prim_float_string(double -1.034000e+01)
%184 = call i32 @_prim_string_print(i32 %183)
%185 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.38, i64 0, i64 0))
%186 = load i32, i32* @stdin
%187 = call i32 @feof(i32 %186)
%188 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.39, i64 0, i64 0), i32 %187)
ret i32 0
}

LLVM IR (-O2):
%struct.string = type { i32 }
@.str = [7 x i8] c"Hello.\00"
@.str.1 = [6 x i8] c"World\00"
@.str.2 = [1 x i8] zeroinitializer
@.str.7 = [2 x i8] c"a\00"
@.str.9 = [3 x i8] c"ab\00"
@.str.11 = [4 x i8] c"abc\00"
@.str.13 = [10 x i8] c"%ld == 1\0A\00"
@.str.14 = [10 x i8] c"%ld == 0\0A\00"
@.str.15 = [9 x i8] c"%c == H\0A\00"
@.str.19 = [2 x i8] c"b\00"
@.str.21 = [3 x i8] c"bc\00"
@.str.23 = [3 x i8] c"aa\00"
@.str.24 = [4 x i8] c"aaa\00"
@.str.25 = [4 x i8] c"bbb\00"
@.str.29 = [2 x i8] c"0\00"
@.str.30 = [11 x i8] c"%ld == 10\0A\00"
@.str.31 = [3 x i8] c"10\00"
@.str.32 = [12 x i8] c"%ld == +10\0A\00"
@.str.33 = [4 x i8] c"+10\00"
@.str.34 = [12 x i8] c"%ld == -10\0A\00"
@.str.35 = [4 x i8] c"-10\00"
@.str.39 = [9 x i8] c"%d == 0\0A\00"
@stdin = global i32 0
@str = [16 x i8] c" == Hello.World\00"
@str.42 = [11 x i8] c" == Hello.\00"
@str.43 = [10 x i8] c" == World\00"
@str.47 = [6 x i8] c" == a\00"
@str.48 = [8 x i8] c" == ba \00"
@str.49 = [8 x i8] c" == cba\00"
@str.50 = [5 x i8] c" == \00"
@str.51 = [6 x i8] c" == b\00"
@str.52 = [7 x i8] c" == bc\00"
@str.53 = [6 x i8] c" == A\00"
@str.54 = [7 x i8] c" == Ab\00"
@str.55 = [8 x i8] c" == Abc\00"
@str.56 = [6 x i8] c" == 0\00"
@str.57 = [7 x i8] c" == 10\00"
@str.58 = [8 x i8] c" == -10\00"
@str.59 = [8 x i8] c" == 0.0\00"
@str.60 = [11 x i8] c" == 10.123\00"
@str.61 = [10 x i8] c" = -10.34\00"
define i32 @main() {
%1 = tail call %struct.string* @create_string_len(i32 0)
%2 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0))
%3 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i64 0, i64 0))
%4 = tail call %struct.string* @create_string_len(i32 0)
%5 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%6 = tail call i32 @_prim_string_concat(%struct.string* %2, %struct.string* %3)
%7 = tail call i32 @_prim_string_print(i32 %6)
%8 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @str, i64 0, i64 0))
%9 = tail call i32 @_prim_string_concat(%struct.string* %2, %struct.string* %4)
%10 = tail call i32 @_prim_string_print(i32 %9)
%11 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @str.42, i64 0, i64 0))
%12 = tail call i32 @_prim_string_concat(%struct.string* %4, %struct.string* %3)
%13 = tail call i32 @_prim_string_print(i32 %12)
%14 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @str.43, i64 0, i64 0))
%15 = tail call i32 @_prim_string_concat(%struct.string* %2, %struct.string* %5)
%16 = tail call i32 @_prim_string_print(i32 %15)
%17 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @str.42, i64 0, i64 0))
%18 = tail call i32 @_prim_string_concat(%struct.string* %5, %struct.string* %3)
%19 = tail call i32 @_prim_string_print(i32 %18)
%20 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @str.43, i64 0, i64 0))
%21 = tail call i32 @_prim_string_concat(%struct.string* %4, %struct.string* %5)
%22 = tail call i32 @_prim_string_print(i32 %21)
%23 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @str.50, i64 0, i64 0))
%24 = tail call i32 @_prim_string_concat(%struct.string* %4, %struct.string* %5)
%25 = tail call i32 @_prim_string_print(i32 %24)
%26 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @str.50, i64 0, i64 0))
%27 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%28 = tail call i32 @_prim_string_reverse(%struct.string* %27)
%29 = tail call i32 @_prim_string_print(i32 %28)
%30 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @str.50, i64 0, i64 0))
%31 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%32 = tail call i32 @_prim_string_reverse(%struct.string* %31)
%33 = tail call i32 @_prim_string_print(i32 %32)
%34 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @str.47, i64 0, i64 0))
%35 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%36 = tail call i32 @_prim_string_reverse(%struct.string* %35)
%37 = tail call i32 @_prim_string_print(i32 %36)
%38 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @str.48, i64 0, i64 0))
%39 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i64 0, i64 0))
%40 = tail call i32 @_prim_string_reverse(%struct.string* %39)
%41 = tail call i32 @_prim_string_print(i32 %40)
%42 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @str.49, i64 0, i64 0))
%43 = tail call i32 @_prim_string_eq(%struct.string* %2, %struct.string* %2)
%44 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %43)
%45 = tail call i32 @_prim_string_eq(%struct.string* %3, %struct.string* %3)
%46 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %45)
%47 = tail call i32 @_prim_string_eq(%struct.string* %4, %struct.string* %4)
%48 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %47)
%49 = tail call i32 @_prim_string_eq(%struct.string* %5, %struct.string* %5)
%50 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %49)
%51 = tail call i32 @_prim_string_eq(%struct.string* %4, %struct.string* %5)
%52 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %51)
%53 = tail call i32 @_prim_string_eq(%struct.string* %2, %struct.string* %3)
%54 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %53)
%55 = tail call i32 @_prim_string_eq(%struct.string* %4, %struct.string* %2)
%56 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %55)
%57 = tail call i64 @_prim_string_head(%struct.string* %2)
%58 = trunc i64 %57 to i32
%59 = shl i32 %58, 24
%60 = ashr exact i32 %59, 24
%61 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str.15, i64 0, i64 0), i32 %60)
%62 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%63 = tail call i32 @_prim_string_tail(%struct.string* %62)
%64 = tail call i32 @_prim_string_print(i32 %63)
%65 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @str.50, i64 0, i64 0))
%66 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%67 = tail call i32 @_prim_string_tail(%struct.string* %66)
%68 = tail call i32 @_prim_string_print(i32 %67)
%69 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @str.51, i64 0, i64 0))
%70 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i64 0, i64 0))
%71 = tail call i32 @_prim_string_tail(%struct.string* %70)
%72 = tail call i32 @_prim_string_print(i32 %71)
%73 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @str.52, i64 0, i64 0))
%74 = tail call i32 @_prim_string_cons(i32 65, %struct.string* %4)
%75 = tail call i32 @_prim_string_print(i32 %74)
%76 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @str.53, i64 0, i64 0))
%77 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.19, i64 0, i64 0))
%78 = tail call i32 @_prim_string_cons(i32 65, %struct.string* %77)
%79 = tail call i32 @_prim_string_print(i32 %78)
%80 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @str.54, i64 0, i64 0))
%81 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i64 0, i64 0))
%82 = tail call i32 @_prim_string_cons(i32 65, %struct.string* %81)
%83 = tail call i32 @_prim_string_print(i32 %82)
%84 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @str.55, i64 0, i64 0))
%85 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%86 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%87 = tail call i32 @_prim_string_lt(%struct.string* %85, %struct.string* %86)
%88 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %87)
%89 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%90 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%91 = tail call i32 @_prim_string_lt(%struct.string* %89, %struct.string* %90)
%92 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %91)
%93 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%94 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%95 = tail call i32 @_prim_string_lt(%struct.string* %93, %struct.string* %94)
%96 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %95)
%97 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%98 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i64 0, i64 0))
%99 = tail call i32 @_prim_string_lt(%struct.string* %97, %struct.string* %98)
%100 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %99)
%101 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i64 0, i64 0))
%102 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%103 = tail call i32 @_prim_string_lt(%struct.string* %101, %struct.string* %102)
%104 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %103)
%105 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.23, i64 0, i64 0))
%106 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%107 = tail call i32 @_prim_string_lt(%struct.string* %105, %struct.string* %106)
%108 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %107)
%109 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.24, i64 0, i64 0))
%110 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%111 = tail call i32 @_prim_string_lt(%struct.string* %109, %struct.string* %110)
%112 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i64 0, i64 0), i32 %111)
%113 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.24, i64 0, i64 0))
%114 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.2, i64 0, i64 0))
%115 = tail call i32 @_prim_string_lt(%struct.string* %113, %struct.string* %114)
%116 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %115)
%117 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.25, i64 0, i64 0))
%118 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.24, i64 0, i64 0))
%119 = tail call i32 @_prim_string_lt(%struct.string* %117, %struct.string* %118)
%120 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %119)
%121 = tail call i32 @_prim_int_str(i32 0)
%122 = tail call i32 @_prim_string_print(i32 %121)
%123 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @str.56, i64 0, i64 0))
%124 = tail call i32 @_prim_int_str(i32 10)
%125 = tail call i32 @_prim_string_print(i32 %124)
%126 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @str.57, i64 0, i64 0))
%127 = tail call i32 @_prim_int_str(i32 -10)
%128 = tail call i32 @_prim_string_print(i32 %127)
%129 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @str.58, i64 0, i64 0))
%130 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.29, i64 0, i64 0))
%131 = tail call i32 @_prim_str_int(%struct.string* %130)
%132 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.14, i64 0, i64 0), i32 %131)
%133 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i64 0, i64 0))
%134 = tail call i32 @_prim_str_int(%struct.string* %133)
%135 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str.30, i64 0, i64 0), i32 %134)
%136 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.33, i64 0, i64 0))
%137 = tail call i32 @_prim_str_int(%struct.string* %136)
%138 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([12 x i8], [12 x i8]* @.str.32, i64 0, i64 0), i32 %137)
%139 = tail call %struct.string* @create_string_copy(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.35, i64 0, i64 0))
%140 = tail call i32 @_prim_str_int(%struct.string* %139)
%141 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([12 x i8], [12 x i8]* @.str.34, i64 0, i64 0), i32 %140)
%142 = tail call i32 @_prim_float_string(double 0.000000e+00)
%143 = tail call i32 @_prim_string_print(i32 %142)
%144 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([8 x i8], [8 x i8]* @str.59, i64 0, i64 0))
%145 = tail call i32 @_prim_float_string(double 1.012300e+01)
%146 = tail call i32 @_prim_string_print(i32 %145)
%147 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @str.60, i64 0, i64 0))
%148 = tail call i32 @_prim_float_string(double -1.034000e+01)
%149 = tail call i32 @_prim_string_print(i32 %148)
%150 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @str.61, i64 0, i64 0))
%151 = load i32, i32* @stdin
%152 = tail call i32 @feof(i32 %151)
%153 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str.39, i64 0, i64 0), i32 %152)
ret i32 0
}