#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 */
scalar_t__ calloc(int, int);
unsigned char *createStr(int len) {
  unsigned char *str = (unsigned char *)calloc(len, sizeof(unsigned char));
  for (int i = 0; i < len; i++) {
    str[i] = i + 1;
  }
  return str;
}


x86 assembly (clang, -O0):
<createStr>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%edi
mov    $0x1,%esi
call   1030 <calloc@plt>
mov    %rax,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1160 <createStr+0x50>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1133 <createStr+0x23>
mov    -0x10(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<createStr>:
push   %rbx
mov    %edi,%ebx
mov    $0x1,%esi
call   1030 <calloc@plt>
test   %ebx,%ebx
jle    13e0 <createStr+0x2d0>
mov    %ebx,%ecx
cmp    $0x10,%ebx
jae    1133 <createStr+0x23>
xor    %edx,%edx
jmp    13d0 <createStr+0x2c0>
mov    %ecx,%edx
and    $0xfffffff0,%edx
lea    -0x10(%rdx),%rdi
mov    %rdi,%rsi
shr    $0x4,%rsi
add    $0x1,%rsi
mov    %esi,%ebx
and    $0x3,%ebx
cmp    $0x30,%rdi
jae    119d <createStr+0x8d>
movdqa 0xea5(%rip),%xmm12
movdqa 0xeac(%rip),%xmm15
movdqa 0xeb3(%rip),%xmm9
movdqa 0xebb(%rip),%xmm3
movdqa 0xec2(%rip),%xmm11
movdqa 0xeca(%rip),%xmm5
movdqa 0xed2(%rip),%xmm1
movdqa 0xeda(%rip),%xmm0
xor    %edi,%edi
jmp    12eb <createStr+0x1db>
and    $0xfffffffffffffffc,%rsi
movdqa 0xe56(%rip),%xmm12
movdqa 0xe5d(%rip),%xmm15
movdqa 0xe64(%rip),%xmm9
movdqa 0xe6c(%rip),%xmm3
movdqa 0xe73(%rip),%xmm11
movdqa 0xe7b(%rip),%xmm5
movdqa 0xe83(%rip),%xmm1
movdqa 0xe8b(%rip),%xmm0
xor    %edi,%edi
movdqa 0xe90(%rip),%xmm8
movdqa 0xea8(%rip),%xmm2
movdqa 0xeaf(%rip),%xmm10
movdqa 0xeb6(%rip),%xmm13
nopw   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm7
pand   %xmm8,%xmm7
movdqa %xmm1,%xmm6
pand   %xmm8,%xmm6
packuswb %xmm6,%xmm7
movdqa %xmm5,%xmm6
pand   %xmm8,%xmm6
movdqa %xmm11,%xmm4
pand   %xmm8,%xmm4
packuswb %xmm4,%xmm6
packuswb %xmm6,%xmm7
movdqa %xmm3,%xmm4
pand   %xmm8,%xmm4
movdqa %xmm9,%xmm6
pand   %xmm8,%xmm6
packuswb %xmm6,%xmm4
movdqa %xmm15,%xmm6
pand   %xmm8,%xmm6
movdqa %xmm12,%xmm14
pand   %xmm8,%xmm14
packuswb %xmm14,%xmm6
packuswb %xmm6,%xmm4
packuswb %xmm4,%xmm7
movdqa %xmm7,%xmm4
psubb  0xe5b(%rip),%xmm4
movdqu %xmm4,(%rax,%rdi,1)
movdqa %xmm7,%xmm4
paddb  0xdfa(%rip),%xmm4
movdqu %xmm4,0x10(%rax,%rdi,1)
movdqa %xmm7,%xmm4
paddb  %xmm2,%xmm4
movdqu %xmm4,0x20(%rax,%rdi,1)
paddb  %xmm10,%xmm7
movdqu %xmm7,0x30(%rax,%rdi,1)
add    $0x40,%rdi
paddq  %xmm13,%xmm0
paddq  %xmm13,%xmm1
paddq  %xmm13,%xmm5
paddq  %xmm13,%xmm11
paddq  %xmm13,%xmm3
paddq  %xmm13,%xmm9
paddq  %xmm13,%xmm15
paddq  %xmm13,%xmm12
add    $0xfffffffffffffffc,%rsi
jne    1210 <createStr+0x100>
test   %rbx,%rbx
je     13c7 <createStr+0x2b7>
mov    %rax,%rsi
add    %rdi,%rsi
shl    $0x4,%rbx
xor    %edi,%edi
movdqa 0xd77(%rip),%xmm8
pcmpeqd %xmm13,%xmm13
movdqa 0xdb9(%rip),%xmm10
nopw   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm4
pand   %xmm8,%xmm4
movdqa %xmm1,%xmm6
pand   %xmm8,%xmm6
packuswb %xmm6,%xmm4
movdqa %xmm5,%xmm6
pand   %xmm8,%xmm6
movdqa %xmm11,%xmm7
pand   %xmm8,%xmm7
packuswb %xmm7,%xmm6
packuswb %xmm6,%xmm4
movdqa %xmm3,%xmm6
pand   %xmm8,%xmm6
movdqa %xmm9,%xmm7
pand   %xmm8,%xmm7
packuswb %xmm7,%xmm6
movdqa %xmm15,%xmm7
pand   %xmm8,%xmm7
movdqa %xmm12,%xmm2
pand   %xmm8,%xmm2
packuswb %xmm2,%xmm7
packuswb %xmm7,%xmm6
packuswb %xmm6,%xmm4
psubb  %xmm13,%xmm4
movdqu %xmm4,(%rsi,%rdi,1)
paddq  %xmm10,%xmm0
paddq  %xmm10,%xmm1
paddq  %xmm10,%xmm5
paddq  %xmm10,%xmm11
paddq  %xmm10,%xmm3
paddq  %xmm10,%xmm9
paddq  %xmm10,%xmm15
paddq  %xmm10,%xmm12
add    $0x10,%rdi
cmp    %rdi,%rbx
jne    1320 <createStr+0x210>
cmp    %rcx,%rdx
je     13e0 <createStr+0x2d0>
nopl   0x0(%rax)
lea    0x1(%rdx),%rsi
mov    %sil,(%rax,%rdx,1)
mov    %rsi,%rdx
cmp    %rsi,%rcx
jne    13d0 <createStr+0x2c0>
pop    %rbx
ret

LLVM IR (-O0):
define i8* @createStr(i32 %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
store i32 %0, i32* %2
%5 = load i32, i32* %2
%6 = call i64 @calloc(i32 %5, i32 1)
%7 = inttoptr i64 %6 to i8*
store i8* %7, i8** %3
store i32 0, i32* %4
br label %8
8: ; preds = %20, %1
%9 = load i32, i32* %4
%10 = load i32, i32* %2
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %23
12: ; preds = %8
%13 = load i32, i32* %4
%14 = add nsw i32 %13, 1
%15 = trunc i32 %14 to i8
%16 = load i8*, i8** %3
%17 = load i32, i32* %4
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i8, i8* %16, i64 %18
store i8 %15, i8* %19
br label %20
20: ; preds = %12
%21 = load i32, i32* %4
%22 = add nsw i32 %21, 1
store i32 %22, i32* %4
br label %8
23: ; preds = %8
%24 = load i8*, i8** %3
ret i8* %24
}

LLVM IR (-O2):
define i8* @createStr(i32 %0) {
%2 = tail call i64 @calloc(i32 %0, i32 1)
%3 = inttoptr i64 %2 to i8*
%4 = icmp sgt i32 %0, 0
br i1 %4, label %5, label %64
5: ; preds = %1
%6 = zext i32 %0 to i64
%7 = icmp ult i32 %0, 16
br i1 %7, label %62, label %8
8: ; preds = %5
%9 = and i64 %6, 4294967280
%10 = add nsw i64 %9, -16
%11 = lshr exact i64 %10, 4
%12 = add nuw nsw i64 %11, 1
%13 = and i64 %12, 3
%14 = icmp ult i64 %10, 48
br i1 %14, label %44, label %15
15: ; preds = %8
%16 = and i64 %12, 2305843009213693948
br label %17
17: ; preds = %17, %15
%18 = phi i64 [ 0, %15 ], [ %40, %17 ]
%19 = phi <16 x i64> [ <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>, %15 ], [ %41, %17 ]
%20 = phi i64 [ 0, %15 ], [ %42, %17 ]
%21 = trunc <16 x i64> %19 to <16 x i8>
%22 = add <16 x i8> %21, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
%23 = getelementptr inbounds i8, i8* %3, i64 %18
%24 = bitcast i8* %23 to <16 x i8>*
store <16 x i8> %22, <16 x i8>* %24
%25 = or i64 %18, 16
%26 = trunc <16 x i64> %19 to <16 x i8>
%27 = add <16 x i8> %26, <i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17>
%28 = getelementptr inbounds i8, i8* %3, i64 %25
%29 = bitcast i8* %28 to <16 x i8>*
store <16 x i8> %27, <16 x i8>* %29
%30 = or i64 %18, 32
%31 = trunc <16 x i64> %19 to <16 x i8>
%32 = add <16 x i8> %31, <i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33, i8 33>
%33 = getelementptr inbounds i8, i8* %3, i64 %30
%34 = bitcast i8* %33 to <16 x i8>*
store <16 x i8> %32, <16 x i8>* %34
%35 = or i64 %18, 48
%36 = trunc <16 x i64> %19 to <16 x i8>
%37 = add <16 x i8> %36, <i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49, i8 49>
%38 = getelementptr inbounds i8, i8* %3, i64 %35
%39 = bitcast i8* %38 to <16 x i8>*
store <16 x i8> %37, <16 x i8>* %39
%40 = add nuw i64 %18, 64
%41 = add <16 x i64> %19, <i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64, i64 64>
%42 = add i64 %20, 4
%43 = icmp eq i64 %42, %16
br i1 %43, label %44, label %17
44: ; preds = %17, %8
%45 = phi i64 [ 0, %8 ], [ %40, %17 ]
%46 = phi <16 x i64> [ <i64 0, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9, i64 10, i64 11, i64 12, i64 13, i64 14, i64 15>, %8 ], [ %41, %17 ]
%47 = icmp eq i64 %13, 0
br i1 %47, label %60, label %48
48: ; preds = %44, %48
%49 = phi i64 [ %56, %48 ], [ %45, %44 ]
%50 = phi <16 x i64> [ %57, %48 ], [ %46, %44 ]
%51 = phi i64 [ %58, %48 ], [ 0, %44 ]
%52 = trunc <16 x i64> %50 to <16 x i8>
%53 = add <16 x i8> %52, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
%54 = getelementptr inbounds i8, i8* %3, i64 %49
%55 = bitcast i8* %54 to <16 x i8>*
store <16 x i8> %53, <16 x i8>* %55
%56 = add nuw i64 %49, 16
%57 = add <16 x i64> %50, <i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16, i64 16>
%58 = add i64 %51, 1
%59 = icmp eq i64 %58, %13
br i1 %59, label %60, label %48
60: ; preds = %48, %44
%61 = icmp eq i64 %9, %6
br i1 %61, label %64, label %62
62: ; preds = %5, %60
%63 = phi i64 [ 0, %5 ], [ %9, %60 ]
br label %65
64: ; preds = %65, %60, %1
ret i8* %3
65: ; preds = %62, %65
%66 = phi i64 [ %67, %65 ], [ %63, %62 ]
%67 = add nuw nsw i64 %66, 1
%68 = trunc i64 %67 to i8
%69 = getelementptr inbounds i8, i8* %3, i64 %66
store i8 %68, i8* %69
%70 = icmp eq i64 %67, %6
br i1 %70, label %64, label %65
}