float angle(xyz1, xyz2, xyz3)
float xyz1[3], xyz2[3], xyz3[3];
{
  float d12, d23, d13, s, c, x;
  d12 = distance(xyz1, xyz2);
  d23 = distance(xyz2, xyz3);
  d13 = distance(xyz1, xyz3);
  x = 2.0 * d12 * d23;
  if ((x < 0.00001) || (d13 < 0.00001))
    return (0.0);
  c = (d23 * d23 + d12 * d12 - d13 * d13) / x;
  if (1.0 - c * c < 0.00001)
    return (180.0);
  return ((float)(57.29577951 * acos((double)c)));
}


x86 assembly (clang, -O0):
<angle>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    $0x0,%al
call   1040 <distance@plt>
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x18(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    $0x0,%al
call   1040 <distance@plt>
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    $0x0,%al
call   1040 <distance@plt>
cvtsi2ss %eax,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x24(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe7b(%rip),%xmm0
mulsd  %xmm1,%xmm0
movss  -0x28(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x38(%rbp)
movss  -0x38(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe48(%rip),%xmm0
ucomisd %xmm1,%xmm0
ja     11dd <angle+0xbd>
movss  -0x2c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe2d(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    11ea <angle+0xca>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1293 <angle+0x173>
movss  -0x28(%rbp),%xmm1
movss  -0x28(%rbp),%xmm2
movss  -0x24(%rbp),%xmm0
mulss  -0x24(%rbp),%xmm0
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  -0x2c(%rbp),%xmm0
movss  -0x2c(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
divss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
mulss  -0x34(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdcb(%rip),%xmm1
subsd  %xmm0,%xmm1
movsd  0xdaf(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    126d <angle+0x14d>
movss  0xdbd(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1293 <angle+0x173>
movss  -0x34(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <acos@plt>
movaps %xmm0,%xmm1
movsd  0xd92(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<angle>:
push   %r15
push   %r14
push   %rbx
sub    $0x10,%rsp
mov    %rdx,%r14
mov    %rsi,%rbx
mov    %rdi,%r15
xor    %eax,%eax
call   1040 <distance@plt>
cvtsi2ss %eax,%xmm0
movss  %xmm0,0xc(%rsp)
mov    %rbx,%rdi
mov    %r14,%rsi
xor    %eax,%eax
call   1040 <distance@plt>
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
movss  %xmm0,0x8(%rsp)
mov    %r15,%rdi
mov    %r14,%rsi
xor    %eax,%eax
call   1040 <distance@plt>
movss  0xc(%rsp),%xmm6
movss  0x8(%rsp),%xmm5
xorps  %xmm0,%xmm0
cvtss2sd %xmm6,%xmm0
addsd  %xmm0,%xmm0
cvtss2sd %xmm5,%xmm1
mulsd  %xmm0,%xmm1
cvtsd2ss %xmm1,%xmm2
xorps  %xmm0,%xmm0
cvtss2sd %xmm2,%xmm0
movsd  0xe64(%rip),%xmm1
ucomisd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ja     120a <angle+0xea>
cvtsi2ss %eax,%xmm3
cvtss2sd %xmm3,%xmm4
ucomisd %xmm4,%xmm1
ja     120a <angle+0xea>
mulss  %xmm6,%xmm6
mulss  %xmm5,%xmm5
addss  %xmm6,%xmm5
mulss  %xmm3,%xmm3
subss  %xmm3,%xmm5
divss  %xmm2,%xmm5
movaps %xmm5,%xmm0
mulss  %xmm5,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe2a(%rip),%xmm2
subsd  %xmm0,%xmm2
ucomisd %xmm2,%xmm1
jbe    11f2 <angle+0xd2>
movss  0xe28(%rip),%xmm0
jmp    120a <angle+0xea>
xorps  %xmm0,%xmm0
cvtss2sd %xmm5,%xmm0
call   1030 <acos@plt>
mulsd  0xe0a(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define float @angle(float* %0, float* %1, float* %2) {
%4 = alloca float
%5 = alloca float*
%6 = alloca float*
%7 = alloca float*
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca float
store float* %0, float** %5
store float* %1, float** %6
store float* %2, float** %7
%14 = load float*, float** %5
%15 = load float*, float** %6
%16 = call i32 (float*, float*, ...) bitcast (i32 (...)* @distance to i32 (float*, float*, ...)*)(float* %14, float* %15)
%17 = sitofp i32 %16 to float
store float %17, float* %8
%18 = load float*, float** %6
%19 = load float*, float** %7
%20 = call i32 (float*, float*, ...) bitcast (i32 (...)* @distance to i32 (float*, float*, ...)*)(float* %18, float* %19)
%21 = sitofp i32 %20 to float
store float %21, float* %9
%22 = load float*, float** %5
%23 = load float*, float** %7
%24 = call i32 (float*, float*, ...) bitcast (i32 (...)* @distance to i32 (float*, float*, ...)*)(float* %22, float* %23)
%25 = sitofp i32 %24 to float
store float %25, float* %10
%26 = load float, float* %8
%27 = fpext float %26 to double
%28 = fmul double 2.000000e+00, %27
%29 = load float, float* %9
%30 = fpext float %29 to double
%31 = fmul double %28, %30
%32 = fptrunc double %31 to float
store float %32, float* %13
%33 = load float, float* %13
%34 = fpext float %33 to double
%35 = fcmp olt double %34, 1.000000e-05
br i1 %35, label %40, label %36
36: ; preds = %3
%37 = load float, float* %10
%38 = fpext float %37 to double
%39 = fcmp olt double %38, 1.000000e-05
br i1 %39, label %40, label %41
40: ; preds = %36, %3
store float 0.000000e+00, float* %4
br label %67
41: ; preds = %36
%42 = load float, float* %9
%43 = load float, float* %9
%44 = load float, float* %8
%45 = load float, float* %8
%46 = fmul float %44, %45
%47 = call float @llvm.fmuladd.f32(float %42, float %43, float %46)
%48 = load float, float* %10
%49 = load float, float* %10
%50 = fneg float %48
%51 = call float @llvm.fmuladd.f32(float %50, float %49, float %47)
%52 = load float, float* %13
%53 = fdiv float %51, %52
store float %53, float* %12
%54 = load float, float* %12
%55 = load float, float* %12
%56 = fmul float %54, %55
%57 = fpext float %56 to double
%58 = fsub double 1.000000e+00, %57
%59 = fcmp olt double %58, 1.000000e-05
br i1 %59, label %60, label %61
60: ; preds = %41
store float 1.800000e+02, float* %4
br label %67
61: ; preds = %41
%62 = load float, float* %12
%63 = fpext float %62 to double
%64 = call double @acos(double %63)
%65 = fmul double 0x404CA5DC1A5D2372, %64
%66 = fptrunc double %65 to float
store float %66, float* %4
br label %67
67: ; preds = %61, %60, %40
%68 = load float, float* %4
ret float %68
}

LLVM IR (-O2):
define float @angle(float* %0, float* %1, float* %2) {
%4 = tail call i32 (float*, float*, ...) bitcast (i32 (...)* @distance to i32 (float*, float*, ...)*)(float* %0, float* %1)
%5 = sitofp i32 %4 to float
%6 = tail call i32 (float*, float*, ...) bitcast (i32 (...)* @distance to i32 (float*, float*, ...)*)(float* %1, float* %2)
%7 = sitofp i32 %6 to float
%8 = tail call i32 (float*, float*, ...) bitcast (i32 (...)* @distance to i32 (float*, float*, ...)*)(float* %0, float* %2)
%9 = sitofp i32 %8 to float
%10 = fpext float %5 to double
%11 = fmul double %10, 2.000000e+00
%12 = fpext float %7 to double
%13 = fmul double %11, %12
%14 = fptrunc double %13 to float
%15 = fpext float %14 to double
%16 = fcmp olt double %15, 1.000000e-05
%17 = fpext float %9 to double
%18 = fcmp olt double %17, 1.000000e-05
%19 = select i1 %16, i1 true, i1 %18
br i1 %19, label %35, label %20
20: ; preds = %3
%21 = fmul float %5, %5
%22 = tail call float @llvm.fmuladd.f32(float %7, float %7, float %21)
%23 = fneg float %9
%24 = tail call float @llvm.fmuladd.f32(float %23, float %9, float %22)
%25 = fdiv float %24, %14
%26 = fmul float %25, %25
%27 = fpext float %26 to double
%28 = fsub double 1.000000e+00, %27
%29 = fcmp olt double %28, 1.000000e-05
br i1 %29, label %35, label %30
30: ; preds = %20
%31 = fpext float %25 to double
%32 = tail call double @acos(double %31)
%33 = fmul double %32, 0x404CA5DC1A5D2372
%34 = fptrunc double %33 to float
br label %35
35: ; preds = %20, %3, %30
%36 = phi float [ %34, %30 ], [ 0.000000e+00, %3 ], [ 1.800000e+02, %20 ]
ret float %36
}