void invert_vec(int n, float *vec) {
  int i;
  float v;
  for (i = 0; i < n; i++) {
    if ((v = vec[i]) != 0.0)
      vec[i] = 1.0f / v;
  }
}


x86 assembly (clang, -O0):
<invert_vec>:
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    1179 <invert_vec+0x79>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x18(%rbp)
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    114c <invert_vec+0x4c>
jp     114c <invert_vec+0x4c>
jmp    1166 <invert_vec+0x66>
movss  0xeac(%rip),%xmm0
divss  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    116b <invert_vec+0x6b>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1112 <invert_vec+0x12>
pop    %rbp
ret

x86 assembly (clang, -O2):
<invert_vec>:
test   %edi,%edi
jle    11c5 <invert_vec+0xc5>
mov    %edi,%eax
cmp    $0x4,%edi
jae    1116 <invert_vec+0x16>
xor    %ecx,%ecx
jmp    11c6 <invert_vec+0xc6>
mov    %eax,%ecx
and    $0xfffffffc,%ecx
lea    0x0(,%rax,4),%r8
and    $0xfffffffffffffff0,%r8
xor    %edi,%edi
xorps  %xmm0,%xmm0
movss  0xecc(%rip),%xmm1
xorps  %xmm2,%xmm2
jmp    1149 <invert_vec+0x49>
nopl   0x0(%rax)
add    $0x10,%rdi
cmp    %rdi,%r8
je     11c0 <invert_vec+0xc0>
movups (%rsi,%rdi,1),%xmm3
ucomiss %xmm0,%xmm3
jne    1154 <invert_vec+0x54>
jnp    1160 <invert_vec+0x60>
movaps %xmm1,%xmm4
divss  %xmm3,%xmm4
movss  %xmm4,(%rsi,%rdi,1)
movaps %xmm3,%xmm4
cmpneqps %xmm2,%xmm4
pextrw $0x2,%xmm4,%edx
test   $0x1,%dl
je     1185 <invert_vec+0x85>
movaps %xmm3,%xmm5
shufps $0x55,%xmm3,%xmm5
movaps %xmm1,%xmm6
divss  %xmm5,%xmm6
movss  %xmm6,0x4(%rsi,%rdi,1)
pextrw $0x4,%xmm4,%edx
test   $0x1,%dl
je     11a3 <invert_vec+0xa3>
movaps %xmm3,%xmm5
unpckhpd %xmm3,%xmm5
movaps %xmm1,%xmm6
divss  %xmm5,%xmm6
movss  %xmm6,0x8(%rsi,%rdi,1)
pextrw $0x6,%xmm4,%edx
test   $0x1,%dl
je     1140 <invert_vec+0x40>
shufps $0xff,%xmm3,%xmm3
movaps %xmm1,%xmm4
divss  %xmm3,%xmm4
movss  %xmm4,0xc(%rsi,%rdi,1)
jmp    1140 <invert_vec+0x40>
cmp    %rax,%rcx
jne    11c6 <invert_vec+0xc6>
ret
xorps  %xmm0,%xmm0
movss  0xe2f(%rip),%xmm1
jmp    11e9 <invert_vec+0xe9>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rcx
cmp    %rcx,%rax
je     11c5 <invert_vec+0xc5>
movss  (%rsi,%rcx,4),%xmm2
ucomiss %xmm0,%xmm2
jne    11f5 <invert_vec+0xf5>
jnp    11e0 <invert_vec+0xe0>
movaps %xmm1,%xmm3
divss  %xmm2,%xmm3
movss  %xmm3,(%rsi,%rcx,4)
jmp    11e0 <invert_vec+0xe0>

LLVM IR (-O0):
define void @invert_vec(i32 %0, float* %1) {
%3 = alloca i32
%4 = alloca float*
%5 = alloca i32
%6 = alloca float
store i32 %0, i32* %3
store float* %1, float** %4
store i32 0, i32* %5
br label %7
7: ; preds = %27, %2
%8 = load i32, i32* %5
%9 = load i32, i32* %3
%10 = icmp slt i32 %8, %9
br i1 %10, label %11, label %30
11: ; preds = %7
%12 = load float*, float** %4
%13 = load i32, i32* %5
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds float, float* %12, i64 %14
%16 = load float, float* %15
store float %16, float* %6
%17 = fpext float %16 to double
%18 = fcmp une double %17, 0.000000e+00
br i1 %18, label %19, label %26
19: ; preds = %11
%20 = load float, float* %6
%21 = fdiv float 1.000000e+00, %20
%22 = load float*, float** %4
%23 = load i32, i32* %5
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds float, float* %22, i64 %24
store float %21, float* %25
br label %26
26: ; preds = %19, %11
br label %27
27: ; preds = %26
%28 = load i32, i32* %5
%29 = add nsw i32 %28, 1
store i32 %29, i32* %5
br label %7
30: ; preds = %7
ret void
}

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