void setUnsortedArray(long *array, long size) {
  for (long i = size; i > 0; i--) {
    array[size - i] = i;
  }
}


x86 assembly (clang, -O0):
<setUnsortedArray>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
cmpq   $0x0,-0x18(%rbp)
jle    1144 <setUnsortedArray+0x44>
mov    -0x18(%rbp),%rdx
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    -0x18(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    1114 <setUnsortedArray+0x14>
pop    %rbp
ret

x86 assembly (clang, -O2):
<setUnsortedArray>:
test   %rsi,%rsi
jle    1294 <setUnsortedArray+0x194>
mov    %rsi,%rax
cmp    $0x4,%rsi
jb     126a <setUnsortedArray+0x16a>
mov    %rsi,%r8
and    $0xfffffffffffffffc,%r8
movq   %rsi,%xmm0
pshufd $0x44,%xmm0,%xmm0
paddq  0xed1(%rip),%xmm0
lea    -0x4(%r8),%rax
mov    %rax,%rdx
shr    $0x2,%rdx
add    $0x1,%rdx
mov    %edx,%ecx
and    $0x3,%ecx
cmp    $0xc,%rax
jae    1150 <setUnsortedArray+0x50>
xor    %eax,%eax
jmp    1218 <setUnsortedArray+0x118>
and    $0xfffffffffffffffc,%rdx
xor    %eax,%eax
movdqa 0xeb1(%rip),%xmm8
movdqa 0xeb8(%rip),%xmm9
movdqa 0xebf(%rip),%xmm10
movdqa 0xec7(%rip),%xmm4
movdqa 0xecf(%rip),%xmm5
movdqa 0xed7(%rip),%xmm6
movdqa 0xedf(%rip),%xmm7
movdqa 0xee7(%rip),%xmm1
nopl   0x0(%rax)
movdqa %xmm0,%xmm2
paddq  %xmm8,%xmm2
movdqu %xmm0,(%rdi,%rax,8)
movdqu %xmm2,0x10(%rdi,%rax,8)
movdqa %xmm0,%xmm2
paddq  %xmm9,%xmm2
movdqa %xmm0,%xmm3
paddq  %xmm10,%xmm3
movdqu %xmm2,0x20(%rdi,%rax,8)
movdqu %xmm3,0x30(%rdi,%rax,8)
movdqa %xmm0,%xmm2
paddq  %xmm4,%xmm2
movdqa %xmm0,%xmm3
paddq  %xmm5,%xmm3
movdqu %xmm2,0x40(%rdi,%rax,8)
movdqu %xmm3,0x50(%rdi,%rax,8)
movdqa %xmm0,%xmm2
paddq  %xmm6,%xmm2
movdqa %xmm0,%xmm3
paddq  %xmm7,%xmm3
movdqu %xmm2,0x60(%rdi,%rax,8)
movdqu %xmm3,0x70(%rdi,%rax,8)
add    $0x10,%rax
paddq  %xmm1,%xmm0
add    $0xfffffffffffffffc,%rdx
jne    11a0 <setUnsortedArray+0xa0>
test   %rcx,%rcx
je     1260 <setUnsortedArray+0x160>
lea    (%rdi,%rax,8),%rax
add    $0x10,%rax
shl    $0x5,%rcx
xor    %edx,%edx
movdqa 0xddd(%rip),%xmm1
movdqa 0xde5(%rip),%xmm2
nopl   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm3
paddq  %xmm1,%xmm3
movdqu %xmm0,-0x10(%rax,%rdx,1)
movdqu %xmm3,(%rax,%rdx,1)
paddq  %xmm2,%xmm0
add    $0x20,%rdx
cmp    %rdx,%rcx
jne    1240 <setUnsortedArray+0x140>
cmp    %rsi,%r8
je     1294 <setUnsortedArray+0x194>
mov    %esi,%eax
and    $0x3,%eax
sub    %rax,%rsi
lea    (%rdi,%rsi,8),%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %rax,(%rcx)
lea    -0x1(%rax),%rdx
add    $0x8,%rcx
cmp    $0x1,%rax
mov    %rdx,%rax
ja     1280 <setUnsortedArray+0x180>
ret

LLVM IR (-O0):
define void @setUnsortedArray(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
store i64 %6, i64* %5
br label %7
7: ; preds = %17, %2
%8 = load i64, i64* %5
%9 = icmp sgt i64 %8, 0
br i1 %9, label %10, label %20
10: ; preds = %7
%11 = load i64, i64* %5
%12 = load i64*, i64** %3
%13 = load i64, i64* %4
%14 = load i64, i64* %5
%15 = sub nsw i64 %13, %14
%16 = getelementptr inbounds i64, i64* %12, i64 %15
store i64 %11, i64* %16
br label %17
17: ; preds = %10
%18 = load i64, i64* %5
%19 = add nsw i64 %18, -1
store i64 %19, i64* %5
br label %7
20: ; preds = %7
ret void
}

LLVM IR (-O2):
define void @setUnsortedArray(i64* nocapture writeonly %0, i64 %1) {
%3 = icmp sgt i64 %1, 0
br i1 %3, label %4, label %74
4: ; preds = %2
%5 = icmp ult i64 %1, 4
br i1 %5, label %72, label %6
6: ; preds = %4
%7 = and i64 %1, -4
%8 = and i64 %1, 3
%9 = insertelement <2 x i64> poison, i64 %1, i64 0
%10 = shufflevector <2 x i64> %9, <2 x i64> poison, <2 x i32> zeroinitializer
%11 = add <2 x i64> %10, <i64 0, i64 -1>
%12 = add i64 %7, -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 = %6
%18 = and i64 %14, 9223372036854775804
br label %19
19: ; preds = %19, %17
%20 = phi i64 [ 0, %17 ], [ %49, %19 ]
%21 = phi <2 x i64> [ %11, %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, %6
%54 = phi i64 [ 0, %6 ], [ %49, %19 ]
%55 = phi <2 x i64> [ %11, %6 ], [ %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 %7, %1
br i1 %71, label %74, label %72
72: ; preds = %4, %70
%73 = phi i64 [ %1, %4 ], [ %8, %70 ]
br label %75
74: ; preds = %75, %70, %2
ret void
75: ; preds = %72, %75
%76 = phi i64 [ %79, %75 ], [ %73, %72 ]
%77 = sub nuw nsw i64 %1, %76
%78 = getelementptr inbounds i64, i64* %0, i64 %77
store i64 %76, i64* %78
%79 = add nsw i64 %76, -1
%80 = icmp ugt i64 %76, 1
br i1 %80, label %75, label %74
}