void init_data(float *data, const int dimx, const int dimy, const int dimz) {
  for (int iz = 0; iz < dimz; iz++)
    for (int iy = 0; iy < dimy; iy++)
      for (int ix = 0; ix < dimx; ix++) {
        *data = (float)iz;
        ++data;
      }
}


x86 assembly (clang, -O0):
<init_data>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1197 <init_data+0x97>
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1184 <init_data+0x84>
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1171 <init_data+0x71>
cvtsi2ssl -0x18(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    113e <init_data+0x3e>
jmp    1176 <init_data+0x76>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    112b <init_data+0x2b>
jmp    1189 <init_data+0x89>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1118 <init_data+0x18>
pop    %rbp
ret

x86 assembly (clang, -O2):
<init_data>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %ecx,%ecx
jle    1272 <init_data+0x172>
lea    -0x1(%rsi),%r9d
lea    0x1(%r9),%r8
mov    %r8,%r12
and    $0xfffffffffffffff8,%r12
lea    -0x8(%r12),%r10
mov    %r10,%r11
shr    $0x3,%r11
add    $0x1,%r11
mov    %r11d,%r14d
and    $0x7,%r14d
and    $0xfffffffffffffff8,%r11
mov    %r14,%r13
shl    $0x5,%r13
xor    %r15d,%r15d
jmp    115d <init_data+0x5d>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r15d
cmp    %ecx,%r15d
je     1272 <init_data+0x172>
test   %edx,%edx
jle    1150 <init_data+0x50>
xorps  %xmm0,%xmm0
cvtsi2ss %r15d,%xmm0
movaps %xmm0,%xmm1
shufps $0x0,%xmm0,%xmm1
xor    %ebp,%ebp
jmp    1187 <init_data+0x87>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%ebp
cmp    %edx,%ebp
je     1150 <init_data+0x50>
test   %esi,%esi
jle    1180 <init_data+0x80>
xor    %ebx,%ebx
cmp    $0x7,%r9d
jb     1252 <init_data+0x152>
cmp    $0x38,%r10
jae    11a4 <init_data+0xa4>
xor    %eax,%eax
jmp    1221 <init_data+0x121>
mov    %r11,%rbx
xor    %eax,%eax
nopl   0x0(%rax)
movups %xmm1,(%rdi,%rax,4)
movups %xmm1,0x10(%rdi,%rax,4)
movups %xmm1,0x20(%rdi,%rax,4)
movups %xmm1,0x30(%rdi,%rax,4)
movups %xmm1,0x40(%rdi,%rax,4)
movups %xmm1,0x50(%rdi,%rax,4)
movups %xmm1,0x60(%rdi,%rax,4)
movups %xmm1,0x70(%rdi,%rax,4)
movups %xmm1,0x80(%rdi,%rax,4)
movups %xmm1,0x90(%rdi,%rax,4)
movups %xmm1,0xa0(%rdi,%rax,4)
movups %xmm1,0xb0(%rdi,%rax,4)
movups %xmm1,0xc0(%rdi,%rax,4)
movups %xmm1,0xd0(%rdi,%rax,4)
movups %xmm1,0xe0(%rdi,%rax,4)
movups %xmm1,0xf0(%rdi,%rax,4)
add    $0x40,%rax
add    $0xfffffffffffffff8,%rbx
jne    11b0 <init_data+0xb0>
test   %r14,%r14
je     1242 <init_data+0x142>
lea    (%rdi,%rax,4),%rax
add    $0x10,%rax
xor    %ebx,%ebx
movups %xmm1,-0x10(%rax,%rbx,1)
movups %xmm1,(%rax,%rbx,1)
add    $0x20,%rbx
cmp    %rbx,%r13
jne    1230 <init_data+0x130>
lea    (%rdi,%r12,4),%rdi
mov    %r12d,%ebx
cmp    %r12,%r8
je     1180 <init_data+0x80>
mov    %esi,%eax
sub    %ebx,%eax
cs nopw 0x0(%rax,%rax,1)
movss  %xmm0,(%rdi)
add    $0x4,%rdi
add    $0xffffffff,%eax
jne    1260 <init_data+0x160>
jmp    1180 <init_data+0x80>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @init_data(float* %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca float*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store float* %0, float** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
store i32 0, i32* %9
br label %12
12: ; preds = %40, %4
%13 = load i32, i32* %9
%14 = load i32, i32* %8
%15 = icmp slt i32 %13, %14
br i1 %15, label %16, label %43
16: ; preds = %12
store i32 0, i32* %10
br label %17
17: ; preds = %36, %16
%18 = load i32, i32* %10
%19 = load i32, i32* %7
%20 = icmp slt i32 %18, %19
br i1 %20, label %21, label %39
21: ; preds = %17
store i32 0, i32* %11
br label %22
22: ; preds = %32, %21
%23 = load i32, i32* %11
%24 = load i32, i32* %6
%25 = icmp slt i32 %23, %24
br i1 %25, label %26, label %35
26: ; preds = %22
%27 = load i32, i32* %9
%28 = sitofp i32 %27 to float
%29 = load float*, float** %5
store float %28, float* %29
%30 = load float*, float** %5
%31 = getelementptr inbounds float, float* %30, i32 1
store float* %31, float** %5
br label %32
32: ; preds = %26
%33 = load i32, i32* %11
%34 = add nsw i32 %33, 1
store i32 %34, i32* %11
br label %22
35: ; preds = %22
br label %36
36: ; preds = %35
%37 = load i32, i32* %10
%38 = add nsw i32 %37, 1
store i32 %38, i32* %10
br label %17
39: ; preds = %17
br label %40
40: ; preds = %39
%41 = load i32, i32* %9
%42 = add nsw i32 %41, 1
store i32 %42, i32* %9
br label %12
43: ; preds = %12
ret void
}

LLVM IR (-O2):
define void @init_data(float* nocapture writeonly %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp sgt i32 %3, 0
br i1 %5, label %6, label %33
6: ; preds = %4
%7 = icmp sgt i32 %2, 0
%8 = icmp sgt i32 %1, 0
%9 = add i32 %1, -1
%10 = zext i32 %9 to i64
%11 = add nuw nsw i64 %10, 1
%12 = and i64 %11, 8589934584
%13 = add nsw i64 %12, -8
%14 = lshr exact i64 %13, 3
%15 = add nuw nsw i64 %14, 1
%16 = icmp ult i32 %9, 7
%17 = and i64 %11, 8589934584
%18 = trunc i64 %17 to i32
%19 = and i64 %15, 7
%20 = icmp ult i64 %13, 56
%21 = and i64 %15, 4611686018427387896
%22 = icmp eq i64 %19, 0
%23 = icmp eq i64 %11, %17
br label %24
24: ; preds = %6, %101
%25 = phi i32 [ 0, %6 ], [ %103, %101 ]
%26 = phi float* [ %0, %6 ], [ %102, %101 ]
br i1 %7, label %27, label %101
27: ; preds = %24
%28 = sitofp i32 %25 to float
%29 = insertelement <4 x float> poison, float %28, i64 0
%30 = shufflevector <4 x float> %29, <4 x float> poison, <4 x i32> zeroinitializer
%31 = insertelement <4 x float> poison, float %28, i64 0
%32 = shufflevector <4 x float> %31, <4 x float> poison, <4 x i32> zeroinitializer
br label %34
33: ; preds = %101, %4
ret void
34: ; preds = %27, %105
%35 = phi i32 [ 0, %27 ], [ %107, %105 ]
%36 = phi float* [ %26, %27 ], [ %106, %105 ]
br i1 %8, label %37, label %105
37: ; preds = %34
br i1 %16, label %98, label %38
38: ; preds = %37
%39 = getelementptr float, float* %36, i64 %17
br i1 %20, label %85, label %40
40: ; preds = %38, %40
%41 = phi i64 [ %82, %40 ], [ 0, %38 ]
%42 = phi i64 [ %83, %40 ], [ 0, %38 ]
%43 = getelementptr float, float* %36, i64 %41
%44 = bitcast float* %43 to <4 x float>*
store <4 x float> %30, <4 x float>* %44
%45 = getelementptr float, float* %43, i64 4
%46 = bitcast float* %45 to <4 x float>*
store <4 x float> %32, <4 x float>* %46
%47 = or i64 %41, 8
%48 = getelementptr float, float* %36, i64 %47
%49 = bitcast float* %48 to <4 x float>*
store <4 x float> %30, <4 x float>* %49
%50 = getelementptr float, float* %48, i64 4
%51 = bitcast float* %50 to <4 x float>*
store <4 x float> %32, <4 x float>* %51
%52 = or i64 %41, 16
%53 = getelementptr float, float* %36, i64 %52
%54 = bitcast float* %53 to <4 x float>*
store <4 x float> %30, <4 x float>* %54
%55 = getelementptr float, float* %53, i64 4
%56 = bitcast float* %55 to <4 x float>*
store <4 x float> %32, <4 x float>* %56
%57 = or i64 %41, 24
%58 = getelementptr float, float* %36, i64 %57
%59 = bitcast float* %58 to <4 x float>*
store <4 x float> %30, <4 x float>* %59
%60 = getelementptr float, float* %58, i64 4
%61 = bitcast float* %60 to <4 x float>*
store <4 x float> %32, <4 x float>* %61
%62 = or i64 %41, 32
%63 = getelementptr float, float* %36, i64 %62
%64 = bitcast float* %63 to <4 x float>*
store <4 x float> %30, <4 x float>* %64
%65 = getelementptr float, float* %63, i64 4
%66 = bitcast float* %65 to <4 x float>*
store <4 x float> %32, <4 x float>* %66
%67 = or i64 %41, 40
%68 = getelementptr float, float* %36, i64 %67
%69 = bitcast float* %68 to <4 x float>*
store <4 x float> %30, <4 x float>* %69
%70 = getelementptr float, float* %68, i64 4
%71 = bitcast float* %70 to <4 x float>*
store <4 x float> %32, <4 x float>* %71
%72 = or i64 %41, 48
%73 = getelementptr float, float* %36, i64 %72
%74 = bitcast float* %73 to <4 x float>*
store <4 x float> %30, <4 x float>* %74
%75 = getelementptr float, float* %73, i64 4
%76 = bitcast float* %75 to <4 x float>*
store <4 x float> %32, <4 x float>* %76
%77 = or i64 %41, 56
%78 = getelementptr float, float* %36, i64 %77
%79 = bitcast float* %78 to <4 x float>*
store <4 x float> %30, <4 x float>* %79
%80 = getelementptr float, float* %78, i64 4
%81 = bitcast float* %80 to <4 x float>*
store <4 x float> %32, <4 x float>* %81
%82 = add nuw i64 %41, 64
%83 = add nuw i64 %42, 8
%84 = icmp eq i64 %83, %21
br i1 %84, label %85, label %40
85: ; preds = %40, %38
%86 = phi i64 [ 0, %38 ], [ %82, %40 ]
br i1 %22, label %97, label %87
87: ; preds = %85, %87
%88 = phi i64 [ %94, %87 ], [ %86, %85 ]
%89 = phi i64 [ %95, %87 ], [ 0, %85 ]
%90 = getelementptr float, float* %36, i64 %88
%91 = bitcast float* %90 to <4 x float>*
store <4 x float> %30, <4 x float>* %91
%92 = getelementptr float, float* %90, i64 4
%93 = bitcast float* %92 to <4 x float>*
store <4 x float> %32, <4 x float>* %93
%94 = add nuw i64 %88, 8
%95 = add i64 %89, 1
%96 = icmp eq i64 %95, %19
br i1 %96, label %97, label %87
97: ; preds = %87, %85
br i1 %23, label %105, label %98
98: ; preds = %37, %97
%99 = phi i32 [ 0, %37 ], [ %18, %97 ]
%100 = phi float* [ %36, %37 ], [ %39, %97 ]
br label %109
101: ; preds = %105, %24
%102 = phi float* [ %26, %24 ], [ %106, %105 ]
%103 = add nuw nsw i32 %25, 1
%104 = icmp eq i32 %103, %3
br i1 %104, label %33, label %24
105: ; preds = %109, %97, %34
%106 = phi float* [ %36, %34 ], [ %39, %97 ], [ %112, %109 ]
%107 = add nuw nsw i32 %35, 1
%108 = icmp eq i32 %107, %2
br i1 %108, label %101, label %34
109: ; preds = %98, %109
%110 = phi i32 [ %113, %109 ], [ %99, %98 ]
%111 = phi float* [ %112, %109 ], [ %100, %98 ]
store float %28, float* %111
%112 = getelementptr inbounds float, float* %111, i64 1
%113 = add nuw nsw i32 %110, 1
%114 = icmp eq i32 %113, %1
br i1 %114, label %105, label %109
}