void update_m(double *beta, int n, int nb) {
  int i;
  for (i = 0; i < n; i++)
    beta[i] /= nb;
}


x86 assembly (clang, -O0):
<update_m>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    114a <update_m+0x4a>
cvtsi2sdl -0x10(%rbp),%xmm1
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1115 <update_m+0x15>
pop    %rbp
ret

x86 assembly (clang, -O2):
<update_m>:
test   %esi,%esi
jle    11a7 <update_m+0xa7>
cvtsi2sd %edx,%xmm0
mov    %esi,%eax
cmp    $0x1,%esi
jne    1117 <update_m+0x17>
xor    %ecx,%ecx
jmp    1190 <update_m+0x90>
mov    %eax,%ecx
and    $0xfffffffe,%ecx
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x2(%rcx),%rdx
mov    %rdx,%r8
shr    %r8
add    $0x1,%r8
test   %rdx,%rdx
je     11a8 <update_m+0xa8>
mov    %r8,%rdx
and    $0xfffffffffffffffe,%rdx
xor    %esi,%esi
movupd (%rdi,%rsi,8),%xmm2
movupd 0x10(%rdi,%rsi,8),%xmm3
divpd  %xmm1,%xmm2
movupd %xmm2,(%rdi,%rsi,8)
divpd  %xmm1,%xmm3
movupd %xmm3,0x10(%rdi,%rsi,8)
add    $0x4,%rsi
add    $0xfffffffffffffffe,%rdx
jne    1140 <update_m+0x40>
test   $0x1,%r8b
je     117c <update_m+0x7c>
movupd (%rdi,%rsi,8),%xmm2
divpd  %xmm1,%xmm2
movupd %xmm2,(%rdi,%rsi,8)
cmp    %rax,%rcx
je     11a7 <update_m+0xa7>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  (%rdi,%rcx,8),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,(%rdi,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1190 <update_m+0x90>
ret
xor    %esi,%esi
test   $0x1,%r8b
jne    116e <update_m+0x6e>
jmp    117c <update_m+0x7c>

LLVM IR (-O0):
define void @update_m(double* %0, i32 %1, i32 %2) {
%4 = alloca double*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store double* %0, double** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
store i32 0, i32* %7
br label %8
8: ; preds = %21, %3
%9 = load i32, i32* %7
%10 = load i32, i32* %5
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %24
12: ; preds = %8
%13 = load i32, i32* %6
%14 = sitofp i32 %13 to double
%15 = load double*, double** %4
%16 = load i32, i32* %7
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds double, double* %15, i64 %17
%19 = load double, double* %18
%20 = fdiv double %19, %14
store double %20, double* %18
br label %21
21: ; preds = %12
%22 = load i32, i32* %7
%23 = add nsw i32 %22, 1
store i32 %23, i32* %7
br label %8
24: ; preds = %8
ret void
}

LLVM IR (-O2):
define void @update_m(double* nocapture %0, i32 %1, i32 %2) {
%4 = icmp sgt i32 %1, 0
br i1 %4, label %5, label %57
5: ; preds = %3
%6 = sitofp i32 %2 to double
%7 = zext i32 %1 to i64
%8 = icmp eq i32 %1, 1
br i1 %8, label %48, label %9
9: ; preds = %5
%10 = and i64 %7, 4294967294
%11 = insertelement <2 x double> poison, double %6, i64 0
%12 = shufflevector <2 x double> %11, <2 x double> poison, <2 x i32> zeroinitializer
%13 = add nsw i64 %10, -2
%14 = lshr exact i64 %13, 1
%15 = add nuw i64 %14, 1
%16 = and i64 %15, 1
%17 = icmp eq i64 %13, 0
br i1 %17, label %37, label %18
18: ; preds = %9
%19 = and i64 %15, -2
br label %20
20: ; preds = %20, %18
%21 = phi i64 [ 0, %18 ], [ %34, %20 ]
%22 = phi i64 [ 0, %18 ], [ %35, %20 ]
%23 = getelementptr inbounds double, double* %0, i64 %21
%24 = bitcast double* %23 to <2 x double>*
%25 = load <2 x double>, <2 x double>* %24
%26 = fdiv <2 x double> %25, %12
%27 = bitcast double* %23 to <2 x double>*
store <2 x double> %26, <2 x double>* %27
%28 = or i64 %21, 2
%29 = getelementptr inbounds double, double* %0, i64 %28
%30 = bitcast double* %29 to <2 x double>*
%31 = load <2 x double>, <2 x double>* %30
%32 = fdiv <2 x double> %31, %12
%33 = bitcast double* %29 to <2 x double>*
store <2 x double> %32, <2 x double>* %33
%34 = add nuw i64 %21, 4
%35 = add nuw i64 %22, 2
%36 = icmp eq i64 %35, %19
br i1 %36, label %37, label %20
37: ; preds = %20, %9
%38 = phi i64 [ 0, %9 ], [ %34, %20 ]
%39 = icmp eq i64 %16, 0
br i1 %39, label %46, label %40
40: ; preds = %37
%41 = getelementptr inbounds double, double* %0, i64 %38
%42 = bitcast double* %41 to <2 x double>*
%43 = load <2 x double>, <2 x double>* %42
%44 = fdiv <2 x double> %43, %12
%45 = bitcast double* %41 to <2 x double>*
store <2 x double> %44, <2 x double>* %45
br label %46
46: ; preds = %37, %40
%47 = icmp eq i64 %10, %7
br i1 %47, label %57, label %48
48: ; preds = %5, %46
%49 = phi i64 [ 0, %5 ], [ %10, %46 ]
br label %50
50: ; preds = %48, %50
%51 = phi i64 [ %55, %50 ], [ %49, %48 ]
%52 = getelementptr inbounds double, double* %0, i64 %51
%53 = load double, double* %52
%54 = fdiv double %53, %6
store double %54, double* %52
%55 = add nuw nsw i64 %51, 1
%56 = icmp eq i64 %55, %7
br i1 %56, label %57, label %50
57: ; preds = %50, %46, %3
ret void
}