void range(int *list, int n) {
  while (n--)
    *(list + n) = n + 1;
}


x86 assembly (clang, -O0):
<range>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0xc(%rbp)
cmp    $0x0,%eax
je     1135 <range+0x35>
mov    -0xc(%rbp),%edx
add    $0x1,%edx
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    110b <range+0xb>
pop    %rbp
ret

x86 assembly (clang, -O2):
<range>:
test   %esi,%esi
je     122f <range+0x12f>
movslq %esi,%rax
lea    -0x1(%rsi),%r9d
cmp    $0x7,%r9d
jb     1220 <range+0x120>
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffff8,%r8
movd   %esi,%xmm0
pshufd $0x0,%xmm0,%xmm0
paddd  0xecb(%rip),%xmm0
lea    -0x8(%r8),%rcx
mov    %rcx,%r10
shr    $0x3,%r10
add    $0x1,%r10
test   %rcx,%rcx
je     1230 <range+0x130>
mov    %r10,%rsi
and    $0xfffffffffffffffe,%rsi
lea    (%rdi,%rax,4),%rcx
add    $0xfffffffffffffff0,%rcx
mov    $0xfffffffffffffffc,%rdx
movdqa 0xea5(%rip),%xmm1
movdqa 0xead(%rip),%xmm2
movdqa 0xeb5(%rip),%xmm3
movdqa 0xebd(%rip),%xmm4
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqa %xmm0,%xmm5
paddd  %xmm1,%xmm5
pshufd $0x1b,%xmm0,%xmm6
movdqu %xmm6,0x10(%rcx,%rdx,4)
pshufd $0x1b,%xmm5,%xmm5
movdqu %xmm5,(%rcx,%rdx,4)
movdqa %xmm0,%xmm5
paddd  %xmm2,%xmm5
movdqa %xmm0,%xmm6
paddd  %xmm3,%xmm6
pshufd $0x1b,%xmm5,%xmm5
movdqu %xmm5,-0x10(%rcx,%rdx,4)
pshufd $0x1b,%xmm6,%xmm5
movdqu %xmm5,-0x20(%rcx,%rdx,4)
paddd  %xmm4,%xmm0
add    $0xfffffffffffffff0,%rdx
add    $0xfffffffffffffffe,%rsi
jne    1190 <range+0x90>
add    $0x3,%rdx
test   $0x1,%r10b
je     120c <range+0x10c>
pshufd $0x1b,%xmm0,%xmm1
paddd  0xe18(%rip),%xmm0
add    %rax,%rdx
movdqu %xmm1,-0xc(%rdi,%rdx,4)
pshufd $0x1b,%xmm0,%xmm0
movdqu %xmm0,-0x1c(%rdi,%rdx,4)
cmp    %r8,%r9
je     122f <range+0x12f>
sub    %r8,%rax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %eax,-0x4(%rdi,%rax,4)
lea    -0x1(%rax),%rcx
mov    %rcx,%rax
test   %ecx,%ecx
jne    1220 <range+0x120>
ret
mov    $0xffffffffffffffff,%rdx
test   $0x1,%r10b
jne    11eb <range+0xeb>
jmp    120c <range+0x10c>

LLVM IR (-O0):
define void @range(i32* %0, i32 %1) {
%3 = alloca i32*
%4 = alloca i32
store i32* %0, i32** %3
store i32 %1, i32* %4
br label %5
5: ; preds = %9, %2
%6 = load i32, i32* %4
%7 = add nsw i32 %6, -1
store i32 %7, i32* %4
%8 = icmp ne i32 %6, 0
br i1 %8, label %9, label %16
9: ; preds = %5
%10 = load i32, i32* %4
%11 = add nsw i32 %10, 1
%12 = load i32*, i32** %3
%13 = load i32, i32* %4
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds i32, i32* %12, i64 %14
store i32 %11, i32* %15
br label %5
16: ; preds = %5
ret void
}

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