void range(int *data, int start, int end) {
  for (int i = start; i < end; ++i) {
    data[i - start] = i;
  }
}


x86 assembly (clang, -O0):
<range>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1141 <range+0x41>
mov    -0x14(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    -0xc(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1114 <range+0x14>
pop    %rbp
ret

x86 assembly (clang, -O2):
<range>:
cmp    %edx,%esi
jge    128c <range+0x18c>
movslq %esi,%r8
movslq %edx,%rax
mov    %rax,%r9
sub    %r8,%r9
mov    %r8,%rcx
cmp    $0x8,%r9
jb     1278 <range+0x178>
mov    %r9,%rcx
and    $0xfffffffffffffff8,%rcx
movd   %esi,%xmm0
pshufd $0x0,%xmm0,%xmm0
paddd  0xec7(%rip),%xmm0
lea    -0x8(%rcx),%rdx
mov    %rdx,%rsi
shr    $0x3,%rsi
add    $0x1,%rsi
mov    %esi,%r10d
and    $0x3,%r10d
cmp    $0x18,%rdx
jae    115c <range+0x5c>
xor    %edx,%edx
jmp    1228 <range+0x128>
and    $0xfffffffffffffffc,%rsi
xor    %edx,%edx
movdqa 0xea5(%rip),%xmm8
movdqa 0xeac(%rip),%xmm9
movdqa 0xeb3(%rip),%xmm10
movdqa 0xebb(%rip),%xmm4
movdqa 0xec3(%rip),%xmm5
movdqa 0xecb(%rip),%xmm6
movdqa 0xed3(%rip),%xmm7
movdqa 0xedb(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
movdqa %xmm0,%xmm2
paddd  %xmm8,%xmm2
movdqu %xmm0,(%rdi,%rdx,4)
movdqu %xmm2,0x10(%rdi,%rdx,4)
movdqa %xmm0,%xmm2
paddd  %xmm9,%xmm2
movdqa %xmm0,%xmm3
paddd  %xmm10,%xmm3
movdqu %xmm2,0x20(%rdi,%rdx,4)
movdqu %xmm3,0x30(%rdi,%rdx,4)
movdqa %xmm0,%xmm2
paddd  %xmm4,%xmm2
movdqa %xmm0,%xmm3
paddd  %xmm5,%xmm3
movdqu %xmm2,0x40(%rdi,%rdx,4)
movdqu %xmm3,0x50(%rdi,%rdx,4)
movdqa %xmm0,%xmm2
paddd  %xmm6,%xmm2
movdqa %xmm0,%xmm3
paddd  %xmm7,%xmm3
movdqu %xmm2,0x60(%rdi,%rdx,4)
movdqu %xmm3,0x70(%rdi,%rdx,4)
add    $0x20,%rdx
paddd  %xmm1,%xmm0
add    $0xfffffffffffffffc,%rsi
jne    11b0 <range+0xb0>
test   %r10,%r10
je     1270 <range+0x170>
lea    (%rdi,%rdx,4),%rdx
add    $0x10,%rdx
shl    $0x5,%r10
xor    %esi,%esi
movdqa 0xdcd(%rip),%xmm1
movdqa 0xdd5(%rip),%xmm2
nopl   0x0(%rax,%rax,1)
movdqa %xmm0,%xmm3
paddd  %xmm1,%xmm3
movdqu %xmm0,-0x10(%rdx,%rsi,1)
movdqu %xmm3,(%rdx,%rsi,1)
paddd  %xmm2,%xmm0
add    $0x20,%rsi
cmp    %rsi,%r10
jne    1250 <range+0x150>
cmp    %rcx,%r9
je     128c <range+0x18c>
add    %r8,%rcx
shl    $0x2,%r8
sub    %r8,%rdi
nop
mov    %ecx,(%rdi,%rcx,4)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1280 <range+0x180>
ret

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

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