double dSump(double *pta, double l, double h, int n, char *what) {
  int i, cnt;
  double a, sum;
  sum = 0.0;
  cnt = 0;
  for (i = 0; i < n; i++) {
    a = *(pta + i);
    if ((a > l) & (a < h)) {
      sum += a;
    }
  }
  return sum;
}


x86 assembly (clang, -O0):
<dSump>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
mov    %esi,-0x1c(%rbp)
mov    %rdx,-0x28(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11a3 <dSump+0xa3>
mov    -0x8(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
seta   %al
and    $0x1,%al
movzbl %al,%eax
movsd  -0x38(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
seta   %cl
and    $0x1,%cl
movzbl %cl,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     1190 <dSump+0x90>
movsd  -0x38(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    1195 <dSump+0x95>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    112f <dSump+0x2f>
movsd  -0x40(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<dSump>:
test   %esi,%esi
jle    1116 <dSump+0x16>
mov    %esi,%eax
cmp    $0x1,%esi
jne    111a <dSump+0x1a>
xorpd  %xmm2,%xmm2
xor    %ecx,%ecx
jmp    11a8 <dSump+0xa8>
xorps  %xmm0,%xmm0
ret
mov    %eax,%edx
and    $0xfffffffe,%edx
xorpd  %xmm2,%xmm2
xor    %ecx,%ecx
movsd  0xed3(%rip),%xmm3
nopl   (%rax)
movsd  (%rdi,%rcx,8),%xmm4
movsd  0x8(%rdi,%rcx,8),%xmm5
movapd %xmm4,%xmm6
cmpltsd %xmm1,%xmm6
movapd %xmm6,%xmm7
andpd  %xmm4,%xmm7
andnpd %xmm3,%xmm6
orpd   %xmm7,%xmm6
movapd %xmm0,%xmm7
cmpltsd %xmm4,%xmm7
andpd  %xmm7,%xmm6
andnpd %xmm3,%xmm7
orpd   %xmm6,%xmm7
addsd  %xmm2,%xmm7
movapd %xmm5,%xmm4
cmpltsd %xmm1,%xmm4
movapd %xmm4,%xmm2
andpd  %xmm5,%xmm2
andnpd %xmm3,%xmm4
orpd   %xmm2,%xmm4
movapd %xmm0,%xmm2
cmpltsd %xmm5,%xmm2
andpd  %xmm2,%xmm4
andnpd %xmm3,%xmm2
orpd   %xmm4,%xmm2
addsd  %xmm7,%xmm2
add    $0x2,%rcx
cmp    %rcx,%rdx
jne    1130 <dSump+0x30>
test   $0x1,%al
je     11e7 <dSump+0xe7>
movsd  (%rdi,%rcx,8),%xmm3
movapd %xmm3,%xmm4
cmpltsd %xmm1,%xmm4
movapd %xmm4,%xmm1
andpd  %xmm3,%xmm1
movsd  0xe36(%rip),%xmm5
andnpd %xmm5,%xmm4
orpd   %xmm1,%xmm4
cmpltsd %xmm3,%xmm0
andpd  %xmm0,%xmm4
andnpd %xmm5,%xmm0
orpd   %xmm4,%xmm0
addsd  %xmm0,%xmm2
movapd %xmm2,%xmm0
ret

LLVM IR (-O0):
define double @dSump(double* %0, double %1, double %2, i32 %3, i8* %4) {
%6 = alloca double*
%7 = alloca double
%8 = alloca double
%9 = alloca i32
%10 = alloca i8*
%11 = alloca i32
%12 = alloca i32
%13 = alloca double
%14 = alloca double
store double* %0, double** %6
store double %1, double* %7
store double %2, double* %8
store i32 %3, i32* %9
store i8* %4, i8** %10
store double 0.000000e+00, double* %14
store i32 0, i32* %12
store i32 0, i32* %11
br label %15
15: ; preds = %40, %5
%16 = load i32, i32* %11
%17 = load i32, i32* %9
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %43
19: ; preds = %15
%20 = load double*, double** %6
%21 = load i32, i32* %11
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds double, double* %20, i64 %22
%24 = load double, double* %23
store double %24, double* %13
%25 = load double, double* %13
%26 = load double, double* %7
%27 = fcmp ogt double %25, %26
%28 = zext i1 %27 to i32
%29 = load double, double* %13
%30 = load double, double* %8
%31 = fcmp olt double %29, %30
%32 = zext i1 %31 to i32
%33 = and i32 %28, %32
%34 = icmp ne i32 %33, 0
br i1 %34, label %35, label %39
35: ; preds = %19
%36 = load double, double* %13
%37 = load double, double* %14
%38 = fadd double %37, %36
store double %38, double* %14
br label %39
39: ; preds = %35, %19
br label %40
40: ; preds = %39
%41 = load i32, i32* %11
%42 = add nsw i32 %41, 1
store i32 %42, i32* %11
br label %15
43: ; preds = %15
%44 = load double, double* %14
ret double %44
}

LLVM IR (-O2):
define double @dSump(double* nocapture %0, double %1, double %2, i32 %3, i8* nocapture readnone %4) {
%6 = icmp sgt i32 %3, 0
br i1 %6, label %7, label %48
7: ; preds = %5
%8 = zext i32 %3 to i64
%9 = and i64 %8, 1
%10 = icmp eq i32 %3, 1
br i1 %10, label %35, label %11
11: ; preds = %7
%12 = and i64 %8, 4294967294
br label %13
13: ; preds = %13, %11
%14 = phi i64 [ 0, %11 ], [ %32, %13 ]
%15 = phi double [ 0.000000e+00, %11 ], [ %31, %13 ]
%16 = phi i64 [ 0, %11 ], [ %33, %13 ]
%17 = getelementptr inbounds double, double* %0, i64 %14
%18 = load double, double* %17
%19 = fcmp ogt double %18, %1
%20 = fcmp olt double %18, %2
%21 = and i1 %19, %20
%22 = select i1 %21, double %18, double -0.000000e+00
%23 = fadd double %15, %22
%24 = or i64 %14, 1
%25 = getelementptr inbounds double, double* %0, i64 %24
%26 = load double, double* %25
%27 = fcmp ogt double %26, %1
%28 = fcmp olt double %26, %2
%29 = and i1 %27, %28
%30 = select i1 %29, double %26, double -0.000000e+00
%31 = fadd double %23, %30
%32 = add nuw nsw i64 %14, 2
%33 = add i64 %16, 2
%34 = icmp eq i64 %33, %12
br i1 %34, label %35, label %13
35: ; preds = %13, %7
%36 = phi double [ undef, %7 ], [ %31, %13 ]
%37 = phi i64 [ 0, %7 ], [ %32, %13 ]
%38 = phi double [ 0.000000e+00, %7 ], [ %31, %13 ]
%39 = icmp eq i64 %9, 0
br i1 %39, label %48, label %40
40: ; preds = %35
%41 = getelementptr inbounds double, double* %0, i64 %37
%42 = load double, double* %41
%43 = fcmp ogt double %42, %1
%44 = fcmp olt double %42, %2
%45 = and i1 %43, %44
%46 = select i1 %45, double %42, double -0.000000e+00
%47 = fadd double %38, %46
br label %48
48: ; preds = %40, %35, %5
%49 = phi double [ 0.000000e+00, %5 ], [ %36, %35 ], [ %47, %40 ]
ret double %49
}