void f3(int *a) {
  int i, j;
#pragma omp simd
  for (j = 0; j < 64; j++) {
#pragma omp loop bind(parallel)
    for (i = 0; i < 64; i++)
      a[64 * j + i] = i;
  }
}


x86 assembly (clang, -O0):
<f3>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0x10(%rbp)
cmpl   $0x40,-0x10(%rbp)
jge    1161 <f3+0x61>
movl   $0x0,-0xc(%rbp)
cmpl   $0x40,-0xc(%rbp)
jge    114e <f3+0x4e>
mov    -0xc(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
shl    $0x6,%ecx
add    -0xc(%rbp),%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1120 <f3+0x20>
jmp    1153 <f3+0x53>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    110f <f3+0xf>
pop    %rbp
ret

x86 assembly (clang, -O2):
<f3>:
xor    %eax,%eax
movaps 0xef6(%rip),%xmm8
movaps 0xefe(%rip),%xmm9
movaps 0xf06(%rip),%xmm10
movaps 0xf0e(%rip),%xmm11
movaps 0xf16(%rip),%xmm12
movaps 0xf1e(%rip),%xmm13
movaps 0xf26(%rip),%xmm14
movaps 0xf2e(%rip),%xmm15
movaps 0xf37(%rip),%xmm0
movaps 0xf40(%rip),%xmm1
movaps 0xf49(%rip),%xmm2
movaps 0xf52(%rip),%xmm3
movaps 0xf5b(%rip),%xmm4
movaps 0xf64(%rip),%xmm5
movaps 0xf6d(%rip),%xmm6
movaps 0xf76(%rip),%xmm7
nopw   0x0(%rax,%rax,1)
movups %xmm8,(%rdi,%rax,1)
movups %xmm9,0x10(%rdi,%rax,1)
movups %xmm10,0x20(%rdi,%rax,1)
movups %xmm11,0x30(%rdi,%rax,1)
movups %xmm12,0x40(%rdi,%rax,1)
movups %xmm13,0x50(%rdi,%rax,1)
movups %xmm14,0x60(%rdi,%rax,1)
movups %xmm15,0x70(%rdi,%rax,1)
movups %xmm0,0x80(%rdi,%rax,1)
movups %xmm1,0x90(%rdi,%rax,1)
movups %xmm2,0xa0(%rdi,%rax,1)
movups %xmm3,0xb0(%rdi,%rax,1)
movups %xmm4,0xc0(%rdi,%rax,1)
movups %xmm5,0xd0(%rdi,%rax,1)
movups %xmm6,0xe0(%rdi,%rax,1)
movups %xmm7,0xf0(%rdi,%rax,1)
add    $0x100,%rax
cmp    $0x4000,%rax
jne    1180 <f3+0x80>
ret

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

LLVM IR (-O2):
define void @f3(i32* nocapture writeonly %0) {
br label %2
2: ; preds = %1, %2
%3 = phi i64 [ 0, %1 ], [ %52, %2 ]
%4 = shl nsw i64 %3, 6
%5 = getelementptr inbounds i32, i32* %0, i64 %4
%6 = bitcast i32* %5 to <4 x i32>*
store <4 x i32> <i32 0, i32 1, i32 2, i32 3>, <4 x i32>* %6
%7 = or i64 %4, 4
%8 = getelementptr inbounds i32, i32* %0, i64 %7
%9 = bitcast i32* %8 to <4 x i32>*
store <4 x i32> <i32 4, i32 5, i32 6, i32 7>, <4 x i32>* %9
%10 = or i64 %4, 8
%11 = getelementptr inbounds i32, i32* %0, i64 %10
%12 = bitcast i32* %11 to <4 x i32>*
store <4 x i32> <i32 8, i32 9, i32 10, i32 11>, <4 x i32>* %12
%13 = or i64 %4, 12
%14 = getelementptr inbounds i32, i32* %0, i64 %13
%15 = bitcast i32* %14 to <4 x i32>*
store <4 x i32> <i32 12, i32 13, i32 14, i32 15>, <4 x i32>* %15
%16 = or i64 %4, 16
%17 = getelementptr inbounds i32, i32* %0, i64 %16
%18 = bitcast i32* %17 to <4 x i32>*
store <4 x i32> <i32 16, i32 17, i32 18, i32 19>, <4 x i32>* %18
%19 = or i64 %4, 20
%20 = getelementptr inbounds i32, i32* %0, i64 %19
%21 = bitcast i32* %20 to <4 x i32>*
store <4 x i32> <i32 20, i32 21, i32 22, i32 23>, <4 x i32>* %21
%22 = or i64 %4, 24
%23 = getelementptr inbounds i32, i32* %0, i64 %22
%24 = bitcast i32* %23 to <4 x i32>*
store <4 x i32> <i32 24, i32 25, i32 26, i32 27>, <4 x i32>* %24
%25 = or i64 %4, 28
%26 = getelementptr inbounds i32, i32* %0, i64 %25
%27 = bitcast i32* %26 to <4 x i32>*
store <4 x i32> <i32 28, i32 29, i32 30, i32 31>, <4 x i32>* %27
%28 = or i64 %4, 32
%29 = getelementptr inbounds i32, i32* %0, i64 %28
%30 = bitcast i32* %29 to <4 x i32>*
store <4 x i32> <i32 32, i32 33, i32 34, i32 35>, <4 x i32>* %30
%31 = or i64 %4, 36
%32 = getelementptr inbounds i32, i32* %0, i64 %31
%33 = bitcast i32* %32 to <4 x i32>*
store <4 x i32> <i32 36, i32 37, i32 38, i32 39>, <4 x i32>* %33
%34 = or i64 %4, 40
%35 = getelementptr inbounds i32, i32* %0, i64 %34
%36 = bitcast i32* %35 to <4 x i32>*
store <4 x i32> <i32 40, i32 41, i32 42, i32 43>, <4 x i32>* %36
%37 = or i64 %4, 44
%38 = getelementptr inbounds i32, i32* %0, i64 %37
%39 = bitcast i32* %38 to <4 x i32>*
store <4 x i32> <i32 44, i32 45, i32 46, i32 47>, <4 x i32>* %39
%40 = or i64 %4, 48
%41 = getelementptr inbounds i32, i32* %0, i64 %40
%42 = bitcast i32* %41 to <4 x i32>*
store <4 x i32> <i32 48, i32 49, i32 50, i32 51>, <4 x i32>* %42
%43 = or i64 %4, 52
%44 = getelementptr inbounds i32, i32* %0, i64 %43
%45 = bitcast i32* %44 to <4 x i32>*
store <4 x i32> <i32 52, i32 53, i32 54, i32 55>, <4 x i32>* %45
%46 = or i64 %4, 56
%47 = getelementptr inbounds i32, i32* %0, i64 %46
%48 = bitcast i32* %47 to <4 x i32>*
store <4 x i32> <i32 56, i32 57, i32 58, i32 59>, <4 x i32>* %48
%49 = or i64 %4, 60
%50 = getelementptr inbounds i32, i32* %0, i64 %49
%51 = bitcast i32* %50 to <4 x i32>*
store <4 x i32> <i32 60, i32 61, i32 62, i32 63>, <4 x i32>* %51
%52 = add nuw nsw i64 %3, 1
%53 = icmp eq i64 %52, 64
br i1 %53, label %54, label %2
54: ; preds = %2
ret void
}