int get_vertex(int x_coord[], int y_coord[], int st, int ed, double thresh,
               int vertex[], int *vnum) {
  double d, dmax;
  double a, b, c;
  int i, v1;
  a = y_coord[ed] - y_coord[st];
  b = x_coord[st] - x_coord[ed];
  c = x_coord[ed] * y_coord[st] - y_coord[ed] * x_coord[st];
  dmax = 0;
  for (i = st + 1; i < ed; i++) {
    d = a * x_coord[i] + b * y_coord[i] + c;
    if (d * d > dmax) {
      dmax = d * d;
      v1 = i;
    }
  }
  if (dmax / (a * a + b * b) > thresh) {
    if (get_vertex(x_coord, y_coord, st, v1, thresh, vertex, vnum) < 0)
      return (-1);
    if ((*vnum) > 5)
      return (-1);
    vertex[(*vnum)] = v1;
    (*vnum)++;
    if (get_vertex(x_coord, y_coord, v1, ed, thresh, vertex, vnum) < 0)
      return (-1);
  }
  return (0);
}


x86 assembly (clang, -O0):
<get_vertex>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
movsd  %xmm0,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x18(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
sub    (%rcx,%rdx,4),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x20(%rbp),%rdx
sub    (%rcx,%rdx,4),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x18(%rbp),%rcx
movslq -0x1c(%rbp),%rdx
imul   (%rcx,%rdx,4),%eax
mov    -0x18(%rbp),%rcx
movslq -0x20(%rbp),%rdx
mov    (%rcx,%rdx,4),%ecx
mov    -0x10(%rbp),%rdx
movslq -0x1c(%rbp),%rsi
imul   (%rdx,%rsi,4),%ecx
sub    %ecx,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x60(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
mov    -0x64(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    123e <get_vertex+0x12e>
movsd  -0x50(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x64(%rbp),%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm2
movsd  -0x58(%rbp),%xmm1
mov    -0x18(%rbp),%rax
movslq -0x64(%rbp),%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
addsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
ucomisd -0x48(%rbp),%xmm0
jbe    122b <get_vertex+0x11b>
movsd  -0x40(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x64(%rbp),%eax
mov    %eax,-0x68(%rbp)
jmp    1230 <get_vertex+0x120>
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    11bb <get_vertex+0xab>
movsd  -0x48(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm3
movsd  -0x58(%rbp),%xmm2
mulsd  -0x58(%rbp),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
ucomisd -0x28(%rbp),%xmm0
jbe    1312 <get_vertex+0x202>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x1c(%rbp),%edx
mov    -0x68(%rbp),%ecx
movsd  -0x28(%rbp),%xmm0
mov    -0x30(%rbp),%r8
mov    -0x38(%rbp),%r9
call   1030 <get_vertex@plt>
cmp    $0x0,%eax
jge    12a3 <get_vertex+0x193>
movl   $0xffffffff,-0x4(%rbp)
jmp    1319 <get_vertex+0x209>
mov    -0x38(%rbp),%rax
cmpl   $0x5,(%rax)
jle    12bc <get_vertex+0x1ac>
movl   $0xffffffff,-0x4(%rbp)
jmp    1319 <get_vertex+0x209>
mov    -0x68(%rbp),%edx
mov    -0x30(%rbp),%rax
mov    -0x38(%rbp),%rcx
movslq (%rcx),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x38(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x68(%rbp),%edx
mov    -0x20(%rbp),%ecx
movsd  -0x28(%rbp),%xmm0
mov    -0x30(%rbp),%r8
mov    -0x38(%rbp),%r9
call   1030 <get_vertex@plt>
cmp    $0x0,%eax
jge    130d <get_vertex+0x1fd>
movl   $0xffffffff,-0x4(%rbp)
jmp    1319 <get_vertex+0x209>
jmp    1312 <get_vertex+0x202>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_vertex>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %ecx,%r14d
mov    %rsi,%r13
movslq %ecx,%rax
mov    (%rsi,%rax,4),%r10d
movslq %edx,%rbx
mov    (%rsi,%rbx,4),%r11d
mov    %r10d,%esi
sub    %r11d,%esi
cvtsi2sd %esi,%xmm1
mov    %rdi,%rbp
mov    (%rdi,%rbx,4),%ecx
mov    (%rdi,%rax,4),%esi
mov    %ecx,%edi
sub    %esi,%edi
cvtsi2sd %edi,%xmm6
add    $0x1,%ebx
cmp    %eax,%ebx
jge    1183 <get_vertex+0x73>
imul   %r11d,%esi
imul   %r10d,%ecx
sub    %ecx,%esi
cvtsi2sd %esi,%xmm3
movslq %ebx,%rax
mov    %edx,%esi
not    %esi
add    %r14d,%esi
lea    -0x2(%r14),%ecx
test   $0x1,%sil
jne    118c <get_vertex+0x7c>
xorpd  %xmm2,%xmm2
cmp    %edx,%ecx
jne    11c0 <get_vertex+0xb0>
jmp    1230 <get_vertex+0x120>
xorpd  %xmm2,%xmm2
jmp    1230 <get_vertex+0x120>
cvtsi2sdl 0x0(%rbp,%rax,4),%xmm2
cvtsi2sdl 0x0(%r13,%rax,4),%xmm4
mulsd  %xmm6,%xmm4
mulsd  %xmm1,%xmm2
addsd  %xmm4,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm2
xorpd  %xmm4,%xmm4
maxsd  %xmm4,%xmm2
add    $0x1,%rax
cmp    %edx,%ecx
je     1230 <get_vertex+0x120>
nopl   (%rax)
xorps  %xmm4,%xmm4
cvtsi2sdl 0x0(%rbp,%rax,4),%xmm4
xorps  %xmm5,%xmm5
cvtsi2sdl 0x0(%r13,%rax,4),%xmm5
mulsd  %xmm6,%xmm5
mulsd  %xmm1,%xmm4
addsd  %xmm5,%xmm4
addsd  %xmm3,%xmm4
mulsd  %xmm4,%xmm4
ucomisd %xmm2,%xmm4
maxsd  %xmm2,%xmm4
cmova  %eax,%ebx
xorps  %xmm2,%xmm2
cvtsi2sdl 0x4(%rbp,%rax,4),%xmm2
xorps  %xmm5,%xmm5
cvtsi2sdl 0x4(%r13,%rax,4),%xmm5
mulsd  %xmm6,%xmm5
mulsd  %xmm1,%xmm2
addsd  %xmm5,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm2
ucomisd %xmm4,%xmm2
lea    0x1(%rax),%ecx
cmova  %ecx,%ebx
maxsd  %xmm4,%xmm2
add    $0x2,%rax
cmp    %r14d,%eax
jne    11c0 <get_vertex+0xb0>
mulsd  %xmm6,%xmm6
mulsd  %xmm1,%xmm1
addsd  %xmm6,%xmm1
divsd  %xmm1,%xmm2
ucomisd %xmm0,%xmm2
jbe    129e <get_vertex+0x18e>
mov    %rbp,%rdi
mov    %r13,%rsi
mov    %ebx,%ecx
movsd  %xmm0,0x8(%rsp)
mov    %r8,0x10(%rsp)
mov    %r9,%r15
call   1030 <get_vertex@plt>
mov    $0xffffffff,%r12d
test   %eax,%eax
js     12a1 <get_vertex+0x191>
movslq (%r15),%rax
cmp    $0x5,%rax
jg     12a1 <get_vertex+0x191>
mov    0x10(%rsp),%r8
mov    %ebx,(%r8,%rax,4)
addl   $0x1,(%r15)
mov    %rbp,%rdi
mov    %r13,%rsi
mov    %ebx,%edx
mov    %r14d,%ecx
movsd  0x8(%rsp),%xmm0
mov    %r15,%r9
call   1030 <get_vertex@plt>
test   %eax,%eax
js     12a1 <get_vertex+0x191>
xor    %r12d,%r12d
mov    %r12d,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @get_vertex(i32* %0, i32* %1, i32 %2, i32 %3, double %4, i32* %5, i32* %6) {
%8 = alloca i32
%9 = alloca i32*
%10 = alloca i32*
%11 = alloca i32
%12 = alloca i32
%13 = alloca double
%14 = alloca i32*
%15 = alloca i32*
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca i32
%22 = alloca i32
store i32* %0, i32** %9
store i32* %1, i32** %10
store i32 %2, i32* %11
store i32 %3, i32* %12
store double %4, double* %13
store i32* %5, i32** %14
store i32* %6, i32** %15
%23 = load i32*, i32** %10
%24 = load i32, i32* %12
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i32, i32* %23, i64 %25
%27 = load i32, i32* %26
%28 = load i32*, i32** %10
%29 = load i32, i32* %11
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i32, i32* %28, i64 %30
%32 = load i32, i32* %31
%33 = sub nsw i32 %27, %32
%34 = sitofp i32 %33 to double
store double %34, double* %18
%35 = load i32*, i32** %9
%36 = load i32, i32* %11
%37 = sext i32 %36 to i64
%38 = getelementptr inbounds i32, i32* %35, i64 %37
%39 = load i32, i32* %38
%40 = load i32*, i32** %9
%41 = load i32, i32* %12
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i32, i32* %40, i64 %42
%44 = load i32, i32* %43
%45 = sub nsw i32 %39, %44
%46 = sitofp i32 %45 to double
store double %46, double* %19
%47 = load i32*, i32** %9
%48 = load i32, i32* %12
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds i32, i32* %47, i64 %49
%51 = load i32, i32* %50
%52 = load i32*, i32** %10
%53 = load i32, i32* %11
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds i32, i32* %52, i64 %54
%56 = load i32, i32* %55
%57 = mul nsw i32 %51, %56
%58 = load i32*, i32** %10
%59 = load i32, i32* %12
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds i32, i32* %58, i64 %60
%62 = load i32, i32* %61
%63 = load i32*, i32** %9
%64 = load i32, i32* %11
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds i32, i32* %63, i64 %65
%67 = load i32, i32* %66
%68 = mul nsw i32 %62, %67
%69 = sub nsw i32 %57, %68
%70 = sitofp i32 %69 to double
store double %70, double* %20
store double 0.000000e+00, double* %17
%71 = load i32, i32* %11
%72 = add nsw i32 %71, 1
store i32 %72, i32* %21
br label %73
73: ; preds = %107, %7
%74 = load i32, i32* %21
%75 = load i32, i32* %12
%76 = icmp slt i32 %74, %75
br i1 %76, label %77, label %110
77: ; preds = %73
%78 = load double, double* %18
%79 = load i32*, i32** %9
%80 = load i32, i32* %21
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds i32, i32* %79, i64 %81
%83 = load i32, i32* %82
%84 = sitofp i32 %83 to double
%85 = load double, double* %19
%86 = load i32*, i32** %10
%87 = load i32, i32* %21
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i32, i32* %86, i64 %88
%90 = load i32, i32* %89
%91 = sitofp i32 %90 to double
%92 = fmul double %85, %91
%93 = call double @llvm.fmuladd.f64(double %78, double %84, double %92)
%94 = load double, double* %20
%95 = fadd double %93, %94
store double %95, double* %16
%96 = load double, double* %16
%97 = load double, double* %16
%98 = fmul double %96, %97
%99 = load double, double* %17
%100 = fcmp ogt double %98, %99
br i1 %100, label %101, label %106
101: ; preds = %77
%102 = load double, double* %16
%103 = load double, double* %16
%104 = fmul double %102, %103
store double %104, double* %17
%105 = load i32, i32* %21
store i32 %105, i32* %22
br label %106
106: ; preds = %101, %77
br label %107
107: ; preds = %106
%108 = load i32, i32* %21
%109 = add nsw i32 %108, 1
store i32 %109, i32* %21
br label %73
110: ; preds = %73
%111 = load double, double* %17
%112 = load double, double* %18
%113 = load double, double* %18
%114 = load double, double* %19
%115 = load double, double* %19
%116 = fmul double %114, %115
%117 = call double @llvm.fmuladd.f64(double %112, double %113, double %116)
%118 = fdiv double %111, %117
%119 = load double, double* %13
%120 = fcmp ogt double %118, %119
br i1 %120, label %121, label %158
121: ; preds = %110
%122 = load i32*, i32** %9
%123 = load i32*, i32** %10
%124 = load i32, i32* %11
%125 = load i32, i32* %22
%126 = load double, double* %13
%127 = load i32*, i32** %14
%128 = load i32*, i32** %15
%129 = call i32 @get_vertex(i32* %122, i32* %123, i32 %124, i32 %125, double %126, i32* %127, i32* %128)
%130 = icmp slt i32 %129, 0
br i1 %130, label %131, label %132
131: ; preds = %121
store i32 -1, i32* %8
br label %159
132: ; preds = %121
%133 = load i32*, i32** %15
%134 = load i32, i32* %133
%135 = icmp sgt i32 %134, 5
br i1 %135, label %136, label %137
136: ; preds = %132
store i32 -1, i32* %8
br label %159
137: ; preds = %132
%138 = load i32, i32* %22
%139 = load i32*, i32** %14
%140 = load i32*, i32** %15
%141 = load i32, i32* %140
%142 = sext i32 %141 to i64
%143 = getelementptr inbounds i32, i32* %139, i64 %142
store i32 %138, i32* %143
%144 = load i32*, i32** %15
%145 = load i32, i32* %144
%146 = add nsw i32 %145, 1
store i32 %146, i32* %144
%147 = load i32*, i32** %9
%148 = load i32*, i32** %10
%149 = load i32, i32* %22
%150 = load i32, i32* %12
%151 = load double, double* %13
%152 = load i32*, i32** %14
%153 = load i32*, i32** %15
%154 = call i32 @get_vertex(i32* %147, i32* %148, i32 %149, i32 %150, double %151, i32* %152, i32* %153)
%155 = icmp slt i32 %154, 0
br i1 %155, label %156, label %157
156: ; preds = %137
store i32 -1, i32* %8
br label %159
157: ; preds = %137
br label %158
158: ; preds = %157, %110
store i32 0, i32* %8
br label %159
159: ; preds = %158, %156, %136, %131
%160 = load i32, i32* %8
ret i32 %160
}

LLVM IR (-O2):
define i32 @get_vertex(i32* %0, i32* %1, i32 %2, i32 %3, double %4, i32* %5, i32* %6) {
%8 = sext i32 %3 to i64
%9 = getelementptr inbounds i32, i32* %1, i64 %8
%10 = load i32, i32* %9
%11 = sext i32 %2 to i64
%12 = getelementptr inbounds i32, i32* %1, i64 %11
%13 = load i32, i32* %12
%14 = sub nsw i32 %10, %13
%15 = sitofp i32 %14 to double
%16 = getelementptr inbounds i32, i32* %0, i64 %11
%17 = load i32, i32* %16
%18 = getelementptr inbounds i32, i32* %0, i64 %8
%19 = load i32, i32* %18
%20 = sub nsw i32 %17, %19
%21 = sitofp i32 %20 to double
%22 = mul nsw i32 %19, %13
%23 = mul nsw i32 %17, %10
%24 = sub nsw i32 %22, %23
%25 = sitofp i32 %24 to double
%26 = add i32 %2, 1
%27 = icmp slt i32 %26, %3
br i1 %27, label %28, label %90
28: ; preds = %7
%29 = sext i32 %26 to i64
%30 = xor i32 %2, -1
%31 = add i32 %30, %3
%32 = add i32 %3, -2
%33 = and i32 %31, 1
%34 = icmp eq i32 %33, 0
br i1 %34, label %49, label %35
35: ; preds = %28
%36 = getelementptr inbounds i32, i32* %0, i64 %29
%37 = load i32, i32* %36
%38 = sitofp i32 %37 to double
%39 = getelementptr inbounds i32, i32* %1, i64 %29
%40 = load i32, i32* %39
%41 = sitofp i32 %40 to double
%42 = fmul double %21, %41
%43 = tail call double @llvm.fmuladd.f64(double %15, double %38, double %42)
%44 = fadd double %43, %25
%45 = fmul double %44, %44
%46 = fcmp ogt double %45, 0.000000e+00
%47 = select i1 %46, double %45, double 0.000000e+00
%48 = add nsw i64 %29, 1
br label %49
49: ; preds = %35, %28
%50 = phi double [ undef, %28 ], [ %47, %35 ]
%51 = phi i64 [ %29, %28 ], [ %48, %35 ]
%52 = phi double [ 0.000000e+00, %28 ], [ %47, %35 ]
%53 = icmp eq i32 %32, %2
br i1 %53, label %90, label %54
54: ; preds = %49, %54
%55 = phi i64 [ %87, %54 ], [ %51, %49 ]
%56 = phi i32 [ %86, %54 ], [ %26, %49 ]
%57 = phi double [ %84, %54 ], [ %52, %49 ]
%58 = getelementptr inbounds i32, i32* %0, i64 %55
%59 = load i32, i32* %58
%60 = sitofp i32 %59 to double
%61 = getelementptr inbounds i32, i32* %1, i64 %55
%62 = load i32, i32* %61
%63 = sitofp i32 %62 to double
%64 = fmul double %21, %63
%65 = tail call double @llvm.fmuladd.f64(double %15, double %60, double %64)
%66 = fadd double %65, %25
%67 = fmul double %66, %66
%68 = fcmp ogt double %67, %57
%69 = select i1 %68, double %67, double %57
%70 = trunc i64 %55 to i32
%71 = select i1 %68, i32 %70, i32 %56
%72 = add nsw i64 %55, 1
%73 = getelementptr inbounds i32, i32* %0, i64 %72
%74 = load i32, i32* %73
%75 = sitofp i32 %74 to double
%76 = getelementptr inbounds i32, i32* %1, i64 %72
%77 = load i32, i32* %76
%78 = sitofp i32 %77 to double
%79 = fmul double %21, %78
%80 = tail call double @llvm.fmuladd.f64(double %15, double %75, double %79)
%81 = fadd double %80, %25
%82 = fmul double %81, %81
%83 = fcmp ogt double %82, %69
%84 = select i1 %83, double %82, double %69
%85 = trunc i64 %72 to i32
%86 = select i1 %83, i32 %85, i32 %71
%87 = add nsw i64 %55, 2
%88 = trunc i64 %87 to i32
%89 = icmp eq i32 %88, %3
br i1 %89, label %90, label %54
90: ; preds = %49, %54, %7
%91 = phi double [ 0.000000e+00, %7 ], [ %50, %49 ], [ %84, %54 ]
%92 = phi i32 [ undef, %7 ], [ %26, %49 ], [ %86, %54 ]
%93 = fmul double %21, %21
%94 = tail call double @llvm.fmuladd.f64(double %15, double %15, double %93)
%95 = fdiv double %91, %94
%96 = fcmp ogt double %95, %4
br i1 %96, label %97, label %110
97: ; preds = %90
%98 = tail call i32 @get_vertex(i32* %0, i32* %1, i32 %2, i32 %92, double %4, i32* %5, i32* %6)
%99 = icmp slt i32 %98, 0
br i1 %99, label %111, label %100
100: ; preds = %97
%101 = load i32, i32* %6
%102 = icmp sgt i32 %101, 5
br i1 %102, label %111, label %103
103: ; preds = %100
%104 = sext i32 %101 to i64
%105 = getelementptr inbounds i32, i32* %5, i64 %104
store i32 %92, i32* %105
%106 = load i32, i32* %6
%107 = add nsw i32 %106, 1
store i32 %107, i32* %6
%108 = tail call i32 @get_vertex(i32* %0, i32* %1, i32 %92, i32 %3, double %4, i32* %5, i32* %6)
%109 = icmp slt i32 %108, 0
br i1 %109, label %111, label %110
110: ; preds = %103, %90
br label %111
111: ; preds = %103, %100, %97, %110
%112 = phi i32 [ 0, %110 ], [ -1, %97 ], [ -1, %100 ], [ -1, %103 ]
ret i32 %112
}