__attribute__((no)) void naive_vjacobi_1d(double *dst, double *src, int n) {
  int i;
  for (i = 0; i < n; i++)
    dst[i] = 0.5 * (src[i - 1] + src[i + 1]);
}


x86 assembly (clang, -O0):
<naive_vjacobi_1d>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    116d <naive_vjacobi_1d+0x6d>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm1
movsd  0xeb2(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1116 <naive_vjacobi_1d+0x16>
pop    %rbp
ret

x86 assembly (clang, -O2):
<naive_vjacobi_1d>:
test   %edx,%edx
jle    12aa <naive_vjacobi_1d+0x1aa>
mov    %edx,%r9d
cmp    $0x4,%edx
jb     1132 <naive_vjacobi_1d+0x32>
lea    (%rsi,%r9,8),%rax
add    $0x8,%rax
cmp    %rdi,%rax
jbe    11bb <naive_vjacobi_1d+0xbb>
lea    (%rdi,%r9,8),%rax
lea    -0x8(%rsi),%rcx
cmp    %rax,%rcx
jae    11bb <naive_vjacobi_1d+0xbb>
xor    %ecx,%ecx
mov    %rcx,%rax
not    %rax
test   $0x1,%r9b
je     1162 <naive_vjacobi_1d+0x62>
movsd  -0x8(%rsi,%rcx,8),%xmm0
mov    %rcx,%rdx
or     $0x1,%rdx
addsd  (%rsi,%rdx,8),%xmm0
mulsd  0xeb6(%rip),%xmm0
movsd  %xmm0,(%rdi,%rcx,8)
mov    %rdx,%rcx
add    %r9,%rax
je     12aa <naive_vjacobi_1d+0x1aa>
movsd  0xe9d(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  -0x8(%rsi,%rcx,8),%xmm1
addsd  0x8(%rsi,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%rdi,%rcx,8)
movsd  (%rsi,%rcx,8),%xmm1
addsd  0x10(%rsi,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%rdi,%rcx,8)
lea    0x2(%rcx),%rax
mov    %rax,%rcx
cmp    %rax,%r9
jne    1180 <naive_vjacobi_1d+0x80>
jmp    12aa <naive_vjacobi_1d+0x1aa>
mov    %r9d,%ecx
and    $0xfffffffc,%ecx
lea    -0x4(%rcx),%rax
mov    %rax,%r8
shr    $0x2,%r8
add    $0x1,%r8
test   %rax,%rax
je     12ab <naive_vjacobi_1d+0x1ab>
mov    %r8,%rax
and    $0xfffffffffffffffe,%rax
xor    %edx,%edx
movapd 0xe16(%rip),%xmm0
nopw   0x0(%rax,%rax,1)
movupd -0x8(%rsi,%rdx,8),%xmm1
movupd 0x8(%rsi,%rdx,8),%xmm2
movupd 0x18(%rsi,%rdx,8),%xmm3
addpd  %xmm2,%xmm1
addpd  %xmm2,%xmm3
mulpd  %xmm0,%xmm1
mulpd  %xmm0,%xmm3
movupd %xmm1,(%rdi,%rdx,8)
movupd %xmm3,0x10(%rdi,%rdx,8)
movupd 0x18(%rsi,%rdx,8),%xmm1
movupd 0x28(%rsi,%rdx,8),%xmm2
movupd 0x38(%rsi,%rdx,8),%xmm3
addpd  %xmm2,%xmm1
addpd  %xmm2,%xmm3
mulpd  %xmm0,%xmm1
mulpd  %xmm0,%xmm3
movupd %xmm1,0x20(%rdi,%rdx,8)
movupd %xmm3,0x30(%rdi,%rdx,8)
add    $0x8,%rdx
add    $0xfffffffffffffffe,%rax
jne    11f0 <naive_vjacobi_1d+0xf0>
test   $0x1,%r8b
je     12a1 <naive_vjacobi_1d+0x1a1>
movupd -0x8(%rsi,%rdx,8),%xmm0
movupd 0x8(%rsi,%rdx,8),%xmm1
lea    0x0(,%rdx,8),%rax
or     $0x8,%rax
movupd (%rsi,%rax,1),%xmm2
addpd  %xmm0,%xmm2
movupd 0x10(%rsi,%rax,1),%xmm0
addpd  %xmm1,%xmm0
movapd 0xd72(%rip),%xmm1
mulpd  %xmm1,%xmm2
mulpd  %xmm1,%xmm0
movupd %xmm2,(%rdi,%rdx,8)
movupd %xmm0,0x10(%rdi,%rdx,8)
cmp    %r9,%rcx
jne    1134 <naive_vjacobi_1d+0x34>
ret
xor    %edx,%edx
test   $0x1,%r8b
jne    125b <naive_vjacobi_1d+0x15b>
jmp    12a1 <naive_vjacobi_1d+0x1a1>

LLVM IR (-O0):
define void @naive_vjacobi_1d(double* %0, double* %1, i32 %2) {
%4 = alloca double*
%5 = alloca double*
%6 = alloca i32
%7 = alloca i32
store double* %0, double** %4
store double* %1, double** %5
store i32 %2, i32* %6
store i32 0, i32* %7
br label %8
8: ; preds = %31, %3
%9 = load i32, i32* %7
%10 = load i32, i32* %6
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %34
12: ; preds = %8
%13 = load double*, double** %5
%14 = load i32, i32* %7
%15 = sub nsw i32 %14, 1
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds double, double* %13, i64 %16
%18 = load double, double* %17
%19 = load double*, double** %5
%20 = load i32, i32* %7
%21 = add nsw i32 %20, 1
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds double, double* %19, i64 %22
%24 = load double, double* %23
%25 = fadd double %18, %24
%26 = fmul double 5.000000e-01, %25
%27 = load double*, double** %4
%28 = load i32, i32* %7
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds double, double* %27, i64 %29
store double %26, double* %30
br label %31
31: ; preds = %12
%32 = load i32, i32* %7
%33 = add nsw i32 %32, 1
store i32 %33, i32* %7
br label %8
34: ; preds = %8
ret void
}

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