#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*/ assert(int);
void fill(long *arr, long n) {
  assert(n >= 0);
  for (long i = 0; i < n; i++) {
    arr[i] = i;
  }
}


x86 assembly (clang, -O0):
<fill>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
setge  %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
movq   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1169 <fill+0x59>
mov    -0x18(%rbp),%rdx
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    113a <fill+0x2a>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fill>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
mov    %rsi,%rdi
shr    $0x3f,%rdi
xor    $0x1,%edi
call   1030 <assert@plt>
test   %r14,%r14
jle    129d <fill+0x18d>
cmp    $0x4,%r14
jae    113f <fill+0x2f>
xor    %eax,%eax
jmp    1290 <fill+0x180>
mov    %r14,%rax
and    $0xfffffffffffffffc,%rax
lea    -0x4(%rax),%rsi
mov    %rsi,%rdx
shr    $0x2,%rdx
add    $0x1,%rdx
mov    %edx,%ecx
and    $0x3,%ecx
cmp    $0xc,%rsi
jae    116f <fill+0x5f>
movdqa 0xe98(%rip),%xmm0
xor    %esi,%esi
jmp    1238 <fill+0x128>
and    $0xfffffffffffffffc,%rdx
movdqa 0xe85(%rip),%xmm0
xor    %esi,%esi
movdqa 0xe8a(%rip),%xmm8
movdqa 0xe91(%rip),%xmm9
movdqa 0xe98(%rip),%xmm10
movdqa 0xea0(%rip),%xmm4
movdqa 0xea8(%rip),%xmm5
movdqa 0xeb0(%rip),%xmm6
movdqa 0xeb8(%rip),%xmm7
movdqa 0xec0(%rip),%xmm1
movdqa %xmm0,%xmm2
paddq  %xmm8,%xmm2
movdqu %xmm0,(%rbx,%rsi,8)
movdqu %xmm2,0x10(%rbx,%rsi,8)
movdqa %xmm0,%xmm2
paddq  %xmm9,%xmm2
movdqa %xmm0,%xmm3
paddq  %xmm10,%xmm3
movdqu %xmm2,0x20(%rbx,%rsi,8)
movdqu %xmm3,0x30(%rbx,%rsi,8)
movdqa %xmm0,%xmm2
paddq  %xmm4,%xmm2
movdqa %xmm0,%xmm3
paddq  %xmm5,%xmm3
movdqu %xmm2,0x40(%rbx,%rsi,8)
movdqu %xmm3,0x50(%rbx,%rsi,8)
movdqa %xmm0,%xmm2
paddq  %xmm6,%xmm2
movdqa %xmm0,%xmm3
paddq  %xmm7,%xmm3
movdqu %xmm2,0x60(%rbx,%rsi,8)
movdqu %xmm3,0x70(%rbx,%rsi,8)
add    $0x10,%rsi
paddq  %xmm1,%xmm0
add    $0xfffffffffffffffc,%rdx
jne    11c0 <fill+0xb0>
test   %rcx,%rcx
je     1280 <fill+0x170>
lea    (%rbx,%rsi,8),%rdx
add    $0x10,%rdx
shl    $0x5,%rcx
xor    %esi,%esi
movdqa 0xdbd(%rip),%xmm1
movdqa 0xdc5(%rip),%xmm2
nopl   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm3
paddq  %xmm1,%xmm3
movdqu %xmm0,-0x10(%rdx,%rsi,1)
movdqu %xmm3,(%rdx,%rsi,1)
paddq  %xmm2,%xmm0
add    $0x20,%rsi
cmp    %rsi,%rcx
jne    1260 <fill+0x150>
cmp    %r14,%rax
je     129d <fill+0x18d>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rax,(%rbx,%rax,8)
add    $0x1,%rax
cmp    %rax,%r14
jne    1290 <fill+0x180>
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

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