extern void _get_delta_and_neighbour(double max_distance, double *distances,
                                     int *order, int npoints, double *delta,
                                     int *neighbour) {
  int i, j, o;
  double max_delta = 0.0;
  for (i = 0; i < npoints; ++i) {
    delta[order[i]] = max_distance;
    neighbour[i] = -1;
  }
  delta[order[0]] = -1.0;
  for (i = 1; i < npoints; ++i) {
    o = order[i] * npoints;
    for (j = 0; j < i; ++j) {
      if (distances[o + order[j]] < delta[order[i]]) {
        delta[order[i]] = distances[o + order[j]];
        neighbour[order[i]] = order[j];
      }
    }
    max_delta = (max_delta < delta[order[i]]) ? delta[order[i]] : max_delta;
  }
  delta[order[0]] = max_delta;
}


x86 assembly (clang, -O0):
<_get_delta_and_neighbour>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    116e <_get_delta_and_neighbour+0x6e>
movsd  -0x8(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x34(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
movl   $0xffffffff,(%rax,%rcx,4)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    112b <_get_delta_and_neighbour+0x2b>
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq (%rcx),%rcx
movsd  0xe7f(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x1,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    12bc <_get_delta_and_neighbour+0x1bc>
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
imul   -0x1c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    1257 <_get_delta_and_neighbour+0x157>
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mov    -0x18(%rbp),%rdx
movslq -0x38(%rbp),%rsi
add    (%rdx,%rsi,4),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x34(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    1244 <_get_delta_and_neighbour+0x144>
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
mov    -0x18(%rbp),%rdx
movslq -0x38(%rbp),%rsi
add    (%rdx,%rsi,4),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x34(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x30(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x34(%rbp),%rsi
movslq (%rcx,%rsi,4),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1249 <_get_delta_and_neighbour+0x149>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    11b2 <_get_delta_and_neighbour+0xb2>
movsd  -0x48(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x34(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    129a <_get_delta_and_neighbour+0x19a>
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq -0x34(%rbp),%rdx
movslq (%rcx,%rdx,4),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x50(%rbp)
jmp    12a4 <_get_delta_and_neighbour+0x1a4>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    118d <_get_delta_and_neighbour+0x8d>
movsd  -0x48(%rbp),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
movslq (%rcx),%rcx
movsd  %xmm0,(%rax,%rcx,8)
pop    %rbp
ret

x86 assembly (clang, -O2):
<_get_delta_and_neighbour>:
push   %rbp
push   %r14
push   %rbx
test   %edx,%edx
jle    1123 <_get_delta_and_neighbour+0x23>
mov    %edx,%r9d
lea    -0x1(%r9),%rax
mov    %r9d,%r10d
and    $0x3,%r10d
cmp    $0x3,%rax
jae    113d <_get_delta_and_neighbour+0x3d>
xor    %eax,%eax
jmp    11a3 <_get_delta_and_neighbour+0xa3>
movslq (%rsi),%rax
movabs $0xbff0000000000000,%rdx
mov    %rdx,(%rcx,%rax,8)
xorpd  %xmm1,%xmm1
jmp    1269 <_get_delta_and_neighbour+0x169>
mov    %r9d,%r11d
and    $0xfffffffc,%r11d
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
movslq (%rsi,%rax,4),%rbx
movsd  %xmm0,(%rcx,%rbx,8)
movl   $0xffffffff,(%r8,%rax,4)
ff
movslq 0x4(%rsi,%rax,4),%rbx
movsd  %xmm0,(%rcx,%rbx,8)
movl   $0xffffffff,0x4(%r8,%rax,4)
ff ff
movslq 0x8(%rsi,%rax,4),%rbx
movsd  %xmm0,(%rcx,%rbx,8)
movl   $0xffffffff,0x8(%r8,%rax,4)
ff ff
movslq 0xc(%rsi,%rax,4),%rbx
movsd  %xmm0,(%rcx,%rbx,8)
movl   $0xffffffff,0xc(%r8,%rax,4)
ff ff
add    $0x4,%rax
cmp    %rax,%r11
jne    1150 <_get_delta_and_neighbour+0x50>
test   %r10,%r10
je     11da <_get_delta_and_neighbour+0xda>
lea    (%r8,%rax,4),%r11
lea    (%rsi,%rax,4),%r14
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movslq (%r14,%rbx,4),%rax
movsd  %xmm0,(%rcx,%rax,8)
movl   $0xffffffff,(%r11,%rbx,4)
ff
add    $0x1,%rbx
cmp    %rbx,%r10
jne    11c0 <_get_delta_and_neighbour+0xc0>
movslq (%rsi),%rax
movabs $0xbff0000000000000,%rbx
mov    %rbx,(%rcx,%rax,8)
xorpd  %xmm1,%xmm1
cmp    $0x2,%edx
jl     1269 <_get_delta_and_neighbour+0x169>
xorpd  %xmm0,%xmm0
mov    $0x1,%r11d
jmp    1219 <_get_delta_and_neighbour+0x119>
movslq %ebx,%rax
movsd  (%rcx,%rax,8),%xmm1
maxsd  %xmm0,%xmm1
add    $0x1,%r11
movapd %xmm1,%xmm0
cmp    %r9,%r11
je     1266 <_get_delta_and_neighbour+0x166>
mov    (%rsi,%r11,4),%ebx
mov    %ebx,%r10d
imul   %edx,%r10d
xor    %eax,%eax
jmp    123d <_get_delta_and_neighbour+0x13d>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rax
mov    (%rsi,%r11,4),%ebx
cmp    %rax,%r11
je     1200 <_get_delta_and_neighbour+0x100>
mov    (%rsi,%rax,4),%r14d
lea    (%r14,%r10,1),%ebp
movslq %ebp,%rbp
movsd  (%rdi,%rbp,8),%xmm1
movslq %ebx,%rbx
movsd  (%rcx,%rbx,8),%xmm2
ucomisd %xmm1,%xmm2
jbe    1230 <_get_delta_and_neighbour+0x130>
movsd  %xmm1,(%rcx,%rbx,8)
mov    %r14d,(%r8,%rbx,4)
jmp    1230 <_get_delta_and_neighbour+0x130>
movslq (%rsi),%rax
movsd  %xmm1,(%rcx,%rax,8)
pop    %rbx
pop    %r14
pop    %rbp
ret

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

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