#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 */
char *my_memcpy(char *, char *, int);
char *my_memset(char *, char, int);
int /*<<< orphan*/ to_stdout(char);
int main(void) {
  char src[20];
  char dst[30];
  char *vet;
  char *s, *d;
  int i, j, N;
  for (i = 0; i < 20; i++)
    src[i] = (char)i + 'a';
  for (i = 0; i < 30; i++)
    dst[i] = (char)255;
  dst[(30 - 1)] = (char)129;
  for (j = 1; j <= 15; j++) {
    N = j;
    s = src;
    d = dst;
    vet = my_memcpy(d, s, N);
    for (i = 0; i < N; i++) {
      to_stdout(vet[i]);
    };
    to_stdout('\n');
  }
  for (j = 1; j <= 15; j++) {
    N = j;
    d = dst;
    vet = my_memset(d, (char)('c' + j), N);
    for (i = 0; i < N; i++) {
      to_stdout(vet[i]);
    };
    to_stdout('\n');
  }
  return (0);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
movl   $0x0,-0x4(%rbp)
movl   $0x0,-0x5c(%rbp)
cmpl   $0x14,-0x5c(%rbp)
jge    1171 <main+0x41>
mov    -0x5c(%rbp),%eax
movsbl %al,%eax
add    $0x61,%eax
mov    %al,%cl
movslq -0x5c(%rbp),%rax
mov    %cl,-0x20(%rbp,%rax,1)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1146 <main+0x16>
movl   $0x0,-0x5c(%rbp)
cmpl   $0x1e,-0x5c(%rbp)
jge    1199 <main+0x69>
movslq -0x5c(%rbp),%rax
movb   $0xff,-0x40(%rbp,%rax,1)
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1178 <main+0x48>
movb   $0x81,-0x23(%rbp)
movl   $0x1,-0x60(%rbp)
cmpl   $0xf,-0x60(%rbp)
jg     1222 <main+0xf2>
mov    -0x60(%rbp),%eax
mov    %eax,-0x64(%rbp)
lea    -0x20(%rbp),%rax
mov    %rax,-0x50(%rbp)
lea    -0x40(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rdi
mov    -0x50(%rbp),%rsi
mov    -0x64(%rbp),%edx
call   1050 <my_memcpy@plt>
mov    %rax,-0x48(%rbp)
movl   $0x0,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
cmp    -0x64(%rbp),%eax
jge    120a <main+0xda>
mov    -0x48(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <to_stdout@plt>
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    11df <main+0xaf>
mov    $0xa,%edi
call   1030 <to_stdout@plt>
mov    -0x60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    11a4 <main+0x74>
movl   $0x1,-0x60(%rbp)
cmpl   $0xf,-0x60(%rbp)
jg     12a4 <main+0x174>
mov    -0x60(%rbp),%eax
mov    %eax,-0x64(%rbp)
lea    -0x40(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rdi
mov    -0x60(%rbp),%eax
add    $0x63,%eax
mov    -0x64(%rbp),%edx
movsbl %al,%esi
call   1040 <my_memset@plt>
mov    %rax,-0x48(%rbp)
movl   $0x0,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
cmp    -0x64(%rbp),%eax
jge    128c <main+0x15c>
mov    -0x48(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <to_stdout@plt>
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1261 <main+0x131>
mov    $0xa,%edi
call   1030 <to_stdout@plt>
mov    -0x60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    1229 <main+0xf9>
xor    %eax,%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x40,%rsp
movdqa 0xebb(%rip),%xmm0
movdqa %xmm0,0x20(%rsp)
movl   $0x74737271,0x30(%rsp)
74
pcmpeqd %xmm0,%xmm0
movdqu %xmm0,0xe(%rsp)
movdqa %xmm0,(%rsp)
movb   $0x81,0x1d(%rsp)
mov    $0x1,%r12d
mov    %rsp,%r14
lea    0x20(%rsp),%r15
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r14,%rdi
mov    %r15,%rsi
mov    %r12d,%edx
call   1050 <my_memcpy@plt>
mov    %rax,%r13
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsbl 0x0(%r13,%rbx,1),%edi
call   1030 <to_stdout@plt>
add    $0x1,%rbx
cmp    %rbx,%r12
jne    11a0 <main+0x70>
mov    $0xa,%edi
call   1030 <to_stdout@plt>
add    $0x1,%r12
cmp    $0x10,%r12
jne    1180 <main+0x50>
mov    $0x1,%r15d
mov    %rsp,%r14
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    0x63(%r15),%eax
movsbl %al,%esi
mov    %r14,%rdi
mov    %r15d,%edx
call   1040 <my_memset@plt>
mov    %rax,%r12
xor    %ebx,%ebx
nopw   0x0(%rax,%rax,1)
movsbl (%r12,%rbx,1),%edi
call   1030 <to_stdout@plt>
add    $0x1,%rbx
cmp    %rbx,%r15
jne    1200 <main+0xd0>
mov    $0xa,%edi
call   1030 <to_stdout@plt>
add    $0x1,%r15
cmp    $0x10,%r15
jne    11e0 <main+0xb0>
xor    %eax,%eax
add    $0x40,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca [20 x i8]
%3 = alloca [30 x i8]
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i32 0, i32* %1
store i32 0, i32* %7
br label %10
10: ; preds = %22, %0
%11 = load i32, i32* %7
%12 = icmp slt i32 %11, 20
br i1 %12, label %13, label %25
13: ; preds = %10
%14 = load i32, i32* %7
%15 = trunc i32 %14 to i8
%16 = sext i8 %15 to i32
%17 = add nsw i32 %16, 97
%18 = trunc i32 %17 to i8
%19 = load i32, i32* %7
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds [20 x i8], [20 x i8]* %2, i64 0, i64 %20
store i8 %18, i8* %21
br label %22
22: ; preds = %13
%23 = load i32, i32* %7
%24 = add nsw i32 %23, 1
store i32 %24, i32* %7
br label %10
25: ; preds = %10
store i32 0, i32* %7
br label %26
26: ; preds = %33, %25
%27 = load i32, i32* %7
%28 = icmp slt i32 %27, 30
br i1 %28, label %29, label %36
29: ; preds = %26
%30 = load i32, i32* %7
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [30 x i8], [30 x i8]* %3, i64 0, i64 %31
store i8 -1, i8* %32
br label %33
33: ; preds = %29
%34 = load i32, i32* %7
%35 = add nsw i32 %34, 1
store i32 %35, i32* %7
br label %26
36: ; preds = %26
%37 = getelementptr inbounds [30 x i8], [30 x i8]* %3, i64 0, i64 29
store i8 -127, i8* %37
store i32 1, i32* %8
br label %38
38: ; preds = %65, %36
%39 = load i32, i32* %8
%40 = icmp sle i32 %39, 15
br i1 %40, label %41, label %68
41: ; preds = %38
%42 = load i32, i32* %8
store i32 %42, i32* %9
%43 = getelementptr inbounds [20 x i8], [20 x i8]* %2, i64 0, i64 0
store i8* %43, i8** %5
%44 = getelementptr inbounds [30 x i8], [30 x i8]* %3, i64 0, i64 0
store i8* %44, i8** %6
%45 = load i8*, i8** %6
%46 = load i8*, i8** %5
%47 = load i32, i32* %9
%48 = call i8* @my_memcpy(i8* %45, i8* %46, i32 %47)
store i8* %48, i8** %4
store i32 0, i32* %7
br label %49
49: ; preds = %60, %41
%50 = load i32, i32* %7
%51 = load i32, i32* %9
%52 = icmp slt i32 %50, %51
br i1 %52, label %53, label %63
53: ; preds = %49
%54 = load i8*, i8** %4
%55 = load i32, i32* %7
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i8, i8* %54, i64 %56
%58 = load i8, i8* %57
%59 = call i32 @to_stdout(i8 signext %58)
br label %60
60: ; preds = %53
%61 = load i32, i32* %7
%62 = add nsw i32 %61, 1
store i32 %62, i32* %7
br label %49
63: ; preds = %49
%64 = call i32 @to_stdout(i8 signext 10)
br label %65
65: ; preds = %63
%66 = load i32, i32* %8
%67 = add nsw i32 %66, 1
store i32 %67, i32* %8
br label %38
68: ; preds = %38
store i32 1, i32* %8
br label %69
69: ; preds = %97, %68
%70 = load i32, i32* %8
%71 = icmp sle i32 %70, 15
br i1 %71, label %72, label %100
72: ; preds = %69
%73 = load i32, i32* %8
store i32 %73, i32* %9
%74 = getelementptr inbounds [30 x i8], [30 x i8]* %3, i64 0, i64 0
store i8* %74, i8** %6
%75 = load i8*, i8** %6
%76 = load i32, i32* %8
%77 = add nsw i32 99, %76
%78 = trunc i32 %77 to i8
%79 = load i32, i32* %9
%80 = call i8* @my_memset(i8* %75, i8 signext %78, i32 %79)
store i8* %80, i8** %4
store i32 0, i32* %7
br label %81
81: ; preds = %92, %72
%82 = load i32, i32* %7
%83 = load i32, i32* %9
%84 = icmp slt i32 %82, %83
br i1 %84, label %85, label %95
85: ; preds = %81
%86 = load i8*, i8** %4
%87 = load i32, i32* %7
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i8, i8* %86, i64 %88
%90 = load i8, i8* %89
%91 = call i32 @to_stdout(i8 signext %90)
br label %92
92: ; preds = %85
%93 = load i32, i32* %7
%94 = add nsw i32 %93, 1
store i32 %94, i32* %7
br label %81
95: ; preds = %81
%96 = call i32 @to_stdout(i8 signext 10)
br label %97
97: ; preds = %95
%98 = load i32, i32* %8
%99 = add nsw i32 %98, 1
store i32 %99, i32* %8
br label %69
100: ; preds = %69
ret i32 0
}

LLVM IR (-O2):
define i32 @main() {
%1 = alloca [20 x i8]
%2 = alloca [30 x i8]
%3 = getelementptr inbounds [30 x i8], [30 x i8]* %2, i64 0, i64 0
%4 = getelementptr inbounds [20 x i8], [20 x i8]* %1, i64 0, i64 0
%5 = getelementptr inbounds [30 x i8], [30 x i8]* %2, i64 0, i64 0
%6 = bitcast [20 x i8]* %1 to <16 x i8>*
store <16 x i8> <i8 97, i8 98, i8 99, i8 100, i8 101, i8 102, i8 103, i8 104, i8 105, i8 106, i8 107, i8 108, i8 109, i8 110, i8 111, i8 112>, <16 x i8>* %6
%7 = getelementptr inbounds [20 x i8], [20 x i8]* %1, i64 0, i64 16
store i8 113, i8* %7
%8 = getelementptr inbounds [20 x i8], [20 x i8]* %1, i64 0, i64 17
store i8 114, i8* %8
%9 = getelementptr inbounds [20 x i8], [20 x i8]* %1, i64 0, i64 18
store i8 115, i8* %9
%10 = getelementptr inbounds [20 x i8], [20 x i8]* %1, i64 0, i64 19
store i8 116, i8* %10
%11 = getelementptr inbounds [30 x i8], [30 x i8]* %2, i64 0, i64 29
store i8 -127, i8* %11
br label %12
12: ; preds = %0, %23
%13 = phi i64 [ 1, %0 ], [ %25, %23 ]
%14 = trunc i64 %13 to i32
%15 = call i8* @my_memcpy(i8* %5, i8* %4, i32 %14)
br label %16
16: ; preds = %12, %16
%17 = phi i64 [ 0, %12 ], [ %21, %16 ]
%18 = getelementptr inbounds i8, i8* %15, i64 %17
%19 = load i8, i8* %18
%20 = call i32 @to_stdout(i8 signext %19)
%21 = add nuw nsw i64 %17, 1
%22 = icmp eq i64 %21, %13
br i1 %22, label %23, label %16
23: ; preds = %16
%24 = call i32 @to_stdout(i8 signext 10)
%25 = add nuw nsw i64 %13, 1
%26 = icmp eq i64 %25, 16
br i1 %26, label %27, label %12
27: ; preds = %23, %40
%28 = phi i64 [ %42, %40 ], [ 1, %23 ]
%29 = trunc i64 %28 to i32
%30 = trunc i64 %28 to i8
%31 = add nuw nsw i8 %30, 99
%32 = call i8* @my_memset(i8* %5, i8 signext %31, i32 %29)
br label %33
33: ; preds = %27, %33
%34 = phi i64 [ 0, %27 ], [ %38, %33 ]
%35 = getelementptr inbounds i8, i8* %32, i64 %34
%36 = load i8, i8* %35
%37 = call i32 @to_stdout(i8 signext %36)
%38 = add nuw nsw i64 %34, 1
%39 = icmp eq i64 %38, %28
br i1 %39, label %40, label %33
40: ; preds = %33
%41 = call i32 @to_stdout(i8 signext 10)
%42 = add nuw nsw i64 %28, 1
%43 = icmp eq i64 %42, 16
br i1 %43, label %44, label %27
44: ; preds = %40
ret i32 0
}