void orthog1(double *x, int beg, int end) {
  int i;
  double *pntr;
  double sum;
  int len;
  len = end - beg + 1;
  sum = 0.0;
  pntr = x + beg;
  for (i = len; i; i--) {
    sum += *pntr++;
  }
  sum /= len;
  pntr = x + beg;
  for (i = len; i; i--) {
    *pntr++ -= sum;
  }
}


x86 assembly (clang, -O0):
<orthog1>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sub    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     1170 <orthog1+0x70>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm0
addsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    113b <orthog1+0x3b>
cvtsi2sdl -0x2c(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     11d4 <orthog1+0xd4>
movsd  -0x28(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x20(%rbp)
movsd  (%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    119c <orthog1+0x9c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<orthog1>:
push   %rbx
sub    %esi,%edx
mov    %edx,%r10d
inc    %r10d
je     1286 <orthog1+0x186>
movslq %esi,%r8
lea    (%rdi,%r8,8),%rbx
mov    %r10d,%eax
and    $0x7,%eax
je     114b <orthog1+0x4b>
xor    %ecx,%ecx
xorpd  %xmm0,%xmm0
mov    %rbx,%rsi
nopw   0x0(%rax,%rax,1)
addsd  (%rsi),%xmm0
add    $0x8,%rsi
add    $0x1,%ecx
cmp    %ecx,%eax
jne    1130 <orthog1+0x30>
mov    %r10d,%eax
sub    %ecx,%eax
cmp    $0x7,%edx
jae    115a <orthog1+0x5a>
jmp    1197 <orthog1+0x97>
xorpd  %xmm0,%xmm0
mov    %r10d,%eax
mov    %rbx,%rsi
cmp    $0x7,%edx
jb     1197 <orthog1+0x97>
mov    %eax,%ecx
xor    %eax,%eax
xchg   %ax,%ax
addsd  (%rsi,%rax,8),%xmm0
addsd  0x8(%rsi,%rax,8),%xmm0
addsd  0x10(%rsi,%rax,8),%xmm0
addsd  0x18(%rsi,%rax,8),%xmm0
addsd  0x20(%rsi,%rax,8),%xmm0
addsd  0x28(%rsi,%rax,8),%xmm0
addsd  0x30(%rsi,%rax,8),%xmm0
addsd  0x38(%rsi,%rax,8),%xmm0
add    $0x8,%rax
cmp    %eax,%ecx
jne    1160 <orthog1+0x60>
test   %r10d,%r10d
je     1286 <orthog1+0x186>
cvtsi2sd %r10d,%xmm1
divsd  %xmm1,%xmm0
cmp    $0x3,%edx
jb     1268 <orthog1+0x168>
add    $0x1,%rdx
mov    %rdx,%r9
and    $0xfffffffffffffffc,%r9
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x4(%r9),%rax
mov    %rax,%r11
shr    $0x2,%r11
add    $0x1,%r11
test   %rax,%rax
je     1288 <orthog1+0x188>
mov    %r11,%rcx
and    $0xfffffffffffffffe,%rcx
lea    (%rdi,%r8,8),%rsi
add    $0x30,%rsi
xor    %edi,%edi
xchg   %ax,%ax
movupd -0x30(%rsi,%rdi,8),%xmm2
movupd -0x20(%rsi,%rdi,8),%xmm3
movupd -0x10(%rsi,%rdi,8),%xmm4
movupd (%rsi,%rdi,8),%xmm5
subpd  %xmm1,%xmm2
subpd  %xmm1,%xmm3
movupd %xmm2,-0x30(%rsi,%rdi,8)
movupd %xmm3,-0x20(%rsi,%rdi,8)
subpd  %xmm1,%xmm4
subpd  %xmm1,%xmm5
movupd %xmm4,-0x10(%rsi,%rdi,8)
movupd %xmm5,(%rsi,%rdi,8)
add    $0x8,%rdi
add    $0xfffffffffffffffe,%rcx
jne    11f0 <orthog1+0xf0>
test   $0x1,%r11b
je     125c <orthog1+0x15c>
movupd (%rbx,%rdi,8),%xmm2
movupd 0x10(%rbx,%rdi,8),%xmm3
subpd  %xmm1,%xmm2
subpd  %xmm1,%xmm3
movupd %xmm2,(%rbx,%rdi,8)
movupd %xmm3,0x10(%rbx,%rdi,8)
cmp    %r9,%rdx
je     1286 <orthog1+0x186>
sub    %r9d,%r10d
lea    (%rbx,%r9,8),%rbx
mov    %r10d,%eax
xor    %ecx,%ecx
nopl   (%rax)
movsd  (%rbx,%rcx,8),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,(%rbx,%rcx,8)
add    $0x1,%rcx
cmp    %ecx,%eax
jne    1270 <orthog1+0x170>
pop    %rbx
ret
xor    %edi,%edi
test   $0x1,%r11b
jne    123e <orthog1+0x13e>
jmp    125c <orthog1+0x15c>

LLVM IR (-O0):
define void @orthog1(double* %0, i32 %1, i32 %2) {
%4 = alloca double*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca double*
%9 = alloca double
%10 = alloca i32
store double* %0, double** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%11 = load i32, i32* %6
%12 = load i32, i32* %5
%13 = sub nsw i32 %11, %12
%14 = add nsw i32 %13, 1
store i32 %14, i32* %10
store double 0.000000e+00, double* %9
%15 = load double*, double** %4
%16 = load i32, i32* %5
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds double, double* %15, i64 %17
store double* %18, double** %8
%19 = load i32, i32* %10
store i32 %19, i32* %7
br label %20
20: ; preds = %29, %3
%21 = load i32, i32* %7
%22 = icmp ne i32 %21, 0
br i1 %22, label %23, label %32
23: ; preds = %20
%24 = load double*, double** %8
%25 = getelementptr inbounds double, double* %24, i32 1
store double* %25, double** %8
%26 = load double, double* %24
%27 = load double, double* %9
%28 = fadd double %27, %26
store double %28, double* %9
br label %29
29: ; preds = %23
%30 = load i32, i32* %7
%31 = add nsw i32 %30, -1
store i32 %31, i32* %7
br label %20
32: ; preds = %20
%33 = load i32, i32* %10
%34 = sitofp i32 %33 to double
%35 = load double, double* %9
%36 = fdiv double %35, %34
store double %36, double* %9
%37 = load double*, double** %4
%38 = load i32, i32* %5
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds double, double* %37, i64 %39
store double* %40, double** %8
%41 = load i32, i32* %10
store i32 %41, i32* %7
br label %42
42: ; preds = %51, %32
%43 = load i32, i32* %7
%44 = icmp ne i32 %43, 0
br i1 %44, label %45, label %54
45: ; preds = %42
%46 = load double, double* %9
%47 = load double*, double** %8
%48 = getelementptr inbounds double, double* %47, i32 1
store double* %48, double** %8
%49 = load double, double* %47
%50 = fsub double %49, %46
store double %50, double* %47
br label %51
51: ; preds = %45
%52 = load i32, i32* %7
%53 = add nsw i32 %52, -1
store i32 %53, i32* %7
br label %42
54: ; preds = %42
ret void
}

LLVM IR (-O2):
define void @orthog1(double* nocapture %0, i32 %1, i32 %2) {
%4 = sub nsw i32 %2, %1
%5 = add i32 %4, 1
%6 = sext i32 %1 to i64
%7 = getelementptr inbounds double, double* %0, i64 %6
%8 = icmp eq i32 %5, 0
br i1 %8, label %139, label %9
9: ; preds = %3
%10 = sub i32 %2, %1
%11 = and i32 %5, 7
%12 = icmp eq i32 %11, 0
br i1 %12, label %24, label %13
13: ; preds = %9, %13
%14 = phi i32 [ %21, %13 ], [ %5, %9 ]
%15 = phi double [ %20, %13 ], [ 0.000000e+00, %9 ]
%16 = phi double* [ %18, %13 ], [ %7, %9 ]
%17 = phi i32 [ %22, %13 ], [ 0, %9 ]
%18 = getelementptr inbounds double, double* %16, i64 1
%19 = load double, double* %16
%20 = fadd double %15, %19
%21 = add nsw i32 %14, -1
%22 = add i32 %17, 1
%23 = icmp eq i32 %22, %11
br i1 %23, label %24, label %13
24: ; preds = %13, %9
%25 = phi double [ undef, %9 ], [ %20, %13 ]
%26 = phi i32 [ %5, %9 ], [ %21, %13 ]
%27 = phi double [ 0.000000e+00, %9 ], [ %20, %13 ]
%28 = phi double* [ %7, %9 ], [ %18, %13 ]
%29 = icmp ult i32 %10, 7
br i1 %29, label %60, label %30
30: ; preds = %24, %30
%31 = phi i32 [ %58, %30 ], [ %26, %24 ]
%32 = phi double [ %57, %30 ], [ %27, %24 ]
%33 = phi double* [ %55, %30 ], [ %28, %24 ]
%34 = getelementptr inbounds double, double* %33, i64 1
%35 = load double, double* %33
%36 = fadd double %32, %35
%37 = getelementptr inbounds double, double* %33, i64 2
%38 = load double, double* %34
%39 = fadd double %36, %38
%40 = getelementptr inbounds double, double* %33, i64 3
%41 = load double, double* %37
%42 = fadd double %39, %41
%43 = getelementptr inbounds double, double* %33, i64 4
%44 = load double, double* %40
%45 = fadd double %42, %44
%46 = getelementptr inbounds double, double* %33, i64 5
%47 = load double, double* %43
%48 = fadd double %45, %47
%49 = getelementptr inbounds double, double* %33, i64 6
%50 = load double, double* %46
%51 = fadd double %48, %50
%52 = getelementptr inbounds double, double* %33, i64 7
%53 = load double, double* %49
%54 = fadd double %51, %53
%55 = getelementptr inbounds double, double* %33, i64 8
%56 = load double, double* %52
%57 = fadd double %54, %56
%58 = add nsw i32 %31, -8
%59 = icmp eq i32 %58, 0
br i1 %59, label %60, label %30
60: ; preds = %30, %24
%61 = phi double [ %25, %24 ], [ %57, %30 ]
%62 = sitofp i32 %5 to double
%63 = fdiv double %61, %62
br i1 %8, label %139, label %64
64: ; preds = %60
%65 = sub i32 %2, %1
%66 = zext i32 %65 to i64
%67 = add nuw nsw i64 %66, 1
%68 = icmp ult i32 %65, 3
br i1 %68, label %128, label %69
69: ; preds = %64
%70 = and i64 %67, 8589934588
%71 = trunc i64 %70 to i32
%72 = sub i32 %5, %71
%73 = getelementptr double, double* %7, i64 %70
%74 = insertelement <2 x double> poison, double %63, i64 0
%75 = shufflevector <2 x double> %74, <2 x double> poison, <2 x i32> zeroinitializer
%76 = insertelement <2 x double> poison, double %63, i64 0
%77 = shufflevector <2 x double> %76, <2 x double> poison, <2 x i32> zeroinitializer
%78 = add nsw i64 %70, -4
%79 = lshr exact i64 %78, 2
%80 = add nuw nsw i64 %79, 1
%81 = and i64 %80, 1
%82 = icmp eq i64 %78, 0
br i1 %82, label %112, label %83
83: ; preds = %69
%84 = and i64 %80, 9223372036854775806
br label %85
85: ; preds = %85, %83
%86 = phi i64 [ 0, %83 ], [ %109, %85 ]
%87 = phi i64 [ 0, %83 ], [ %110, %85 ]
%88 = getelementptr double, double* %7, i64 %86
%89 = bitcast double* %88 to <2 x double>*
%90 = load <2 x double>, <2 x double>* %89
%91 = getelementptr double, double* %88, i64 2
%92 = bitcast double* %91 to <2 x double>*
%93 = load <2 x double>, <2 x double>* %92
%94 = fsub <2 x double> %90, %75
%95 = fsub <2 x double> %93, %77
%96 = bitcast double* %88 to <2 x double>*
store <2 x double> %94, <2 x double>* %96
%97 = bitcast double* %91 to <2 x double>*
store <2 x double> %95, <2 x double>* %97
%98 = or i64 %86, 4
%99 = getelementptr double, double* %7, i64 %98
%100 = bitcast double* %99 to <2 x double>*
%101 = load <2 x double>, <2 x double>* %100
%102 = getelementptr double, double* %99, i64 2
%103 = bitcast double* %102 to <2 x double>*
%104 = load <2 x double>, <2 x double>* %103
%105 = fsub <2 x double> %101, %75
%106 = fsub <2 x double> %104, %77
%107 = bitcast double* %99 to <2 x double>*
store <2 x double> %105, <2 x double>* %107
%108 = bitcast double* %102 to <2 x double>*
store <2 x double> %106, <2 x double>* %108
%109 = add nuw i64 %86, 8
%110 = add i64 %87, 2
%111 = icmp eq i64 %110, %84
br i1 %111, label %112, label %85
112: ; preds = %85, %69
%113 = phi i64 [ 0, %69 ], [ %109, %85 ]
%114 = icmp eq i64 %81, 0
br i1 %114, label %126, label %115
115: ; preds = %112
%116 = getelementptr double, double* %7, i64 %113
%117 = bitcast double* %116 to <2 x double>*
%118 = load <2 x double>, <2 x double>* %117
%119 = getelementptr double, double* %116, i64 2
%120 = bitcast double* %119 to <2 x double>*
%121 = load <2 x double>, <2 x double>* %120
%122 = fsub <2 x double> %118, %75
%123 = fsub <2 x double> %121, %77
%124 = bitcast double* %116 to <2 x double>*
store <2 x double> %122, <2 x double>* %124
%125 = bitcast double* %119 to <2 x double>*
store <2 x double> %123, <2 x double>* %125
br label %126
126: ; preds = %112, %115
%127 = icmp eq i64 %67, %70
br i1 %127, label %139, label %128
128: ; preds = %64, %126
%129 = phi i32 [ %5, %64 ], [ %72, %126 ]
%130 = phi double* [ %7, %64 ], [ %73, %126 ]
br label %131
131: ; preds = %128, %131
%132 = phi i32 [ %137, %131 ], [ %129, %128 ]
%133 = phi double* [ %134, %131 ], [ %130, %128 ]
%134 = getelementptr inbounds double, double* %133, i64 1
%135 = load double, double* %133
%136 = fsub double %135, %63
store double %136, double* %133
%137 = add nsw i32 %132, -1
%138 = icmp eq i32 %137, 0
br i1 %138, label %139, label %131
139: ; preds = %131, %126, %3, %60
ret void
}