double Dvalue(double data[], int size) {
  int i;
  double max, min;
  if (size < 1)
    return 0;
  if (data[0] > data[1]) {
    max = data[0];
    min = data[1];
  } else {
    min = data[0];
    max = data[1];
  }
  for (i = 2; i + 1 < size; i += 2) {
    if (data[i] > data[i + 1]) {
      if (data[i] > max)
        max = data[i];
      if (data[i + 1] < min)
        min = data[i + 1];
    } else {
      if (data[i + 1] > max)
        max = data[i + 1];
      if (data[i] < min)
        min = data[i];
    }
  }
  if ((i + 1 == size) && (data[i] > max))
    max = data[i];
  if ((i + 1 == size) && (data[i] < min))
    min = data[i];
  return (max - min);
}


x86 assembly (clang, -O0):
<Dvalue>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpl   $0x1,-0x14(%rbp)
jge    1122 <Dvalue+0x22>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1315 <Dvalue+0x215>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
ucomisd 0x8(%rax),%xmm0
jbe    1159 <Dvalue+0x59>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    1174 <Dvalue+0x74>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x2,-0x18(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
cmp    -0x14(%rbp),%eax
jge    1290 <Dvalue+0x190>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    1216 <Dvalue+0x116>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    11d9 <Dvalue+0xd9>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1211 <Dvalue+0x111>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    127d <Dvalue+0x17d>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    124a <Dvalue+0x14a>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1278 <Dvalue+0x178>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    127d <Dvalue+0x17d>
jmp    1282 <Dvalue+0x182>
mov    -0x18(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x18(%rbp)
jmp    117b <Dvalue+0x7b>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
cmp    -0x14(%rbp),%eax
jne    12c9 <Dvalue+0x1c9>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    12c9 <Dvalue+0x1c9>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
cmp    -0x14(%rbp),%eax
jne    1306 <Dvalue+0x206>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1306 <Dvalue+0x206>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x20(%rbp),%xmm0
subsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<Dvalue>:
test   %esi,%esi
jle    1174 <Dvalue+0x74>
movsd  (%rdi),%xmm0
movsd  0x8(%rdi),%xmm1
movapd %xmm0,%xmm2
maxsd  %xmm1,%xmm2
minsd  %xmm0,%xmm1
cmp    $0x4,%esi
jb     1178 <Dvalue+0x78>
mov    %esi,%ecx
mov    $0x3,%eax
jmp    1139 <Dvalue+0x39>
nopw   0x0(%rax,%rax,1)
add    $0x2,%rax
cmp    %rcx,%rax
jae    118c <Dvalue+0x8c>
movsd  -0x8(%rdi,%rax,8),%xmm0
movsd  (%rdi,%rax,8),%xmm3
ucomisd %xmm3,%xmm0
jbe    1160 <Dvalue+0x60>
maxsd  %xmm2,%xmm0
movapd %xmm0,%xmm2
ucomisd %xmm3,%xmm1
jbe    1130 <Dvalue+0x30>
movapd %xmm3,%xmm1
jmp    1130 <Dvalue+0x30>
xchg   %ax,%ax
maxsd  %xmm2,%xmm3
movapd %xmm3,%xmm2
ucomisd %xmm0,%xmm1
jbe    1130 <Dvalue+0x30>
movapd %xmm0,%xmm1
jmp    1130 <Dvalue+0x30>
xorps  %xmm0,%xmm0
ret
mov    $0x3,%eax
mov    $0x2,%ecx
cmp    %esi,%eax
je     1194 <Dvalue+0x94>
movapd %xmm2,%xmm0
jmp    11a7 <Dvalue+0xa7>
lea    -0x1(%rax),%rcx
cmp    %esi,%eax
jne    1186 <Dvalue+0x86>
movsd  (%rdi,%rcx,8),%xmm3
movapd %xmm3,%xmm0
maxsd  %xmm2,%xmm0
ucomisd %xmm3,%xmm1
ja     11ab <Dvalue+0xab>
movapd %xmm1,%xmm3
subsd  %xmm3,%xmm0
ret

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

LLVM IR (-O2):
define double @Dvalue(double* nocapture %0, i32 %1) {
%3 = icmp slt i32 %1, 1
br i1 %3, label %61, label %4
4: ; preds = %2
%5 = load double, double* %0
%6 = getelementptr inbounds double, double* %0, i64 1
%7 = load double, double* %6
%8 = fcmp ogt double %5, %7
%9 = select i1 %8, double %5, double %7
%10 = select i1 %8, double %7, double %5
%11 = icmp ugt i32 %1, 3
br i1 %11, label %12, label %44
12: ; preds = %4
%13 = zext i32 %1 to i64
br label %14
14: ; preds = %12, %34
%15 = phi i64 [ 2, %12 ], [ %37, %34 ]
%16 = phi i64 [ 3, %12 ], [ %39, %34 ]
%17 = phi double [ %10, %12 ], [ %36, %34 ]
%18 = phi double [ %9, %12 ], [ %35, %34 ]
%19 = getelementptr inbounds double, double* %0, i64 %15
%20 = load double, double* %19
%21 = getelementptr inbounds double, double* %0, i64 %16
%22 = load double, double* %21
%23 = fcmp ogt double %20, %22
br i1 %23, label %24, label %29
24: ; preds = %14
%25 = fcmp ogt double %20, %18
%26 = select i1 %25, double %20, double %18
%27 = fcmp olt double %22, %17
br i1 %27, label %28, label %34
28: ; preds = %24
br label %34
29: ; preds = %14
%30 = fcmp ogt double %22, %18
%31 = select i1 %30, double %22, double %18
%32 = fcmp olt double %20, %17
br i1 %32, label %33, label %34
33: ; preds = %29
br label %34
34: ; preds = %28, %24, %33, %29
%35 = phi double [ %26, %28 ], [ %26, %24 ], [ %31, %33 ], [ %31, %29 ]
%36 = phi double [ %22, %28 ], [ %17, %24 ], [ %20, %33 ], [ %17, %29 ]
%37 = add nuw nsw i64 %15, 2
%38 = or i64 %37, 1
%39 = add nuw nsw i64 %16, 2
%40 = icmp ult i64 %38, %13
br i1 %40, label %14, label %41
41: ; preds = %34
%42 = trunc i64 %38 to i32
%43 = and i64 %37, 4294967294
br label %44
44: ; preds = %41, %4
%45 = phi i64 [ 2, %4 ], [ %43, %41 ]
%46 = phi double [ %9, %4 ], [ %35, %41 ]
%47 = phi double [ %10, %4 ], [ %36, %41 ]
%48 = phi i32 [ 3, %4 ], [ %42, %41 ]
%49 = icmp eq i32 %48, %1
br i1 %49, label %50, label %57
50: ; preds = %44
%51 = getelementptr inbounds double, double* %0, i64 %45
%52 = load double, double* %51
%53 = fcmp ogt double %52, %46
%54 = select i1 %53, double %52, double %46
%55 = fcmp olt double %52, %47
br i1 %55, label %56, label %57
56: ; preds = %50
br label %57
57: ; preds = %44, %56, %50
%58 = phi double [ %54, %56 ], [ %54, %50 ], [ %46, %44 ]
%59 = phi double [ %52, %56 ], [ %47, %50 ], [ %47, %44 ]
%60 = fsub double %58, %59
br label %61
61: ; preds = %2, %57
%62 = phi double [ %60, %57 ], [ 0.000000e+00, %2 ]
ret double %62
}