void test_comp_unit_1(const int niters, double *a) {
#pragma omp target
  for (int ii = 0; ii < niters; ++ii)
    a[ii] = (double)ii;
}


x86 assembly (clang, -O0):
<test_comp_unit_1>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    113e <test_comp_unit_1+0x3e>
cvtsi2sdl -0x14(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1112 <test_comp_unit_1+0x12>
pop    %rbp
ret

x86 assembly (clang, -O2):
<test_comp_unit_1>:
test   %edi,%edi
jle    11f5 <test_comp_unit_1+0xf5>
mov    %edi,%eax
cmp    $0x4,%edi
jae    1116 <test_comp_unit_1+0x16>
xor    %ecx,%ecx
jmp    11e0 <test_comp_unit_1+0xe0>
mov    %eax,%ecx
and    $0xfffffffc,%ecx
lea    -0x4(%rcx),%rdx
mov    %rdx,%r8
shr    $0x2,%r8
add    $0x1,%r8
test   %rdx,%rdx
je     11f6 <test_comp_unit_1+0xf6>
mov    %r8,%rdx
and    $0xfffffffffffffffe,%rdx
movdqa 0xebe(%rip),%xmm0
xor    %edi,%edi
movdqa 0xec4(%rip),%xmm1
movdqa 0xecc(%rip),%xmm2
movdqa 0xed4(%rip),%xmm3
movdqa 0xedc(%rip),%xmm4
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movdqa %xmm0,%xmm5
cvtdq2pd %xmm0,%xmm6
paddd  %xmm1,%xmm5
cvtdq2pd %xmm5,%xmm5
movups %xmm6,(%rsi,%rdi,8)
movups %xmm5,0x10(%rsi,%rdi,8)
movdqa %xmm0,%xmm5
paddd  %xmm2,%xmm5
movdqa %xmm0,%xmm6
cvtdq2pd %xmm5,%xmm5
paddd  %xmm3,%xmm6
cvtdq2pd %xmm6,%xmm6
movups %xmm5,0x20(%rsi,%rdi,8)
movups %xmm6,0x30(%rsi,%rdi,8)
add    $0x8,%rdi
paddd  %xmm4,%xmm0
add    $0xfffffffffffffffe,%rdx
jne    1170 <test_comp_unit_1+0x70>
test   $0x1,%r8b
je     11da <test_comp_unit_1+0xda>
cvtdq2pd %xmm0,%xmm1
paddd  0xe45(%rip),%xmm0
cvtdq2pd %xmm0,%xmm0
movdqu %xmm1,(%rsi,%rdi,8)
movdqu %xmm0,0x10(%rsi,%rdi,8)
cmp    %rax,%rcx
je     11f5 <test_comp_unit_1+0xf5>
nop
xorps  %xmm0,%xmm0
cvtsi2sd %ecx,%xmm0
movsd  %xmm0,(%rsi,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    11e0 <test_comp_unit_1+0xe0>
ret
movdqa 0xe02(%rip),%xmm0
xor    %edi,%edi
test   $0x1,%r8b
jne    11bf <test_comp_unit_1+0xbf>
jmp    11da <test_comp_unit_1+0xda>

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

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