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


x86 assembly (clang, -O0):
<createStr>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0xc(%rbp),%edi
mov    $0x1,%esi
call   1030 <calloc@plt>
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1164 <createStr+0x54>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1137 <createStr+0x27>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<createStr>:
push   %rbx
mov    %esi,%ebx
mov    %esi,%edi
mov    $0x1,%esi
call   1030 <calloc@plt>
test   %ebx,%ebx
jle    13e0 <createStr+0x2d0>
mov    %ebx,%ecx
cmp    $0x10,%ebx
jae    1135 <createStr+0x25>
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    119f <createStr+0x8f>
movdqa 0xea3(%rip),%xmm12
movdqa 0xeaa(%rip),%xmm15
movdqa 0xeb1(%rip),%xmm9
movdqa 0xeb9(%rip),%xmm3
movdqa 0xec0(%rip),%xmm11
movdqa 0xec8(%rip),%xmm5
movdqa 0xed0(%rip),%xmm1
movdqa 0xed8(%rip),%xmm0
xor    %edi,%edi
jmp    12eb <createStr+0x1db>
and    $0xfffffffffffffffc,%rsi
movdqa 0xe54(%rip),%xmm12
movdqa 0xe5b(%rip),%xmm15
movdqa 0xe62(%rip),%xmm9
movdqa 0xe6a(%rip),%xmm3
movdqa 0xe71(%rip),%xmm11
movdqa 0xe79(%rip),%xmm5
movdqa 0xe81(%rip),%xmm1
movdqa 0xe89(%rip),%xmm0
xor    %edi,%edi
movdqa 0xe8e(%rip),%xmm8
movdqa 0xea6(%rip),%xmm2
movdqa 0xead(%rip),%xmm10
movdqa 0xeb4(%rip),%xmm13
nopl   0x0(%rax)
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 void @createStr(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
store i8* %0, i8** %3
store i32 %1, i32* %4
%6 = load i32, i32* %4
%7 = call i64 @calloc(i32 %6, i32 1)
%8 = inttoptr i64 %7 to i8*
store i8* %8, i8** %3
store i32 0, i32* %5
br label %9
9: ; preds = %21, %2
%10 = load i32, i32* %5
%11 = load i32, i32* %4
%12 = icmp slt i32 %10, %11
br i1 %12, label %13, label %24
13: ; preds = %9
%14 = load i32, i32* %5
%15 = add nsw i32 %14, 1
%16 = trunc i32 %15 to i8
%17 = load i8*, i8** %3
%18 = load i32, i32* %5
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i8, i8* %17, i64 %19
store i8 %16, i8* %20
br label %21
21: ; preds = %13
%22 = load i32, i32* %5
%23 = add nsw i32 %22, 1
store i32 %23, i32* %5
br label %9
24: ; preds = %9
ret void
}

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