double **do3x3smooth(double **arr, int nArr) {
  int i, j;
  double **out;
  assert(nArr >= 3);
  out = alloc_square_array(nArr - 2);
  assert(out);
  for (i = 1; i < nArr - 1; i++) {
    for (j = 1; j < nArr - 1; j++) {
      double s = arr[i - 1][j - 1] + arr[i - 1][j] + arr[i - 1][j + 1] +
                 arr[i][j - 1] + arr[i][j] + arr[i][j + 1] + arr[i + 1][j - 1] +
                 arr[i + 1][j] + arr[i + 1][j + 1];
      out[i - 1][j - 1] = s / 9.0;
    }
  }
  return out;
}


x86 assembly (clang, -O0):
<do3x3smooth>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
cmpl   $0x3,-0xc(%rbp)
setge  %al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1040 <assert@plt>
mov    -0xc(%rbp),%edi
sub    $0x2,%edi
mov    $0x0,%al
call   1030 <alloc_square_array@plt>
cltq
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdi
mov    $0x0,%al
call   1040 <assert@plt>
movl   $0x1,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    12df <do3x3smooth+0x1bf>
movl   $0x1,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    12cc <do3x3smooth+0x1ac>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x14(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xd65(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    117f <do3x3smooth+0x5f>
jmp    12d1 <do3x3smooth+0x1b1>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1167 <do3x3smooth+0x47>
mov    -0x20(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<do3x3smooth>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %esi,%ebp
mov    %rdi,%r15
xor    %edi,%edi
cmp    $0x3,%esi
setge  %dil
xor    %eax,%eax
call   1040 <assert@plt>
lea    -0x2(%rbp),%edi
xor    %eax,%eax
call   1030 <alloc_square_array@plt>
movslq %eax,%rbx
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <assert@plt>
mov    %rbp,%r9
mov    %rbx,%rax
cmp    $0x3,%r9d
jl     135b <do3x3smooth+0x23b>
add    $0xffffffff,%r9d
lea    -0x1(%r9),%r10
lea    0x1(%r9),%rcx
mov    %rcx,0x18(%rsp)
mov    %r10,%r13
and    $0xfffffffffffffffe,%r13
mov    %r10,%rcx
or     $0x1,%rcx
mov    %rcx,0x10(%rsp)
mov    $0x1,%r11d
movsd  0xe74(%rip),%xmm0
movapd 0xe5c(%rip),%xmm1
jmp    11b9 <do3x3smooth+0x99>
cs nopw 0x0(%rax,%rax,1)
cmp    %r9,%r11
je     135b <do3x3smooth+0x23b>
mov    -0x8(%r15,%r11,8),%rsi
mov    (%r15,%r11,8),%rcx
mov    0x8(%r15,%r11,8),%r14
mov    -0x8(%rax,%r11,8),%rbx
add    $0x1,%r11
mov    $0x1,%edx
cmp    $0x2,%r10
jb     12f0 <do3x3smooth+0x1d0>
lea    (%rbx,%r10,8),%rdx
mov    0x18(%rsp),%rdi
mov    %r11,0x20(%rsp)
lea    (%rsi,%rdi,8),%r11
lea    (%rcx,%rdi,8),%rbp
lea    (%r14,%rdi,8),%r8
cmp    %r11,%rbx
mov    %r9,%r12
setb   %r9b
cmp    %rdx,%rsi
mov    %r10,%r11
setb   %r10b
cmp    %rbp,%rbx
setb   %bpl
cmp    %rdx,%rcx
setb   0xf(%rsp)
cmp    %r8,%rbx
setb   %dil
cmp    %rdx,%r14
setb   %r8b
mov    $0x1,%edx
test   %r10b,%r9b
mov    %r11,%r10
mov    0x20(%rsp),%r11
mov    %r12,%r9
jne    12f0 <do3x3smooth+0x1d0>
mov    $0x1,%edx
and    0xf(%rsp),%bpl
jne    12f0 <do3x3smooth+0x1d0>
mov    $0x1,%edx
and    %r8b,%dil
jne    12f0 <do3x3smooth+0x1d0>
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movupd (%rsi,%rdi,8),%xmm2
movupd 0x8(%rsi,%rdi,8),%xmm3
addpd  %xmm2,%xmm3
movupd 0x10(%rsi,%rdi,8),%xmm2
addpd  %xmm3,%xmm2
movupd (%rcx,%rdi,8),%xmm3
addpd  %xmm2,%xmm3
movupd 0x8(%rcx,%rdi,8),%xmm2
addpd  %xmm3,%xmm2
movupd 0x10(%rcx,%rdi,8),%xmm3
addpd  %xmm2,%xmm3
movupd (%r14,%rdi,8),%xmm2
addpd  %xmm3,%xmm2
movupd 0x8(%r14,%rdi,8),%xmm3
addpd  %xmm2,%xmm3
movupd 0x10(%r14,%rdi,8),%xmm2
addpd  %xmm3,%xmm2
divpd  %xmm1,%xmm2
movupd %xmm2,(%rbx,%rdi,8)
add    $0x2,%rdi
cmp    %rdi,%r13
jne    1270 <do3x3smooth+0x150>
mov    0x10(%rsp),%rdx
cmp    %r13,%r10
je     11b0 <do3x3smooth+0x90>
cs nopw 0x0(%rax,%rax,1)
lea    (%rsi,%rdx,8),%rsi
lea    (%rcx,%rdx,8),%rcx
lea    (%r14,%rdx,8),%rbp
lea    (%rbx,%rdx,8),%rdi
add    $0xfffffffffffffff8,%rdi
mov    %r9,%rbx
sub    %rdx,%rbx
xor    %edx,%edx
nopl   0x0(%rax)
movsd  -0x8(%rsi,%rdx,8),%xmm2
addsd  (%rsi,%rdx,8),%xmm2
addsd  0x8(%rsi,%rdx,8),%xmm2
addsd  -0x8(%rcx,%rdx,8),%xmm2
addsd  (%rcx,%rdx,8),%xmm2
addsd  0x8(%rcx,%rdx,8),%xmm2
addsd  -0x8(%rbp,%rdx,8),%xmm2
addsd  0x0(%rbp,%rdx,8),%xmm2
addsd  0x8(%rbp,%rdx,8),%xmm2
divsd  %xmm0,%xmm2
movsd  %xmm2,(%rdi,%rdx,8)
add    $0x1,%rdx
cmp    %rdx,%rbx
jne    1310 <do3x3smooth+0x1f0>
jmp    11b0 <do3x3smooth+0x90>
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define double** @do3x3smooth(double** %0, i32 %1) {
%3 = alloca double**
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca double**
%8 = alloca double
store double** %0, double*** %3
store i32 %1, i32* %4
%9 = load i32, i32* %4
%10 = icmp sge i32 %9, 3
%11 = zext i1 %10 to i32
%12 = call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %11)
%13 = load i32, i32* %4
%14 = sub nsw i32 %13, 2
%15 = call i32 (i32, ...) bitcast (i32 (...)* @alloc_square_array to i32 (i32, ...)*)(i32 %14)
%16 = sext i32 %15 to i64
%17 = inttoptr i64 %16 to double**
store double** %17, double*** %7
%18 = load double**, double*** %7
%19 = call i32 (double**, ...) bitcast (i32 (...)* @assert to i32 (double**, ...)*)(double** %18)
store i32 1, i32* %5
br label %20
20: ; preds = %149, %2
%21 = load i32, i32* %5
%22 = load i32, i32* %4
%23 = sub nsw i32 %22, 1
%24 = icmp slt i32 %21, %23
br i1 %24, label %25, label %152
25: ; preds = %20
store i32 1, i32* %6
br label %26
26: ; preds = %145, %25
%27 = load i32, i32* %6
%28 = load i32, i32* %4
%29 = sub nsw i32 %28, 1
%30 = icmp slt i32 %27, %29
br i1 %30, label %31, label %148
31: ; preds = %26
%32 = load double**, double*** %3
%33 = load i32, i32* %5
%34 = sub nsw i32 %33, 1
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds double*, double** %32, i64 %35
%37 = load double*, double** %36
%38 = load i32, i32* %6
%39 = sub nsw i32 %38, 1
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds double, double* %37, i64 %40
%42 = load double, double* %41
%43 = load double**, double*** %3
%44 = load i32, i32* %5
%45 = sub nsw i32 %44, 1
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds double*, double** %43, i64 %46
%48 = load double*, double** %47
%49 = load i32, i32* %6
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds double, double* %48, i64 %50
%52 = load double, double* %51
%53 = fadd double %42, %52
%54 = load double**, double*** %3
%55 = load i32, i32* %5
%56 = sub nsw i32 %55, 1
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds double*, double** %54, i64 %57
%59 = load double*, double** %58
%60 = load i32, i32* %6
%61 = add nsw i32 %60, 1
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds double, double* %59, i64 %62
%64 = load double, double* %63
%65 = fadd double %53, %64
%66 = load double**, double*** %3
%67 = load i32, i32* %5
%68 = sext i32 %67 to i64
%69 = getelementptr inbounds double*, double** %66, i64 %68
%70 = load double*, double** %69
%71 = load i32, i32* %6
%72 = sub nsw i32 %71, 1
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds double, double* %70, i64 %73
%75 = load double, double* %74
%76 = fadd double %65, %75
%77 = load double**, double*** %3
%78 = load i32, i32* %5
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds double*, double** %77, i64 %79
%81 = load double*, double** %80
%82 = load i32, i32* %6
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds double, double* %81, i64 %83
%85 = load double, double* %84
%86 = fadd double %76, %85
%87 = load double**, double*** %3
%88 = load i32, i32* %5
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds double*, double** %87, i64 %89
%91 = load double*, double** %90
%92 = load i32, i32* %6
%93 = add nsw i32 %92, 1
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds double, double* %91, i64 %94
%96 = load double, double* %95
%97 = fadd double %86, %96
%98 = load double**, double*** %3
%99 = load i32, i32* %5
%100 = add nsw i32 %99, 1
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds double*, double** %98, i64 %101
%103 = load double*, double** %102
%104 = load i32, i32* %6
%105 = sub nsw i32 %104, 1
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds double, double* %103, i64 %106
%108 = load double, double* %107
%109 = fadd double %97, %108
%110 = load double**, double*** %3
%111 = load i32, i32* %5
%112 = add nsw i32 %111, 1
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds double*, double** %110, i64 %113
%115 = load double*, double** %114
%116 = load i32, i32* %6
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds double, double* %115, i64 %117
%119 = load double, double* %118
%120 = fadd double %109, %119
%121 = load double**, double*** %3
%122 = load i32, i32* %5
%123 = add nsw i32 %122, 1
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds double*, double** %121, i64 %124
%126 = load double*, double** %125
%127 = load i32, i32* %6
%128 = add nsw i32 %127, 1
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds double, double* %126, i64 %129
%131 = load double, double* %130
%132 = fadd double %120, %131
store double %132, double* %8
%133 = load double, double* %8
%134 = fdiv double %133, 9.000000e+00
%135 = load double**, double*** %7
%136 = load i32, i32* %5
%137 = sub nsw i32 %136, 1
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds double*, double** %135, i64 %138
%140 = load double*, double** %139
%141 = load i32, i32* %6
%142 = sub nsw i32 %141, 1
%143 = sext i32 %142 to i64
%144 = getelementptr inbounds double, double* %140, i64 %143
store double %134, double* %144
br label %145
145: ; preds = %31
%146 = load i32, i32* %6
%147 = add nsw i32 %146, 1
store i32 %147, i32* %6
br label %26
148: ; preds = %26
br label %149
149: ; preds = %148
%150 = load i32, i32* %5
%151 = add nsw i32 %150, 1
store i32 %151, i32* %5
br label %20
152: ; preds = %20
%153 = load double**, double*** %7
ret double** %153
}

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