float test_func_00(float *p, int c) {
  float r = 0;
  do {
    r += *p++;
    r += *p++;
    r += *p++;
  } while (--c);
  return r;
}


x86 assembly (clang, -O0):
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x8(%rbp)
movss  (%rax),%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x8(%rbp)
movss  (%rax),%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x8(%rbp)
movss  (%rax),%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xc(%rbp)
cmp    $0x0,%eax
jne    1113 <test_func_00+0x13>
movss  -0x10(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
xorps  %xmm0,%xmm0
test   $0x1,%sil
jne    1112 <test_func_00+0x12>
mov    %esi,%eax
cmp    $0x1,%esi
jne    1130 <test_func_00+0x30>
jmp    1156 <test_func_00+0x56>
addss  (%rdi),%xmm0
addss  0x4(%rdi),%xmm0
addss  0x8(%rdi),%xmm0
add    $0xc,%rdi
lea    -0x1(%rsi),%eax
cmp    $0x1,%esi
je     1156 <test_func_00+0x56>
nopl   0x0(%rax)
addss  (%rdi),%xmm0
addss  0x4(%rdi),%xmm0
addss  0x8(%rdi),%xmm0
addss  0xc(%rdi),%xmm0
addss  0x10(%rdi),%xmm0
addss  0x14(%rdi),%xmm0
add    $0x18,%rdi
add    $0xfffffffe,%eax
jne    1130 <test_func_00+0x30>
ret

LLVM IR (-O0):
define float @test_func_00(float* %0, i32 %1) {
%3 = alloca float*
%4 = alloca i32
%5 = alloca float
store float* %0, float** %3
store i32 %1, i32* %4
store float 0.000000e+00, float* %5
br label %6
6: ; preds = %22, %2
%7 = load float*, float** %3
%8 = getelementptr inbounds float, float* %7, i32 1
store float* %8, float** %3
%9 = load float, float* %7
%10 = load float, float* %5
%11 = fadd float %10, %9
store float %11, float* %5
%12 = load float*, float** %3
%13 = getelementptr inbounds float, float* %12, i32 1
store float* %13, float** %3
%14 = load float, float* %12
%15 = load float, float* %5
%16 = fadd float %15, %14
store float %16, float* %5
%17 = load float*, float** %3
%18 = getelementptr inbounds float, float* %17, i32 1
store float* %18, float** %3
%19 = load float, float* %17
%20 = load float, float* %5
%21 = fadd float %20, %19
store float %21, float* %5
br label %22
22: ; preds = %6
%23 = load i32, i32* %4
%24 = add nsw i32 %23, -1
store i32 %24, i32* %4
%25 = icmp ne i32 %24, 0
br i1 %25, label %6, label %26
26: ; preds = %22
%27 = load float, float* %5
ret float %27
}

LLVM IR (-O2):
define float @test_func_00(float* nocapture %0, i32 %1) {
%3 = and i32 %1, 1
%4 = icmp eq i32 %3, 0
br i1 %4, label %16, label %5
5: ; preds = %2
%6 = getelementptr inbounds float, float* %0, i64 1
%7 = load float, float* %0
%8 = fadd float %7, 0.000000e+00
%9 = getelementptr inbounds float, float* %0, i64 2
%10 = load float, float* %6
%11 = fadd float %8, %10
%12 = getelementptr inbounds float, float* %0, i64 3
%13 = load float, float* %9
%14 = fadd float %11, %13
%15 = add nsw i32 %1, -1
br label %16
16: ; preds = %5, %2
%17 = phi float [ undef, %2 ], [ %14, %5 ]
%18 = phi float* [ %0, %2 ], [ %12, %5 ]
%19 = phi i32 [ %1, %2 ], [ %15, %5 ]
%20 = phi float [ 0.000000e+00, %2 ], [ %14, %5 ]
%21 = icmp eq i32 %1, 1
br i1 %21, label %46, label %22
22: ; preds = %16, %22
%23 = phi float* [ %41, %22 ], [ %18, %16 ]
%24 = phi i32 [ %44, %22 ], [ %19, %16 ]
%25 = phi float [ %43, %22 ], [ %20, %16 ]
%26 = getelementptr inbounds float, float* %23, i64 1
%27 = load float, float* %23
%28 = fadd float %25, %27
%29 = getelementptr inbounds float, float* %23, i64 2
%30 = load float, float* %26
%31 = fadd float %28, %30
%32 = getelementptr inbounds float, float* %23, i64 3
%33 = load float, float* %29
%34 = fadd float %31, %33
%35 = getelementptr inbounds float, float* %23, i64 4
%36 = load float, float* %32
%37 = fadd float %34, %36
%38 = getelementptr inbounds float, float* %23, i64 5
%39 = load float, float* %35
%40 = fadd float %37, %39
%41 = getelementptr inbounds float, float* %23, i64 6
%42 = load float, float* %38
%43 = fadd float %40, %42
%44 = add nsw i32 %24, -2
%45 = icmp eq i32 %44, 0
br i1 %45, label %46, label %22
46: ; preds = %22, %16
%47 = phi float [ %17, %16 ], [ %43, %22 ]
ret float %47
}