int test_float() {
  int i;
  float reds[3] = {0.0};
#pragma acc parallel loop
  for (i = 0; i < 4096; i++) {
    float v;
    v = (float)(i + 10);
#pragma acc atomic
    reds[0] -= v;
#pragma acc atomic
    reds[1] = reds[1] - v;
  }
  for (i = 0; i < 2; i++) {
    if (reds[i] != -(4096 * (4096 - 1) / 2 + 10 * 4096)) {
      return i + 1;
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<test_float>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
lea    -0x14(%rbp),%rdi
xor    %esi,%esi
mov    $0xc,%edx
call   1030 <memset@plt>
movl   $0x0,-0x8(%rbp)
cmpl   $0x1000,-0x8(%rbp)
jge    117b <test_float+0x6b>
mov    -0x8(%rbp),%eax
add    $0xa,%eax
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm1
movss  -0x14(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x10(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    112f <test_float+0x1f>
movl   $0x0,-0x8(%rbp)
cmpl   $0x2,-0x8(%rbp)
jge    11d3 <test_float+0xc3>
movslq -0x8(%rbp),%rax
movss  -0x14(%rbp,%rax,4),%xmm0
movss  0xe62(%rip),%xmm1
ucomiss %xmm1,%xmm0
jne    11b2 <test_float+0xa2>
jp     11b2 <test_float+0xa2>
jmp    11c0 <test_float+0xb0>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    11da <test_float+0xca>
jmp    11c5 <test_float+0xb5>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1182 <test_float+0x72>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<test_float>:
xorps  %xmm1,%xmm1
mov    $0xd,%eax
xorps  %xmm0,%xmm0
nopl   0x0(%rax,%rax,1)
lea    -0x3(%rax),%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
subss  %xmm2,%xmm1
lea    -0x2(%rax),%ecx
xorps  %xmm3,%xmm3
cvtsi2ss %ecx,%xmm3
subss  %xmm2,%xmm0
subss  %xmm3,%xmm1
subss  %xmm3,%xmm0
lea    -0x1(%rax),%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
subss  %xmm2,%xmm1
subss  %xmm2,%xmm0
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
subss  %xmm2,%xmm1
subss  %xmm2,%xmm0
add    $0x4,%eax
cmp    $0x100d,%eax
jne    1110 <test_float+0x10>
mov    $0x1,%eax
ucomiss 0xe95(%rip),%xmm1
jne    116f <test_float+0x6f>
jnp    1170 <test_float+0x70>
ret
mov    $0x2,%eax
ucomiss 0xe84(%rip),%xmm0
jne    116f <test_float+0x6f>
jp     116f <test_float+0x6f>
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @test_float() {
br label %3
1: ; preds = %3
%2 = fcmp une float %21, -8.427520e+06
br i1 %2, label %28, label %25
3: ; preds = %3, %0
%4 = phi i32 [ 0, %0 ], [ %23, %3 ]
%5 = phi float [ 0.000000e+00, %0 ], [ %21, %3 ]
%6 = phi float [ 0.000000e+00, %0 ], [ %22, %3 ]
%7 = add nuw nsw i32 %4, 10
%8 = sitofp i32 %7 to float
%9 = fsub float %5, %8
%10 = fsub float %6, %8
%11 = add nuw nsw i32 %4, 11
%12 = sitofp i32 %11 to float
%13 = fsub float %9, %12
%14 = fsub float %10, %12
%15 = add nuw nsw i32 %4, 12
%16 = sitofp i32 %15 to float
%17 = fsub float %13, %16
%18 = fsub float %14, %16
%19 = add nuw nsw i32 %4, 13
%20 = sitofp i32 %19 to float
%21 = fsub float %17, %20
%22 = fsub float %18, %20
%23 = add nuw nsw i32 %4, 4
%24 = icmp eq i32 %23, 4096
br i1 %24, label %1, label %3
25: ; preds = %1
%26 = fcmp une float %22, -8.427520e+06
br i1 %26, label %28, label %27
27: ; preds = %25
br label %28
28: ; preds = %1, %25, %27
%29 = phi i32 [ 0, %27 ], [ 1, %1 ], [ 2, %25 ]
ret i32 %29
}