void set_axis_mesh(double h, int n, double *x) {
  int i;
  for (i = 0; i <= n; i++) {
    x[i] = i * h;
  }
}


x86 assembly (clang, -O0):
<set_axis_mesh>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
mov    %rsi,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jg     1148 <set_axis_mesh+0x48>
cvtsi2sdl -0x1c(%rbp),%xmm0
mulsd  -0x8(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1117 <set_axis_mesh+0x17>
pop    %rbp
ret

x86 assembly (clang, -O2):
<set_axis_mesh>:
test   %edi,%edi
js     1219 <set_axis_mesh+0x119>
lea    0x1(%rdi),%eax
cmp    $0x3,%edi
jae    1117 <set_axis_mesh+0x17>
xor    %ecx,%ecx
jmp    1200 <set_axis_mesh+0x100>
mov    %eax,%ecx
and    $0xfffffffc,%ecx
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
lea    -0x4(%rcx),%rdx
mov    %rdx,%r8
shr    $0x2,%r8
add    $0x1,%r8
test   %rdx,%rdx
je     121a <set_axis_mesh+0x11a>
mov    %r8,%rdi
and    $0xfffffffffffffffe,%rdi
movdqa 0xeb5(%rip),%xmm4
xor    %edx,%edx
movdqa 0xeba(%rip),%xmm8
movdqa 0xec1(%rip),%xmm9
movdqa 0xec9(%rip),%xmm5
movdqa 0xed1(%rip),%xmm6
nop
movdqa %xmm4,%xmm7
cvtdq2pd %xmm4,%xmm3
paddd  %xmm8,%xmm7
cvtdq2pd %xmm7,%xmm7
mulpd  %xmm1,%xmm3
mulpd  %xmm1,%xmm7
movupd %xmm3,(%rsi,%rdx,8)
movdqa %xmm4,%xmm3
paddd  %xmm9,%xmm3
movdqa %xmm4,%xmm2
paddd  %xmm5,%xmm2
cvtdq2pd %xmm3,%xmm3
cvtdq2pd %xmm2,%xmm2
movupd %xmm7,0x10(%rsi,%rdx,8)
mulpd  %xmm1,%xmm3
mulpd  %xmm1,%xmm2
movupd %xmm3,0x20(%rsi,%rdx,8)
movupd %xmm2,0x30(%rsi,%rdx,8)
add    $0x8,%rdx
paddd  %xmm6,%xmm4
add    $0xfffffffffffffffe,%rdi
jne    1170 <set_axis_mesh+0x70>
test   $0x1,%r8b
je     11f8 <set_axis_mesh+0xf8>
cvtdq2pd %xmm4,%xmm2
paddd  0xe2f(%rip),%xmm4
cvtdq2pd %xmm4,%xmm3
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm3
movupd %xmm2,(%rsi,%rdx,8)
movupd %xmm3,0x10(%rsi,%rdx,8)
cmp    %rax,%rcx
je     1219 <set_axis_mesh+0x119>
nopl   (%rax)
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rsi,%rcx,8)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    1200 <set_axis_mesh+0x100>
ret
movdqa 0xdde(%rip),%xmm4
xor    %edx,%edx
test   $0x1,%r8b
jne    11d5 <set_axis_mesh+0xd5>
jmp    11f8 <set_axis_mesh+0xf8>

LLVM IR (-O0):
define void @set_axis_mesh(double %0, i32 %1, double* %2) {
%4 = alloca double
%5 = alloca i32
%6 = alloca double*
%7 = alloca i32
store double %0, double* %4
store i32 %1, i32* %5
store double* %2, double** %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 sle i32 %9, %10
br i1 %11, label %12, label %24
12: ; preds = %8
%13 = load i32, i32* %7
%14 = sitofp i32 %13 to double
%15 = load double, double* %4
%16 = fmul double %14, %15
%17 = load double*, double** %6
%18 = load i32, i32* %7
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds double, double* %17, i64 %19
store double %16, double* %20
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 @set_axis_mesh(double %0, i32 %1, double* nocapture writeonly %2) {
%4 = icmp slt i32 %1, 0
br i1 %4, label %76, label %5
5: ; preds = %3
%6 = add nuw i32 %1, 1
%7 = zext i32 %6 to i64
%8 = icmp ult i32 %1, 3
br i1 %8, label %66, label %9
9: ; preds = %5
%10 = and i64 %7, 4294967292
%11 = insertelement <2 x double> poison, double %0, i64 0
%12 = shufflevector <2 x double> %11, <2 x double> poison, <2 x i32> zeroinitializer
%13 = insertelement <2 x double> poison, double %0, i64 0
%14 = shufflevector <2 x double> %13, <2 x double> poison, <2 x i32> zeroinitializer
%15 = add nsw i64 %10, -4
%16 = lshr exact i64 %15, 2
%17 = add nuw nsw i64 %16, 1
%18 = and i64 %17, 1
%19 = icmp eq i64 %15, 0
br i1 %19, label %50, label %20
20: ; preds = %9
%21 = and i64 %17, 9223372036854775806
br label %22
22: ; preds = %22, %20
%23 = phi i64 [ 0, %20 ], [ %46, %22 ]
%24 = phi <2 x i32> [ <i32 0, i32 1>, %20 ], [ %47, %22 ]
%25 = phi i64 [ 0, %20 ], [ %48, %22 ]
%26 = add <2 x i32> %24, <i32 2, i32 2>
%27 = sitofp <2 x i32> %24 to <2 x double>
%28 = sitofp <2 x i32> %26 to <2 x double>
%29 = fmul <2 x double> %12, %27
%30 = fmul <2 x double> %14, %28
%31 = getelementptr inbounds double, double* %2, i64 %23
%32 = bitcast double* %31 to <2 x double>*
store <2 x double> %29, <2 x double>* %32
%33 = getelementptr inbounds double, double* %31, i64 2
%34 = bitcast double* %33 to <2 x double>*
store <2 x double> %30, <2 x double>* %34
%35 = or i64 %23, 4
%36 = add <2 x i32> %24, <i32 4, i32 4>
%37 = add <2 x i32> %24, <i32 6, i32 6>
%38 = sitofp <2 x i32> %36 to <2 x double>
%39 = sitofp <2 x i32> %37 to <2 x double>
%40 = fmul <2 x double> %12, %38
%41 = fmul <2 x double> %14, %39
%42 = getelementptr inbounds double, double* %2, i64 %35
%43 = bitcast double* %42 to <2 x double>*
store <2 x double> %40, <2 x double>* %43
%44 = getelementptr inbounds double, double* %42, i64 2
%45 = bitcast double* %44 to <2 x double>*
store <2 x double> %41, <2 x double>* %45
%46 = add nuw i64 %23, 8
%47 = add <2 x i32> %24, <i32 8, i32 8>
%48 = add i64 %25, 2
%49 = icmp eq i64 %48, %21
br i1 %49, label %50, label %22
50: ; preds = %22, %9
%51 = phi i64 [ 0, %9 ], [ %46, %22 ]
%52 = phi <2 x i32> [ <i32 0, i32 1>, %9 ], [ %47, %22 ]
%53 = icmp eq i64 %18, 0
br i1 %53, label %64, label %54
54: ; preds = %50
%55 = add <2 x i32> %52, <i32 2, i32 2>
%56 = sitofp <2 x i32> %52 to <2 x double>
%57 = sitofp <2 x i32> %55 to <2 x double>
%58 = fmul <2 x double> %12, %56
%59 = fmul <2 x double> %14, %57
%60 = getelementptr inbounds double, double* %2, i64 %51
%61 = bitcast double* %60 to <2 x double>*
store <2 x double> %58, <2 x double>* %61
%62 = getelementptr inbounds double, double* %60, i64 2
%63 = bitcast double* %62 to <2 x double>*
store <2 x double> %59, <2 x double>* %63
br label %64
64: ; preds = %50, %54
%65 = icmp eq i64 %10, %7
br i1 %65, label %76, label %66
66: ; preds = %5, %64
%67 = phi i64 [ 0, %5 ], [ %10, %64 ]
br label %68
68: ; preds = %66, %68
%69 = phi i64 [ %74, %68 ], [ %67, %66 ]
%70 = trunc i64 %69 to i32
%71 = sitofp i32 %70 to double
%72 = fmul double %71, %0
%73 = getelementptr inbounds double, double* %2, i64 %69
store double %72, double* %73
%74 = add nuw nsw i64 %69, 1
%75 = icmp eq i64 %74, %7
br i1 %75, label %76, label %68
76: ; preds = %68, %64, %3
ret void
}