void boundaryvalues(int imax, int jmax, double **U, double **V) {
  for (int j = 1; j <= jmax; j++) {
    U[0][j] = 0.0;
    U[imax][j] = 0.0;
    V[0][j] = -V[1][j];
    V[imax + 1][j] = -V[imax][j];
  }
  for (int i = 1; i <= imax; i++) {
    V[i][0] = 0.0;
    V[i][jmax] = 0.0;
    U[i][0] = -U[i][1];
    U[i][jmax + 1] = 2.0 - U[i][jmax];
  }
}


x86 assembly (clang, -O0):
<boundaryvalues>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jg     11dc <boundaryvalues+0xdc>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movslq -0x1c(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x18(%rbp),%rax
mov    -0x4(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x1c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1119 <boundaryvalues+0x19>
movl   $0x1,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jg     1297 <boundaryvalues+0x197>
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x8(%rbp),%rcx
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  0x8(%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x8(%rbp),%rcx
movsd  0xd96(%rip),%xmm0
subsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x8(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11e3 <boundaryvalues+0xe3>
pop    %rbp
ret

x86 assembly (clang, -O2):
<boundaryvalues>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %esi,%esi
jle    1218 <boundaryvalues+0x118>
mov    (%rdx),%r11
movslq %edi,%rax
mov    (%rdx,%rax,8),%r14
mov    (%rcx),%r9
mov    0x8(%rcx),%r13
mov    (%rcx,%rax,8),%r10
mov    0x8(%rcx,%rax,8),%r8
mov    %esi,%r15d
mov    $0x1,%eax
cmp    $0x1,%esi
je     11d9 <boundaryvalues+0xd9>
mov    %r15d,%r12d
and    $0xfffffffe,%r12d
neg    %r12
mov    $0x1,%eax
movapd 0xead(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movq   $0x0,(%r11,%rax,8)
movq   $0x0,(%r14,%rax,8)
movsd  0x0(%r13,%rax,8),%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,(%r9,%rax,8)
movsd  (%r10,%rax,8),%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,(%r8,%rax,8)
movq   $0x0,0x8(%r11,%rax,8)
movq   $0x0,0x8(%r14,%rax,8)
movsd  0x8(%r13,%rax,8),%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,0x8(%r9,%rax,8)
movsd  0x8(%r10,%rax,8),%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,0x8(%r8,%rax,8)
lea    (%r12,%rax,1),%rbx
add    $0x2,%rbx
add    $0x2,%rax
cmp    $0x1,%rbx
jne    1160 <boundaryvalues+0x60>
test   $0x1,%r15b
je     1218 <boundaryvalues+0x118>
movq   $0x0,(%r11,%rax,8)
movq   $0x0,(%r14,%rax,8)
movsd  0x0(%r13,%rax,8),%xmm0
movapd 0xe02(%rip),%xmm1
xorpd  %xmm1,%xmm0
movlpd %xmm0,(%r9,%rax,8)
movsd  (%r10,%rax,8),%xmm0
xorpd  %xmm1,%xmm0
movlpd %xmm0,(%r8,%rax,8)
test   %edi,%edi
jle    1316 <boundaryvalues+0x216>
movslq %esi,%rax
add    $0x1,%esi
movslq %esi,%rsi
mov    %edi,%r8d
mov    $0x1,%ebx
cmp    $0x1,%edi
je     12d8 <boundaryvalues+0x1d8>
mov    %r8d,%r9d
and    $0xfffffffe,%r9d
neg    %r9
mov    $0x1,%ebx
movapd 0xdaf(%rip),%xmm0
movsd  0xdb7(%rip),%xmm1
nopl   0x0(%rax)
mov    (%rcx,%rbx,8),%rdi
movq   $0x0,(%rdi)
movq   $0x0,(%rdi,%rax,8)
mov    (%rdx,%rbx,8),%rdi
movsd  0x8(%rdi),%xmm2
xorpd  %xmm0,%xmm2
movlpd %xmm2,(%rdi)
movapd %xmm1,%xmm2
subsd  (%rdi,%rax,8),%xmm2
movsd  %xmm2,(%rdi,%rsi,8)
mov    0x8(%rcx,%rbx,8),%rdi
movq   $0x0,(%rdi)
movq   $0x0,(%rdi,%rax,8)
mov    0x8(%rdx,%rbx,8),%rdi
movsd  0x8(%rdi),%xmm2
xorpd  %xmm0,%xmm2
movlpd %xmm2,(%rdi)
movapd %xmm1,%xmm2
subsd  (%rdi,%rax,8),%xmm2
movsd  %xmm2,(%rdi,%rsi,8)
lea    (%r9,%rbx,1),%rdi
add    $0x2,%rdi
add    $0x2,%rbx
cmp    $0x1,%rdi
jne    1260 <boundaryvalues+0x160>
test   $0x1,%r8b
je     1316 <boundaryvalues+0x216>
mov    (%rcx,%rbx,8),%rcx
movq   $0x0,(%rcx)
movq   $0x0,(%rcx,%rax,8)
mov    (%rdx,%rbx,8),%rcx
movsd  0x8(%rcx),%xmm0
xorps  0xcff(%rip),%xmm0
movlps %xmm0,(%rcx)
movsd  0xd04(%rip),%xmm0
subsd  (%rcx,%rax,8),%xmm0
movsd  %xmm0,(%rcx,%rsi,8)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @boundaryvalues(i32 %0, i32 %1, double** %2, double** %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca double**
%8 = alloca double**
%9 = alloca i32
%10 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store double** %2, double*** %7
store double** %3, double*** %8
store i32 1, i32* %9
br label %11
11: ; preds = %63, %4
%12 = load i32, i32* %9
%13 = load i32, i32* %6
%14 = icmp sle i32 %12, %13
br i1 %14, label %15, label %66
15: ; preds = %11
%16 = load double**, double*** %7
%17 = getelementptr inbounds double*, double** %16, i64 0
%18 = load double*, double** %17
%19 = load i32, i32* %9
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds double, double* %18, i64 %20
store double 0.000000e+00, double* %21
%22 = load double**, double*** %7
%23 = load i32, i32* %5
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds double*, double** %22, i64 %24
%26 = load double*, double** %25
%27 = load i32, i32* %9
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds double, double* %26, i64 %28
store double 0.000000e+00, double* %29
%30 = load double**, double*** %8
%31 = getelementptr inbounds double*, double** %30, i64 1
%32 = load double*, double** %31
%33 = load i32, i32* %9
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds double, double* %32, i64 %34
%36 = load double, double* %35
%37 = fneg double %36
%38 = load double**, double*** %8
%39 = getelementptr inbounds double*, double** %38, i64 0
%40 = load double*, double** %39
%41 = load i32, i32* %9
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds double, double* %40, i64 %42
store double %37, double* %43
%44 = load double**, double*** %8
%45 = load i32, i32* %5
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds double*, double** %44, i64 %46
%48 = load double*, double** %47
%49 = load i32, i32* %9
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds double, double* %48, i64 %50
%52 = load double, double* %51
%53 = fneg double %52
%54 = load double**, double*** %8
%55 = load i32, i32* %5
%56 = add 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* %9
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds double, double* %59, i64 %61
store double %53, double* %62
br label %63
63: ; preds = %15
%64 = load i32, i32* %9
%65 = add nsw i32 %64, 1
store i32 %65, i32* %9
br label %11
66: ; preds = %11
store i32 1, i32* %10
br label %67
67: ; preds = %119, %66
%68 = load i32, i32* %10
%69 = load i32, i32* %5
%70 = icmp sle i32 %68, %69
br i1 %70, label %71, label %122
71: ; preds = %67
%72 = load double**, double*** %8
%73 = load i32, i32* %10
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds double*, double** %72, i64 %74
%76 = load double*, double** %75
%77 = getelementptr inbounds double, double* %76, i64 0
store double 0.000000e+00, double* %77
%78 = load double**, double*** %8
%79 = load i32, i32* %10
%80 = sext i32 %79 to i64
%81 = getelementptr inbounds double*, double** %78, i64 %80
%82 = load double*, double** %81
%83 = load i32, i32* %6
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds double, double* %82, i64 %84
store double 0.000000e+00, double* %85
%86 = load double**, double*** %7
%87 = load i32, i32* %10
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds double*, double** %86, i64 %88
%90 = load double*, double** %89
%91 = getelementptr inbounds double, double* %90, i64 1
%92 = load double, double* %91
%93 = fneg double %92
%94 = load double**, double*** %7
%95 = load i32, i32* %10
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds double*, double** %94, i64 %96
%98 = load double*, double** %97
%99 = getelementptr inbounds double, double* %98, i64 0
store double %93, double* %99
%100 = load double**, double*** %7
%101 = load i32, i32* %10
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds double*, double** %100, i64 %102
%104 = load double*, double** %103
%105 = load i32, i32* %6
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds double, double* %104, i64 %106
%108 = load double, double* %107
%109 = fsub double 2.000000e+00, %108
%110 = load double**, double*** %7
%111 = load i32, i32* %10
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds double*, double** %110, i64 %112
%114 = load double*, double** %113
%115 = load i32, i32* %6
%116 = add nsw i32 %115, 1
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds double, double* %114, i64 %117
store double %109, double* %118
br label %119
119: ; preds = %71
%120 = load i32, i32* %10
%121 = add nsw i32 %120, 1
store i32 %121, i32* %10
br label %67
122: ; preds = %67
ret void
}

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