void update_velocity(double **u, double **v, double **f, double **g, double **p,
                     char **flag, int imax, int jmax, double del_t, double delx,
                     double dely) {
  int i, j;
  for (i = 1; i <= imax - 1; i++) {
    for (j = 1; j <= jmax; j++) {
      if ((flag[i][j] & 0x0010) && (flag[i + 1][j] & 0x0010)) {
        u[i][j] = f[i][j] - (p[i + 1][j] - p[i][j]) * del_t / delx;
      }
    }
  }
  for (i = 1; i <= imax; i++) {
    for (j = 1; j <= jmax - 1; j++) {
      if ((flag[i][j] & 0x0010) && (flag[i][j + 1] & 0x0010)) {
        v[i][j] = g[i][j] - (p[i][j + 1] - p[i][j]) * del_t / dely;
      }
    }
  }
}


x86 assembly (clang, -O0):
<update_velocity>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movsd  %xmm0,-0x38(%rbp)
movsd  %xmm1,-0x40(%rbp)
movsd  %xmm2,-0x48(%rbp)
movl   $0x1,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
mov    0x10(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     122e <update_velocity+0x12e>
movl   $0x1,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    0x18(%rbp),%eax
jg     121b <update_velocity+0x11b>
mov    -0x30(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1208 <update_velocity+0x108>
mov    -0x30(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1208 <update_velocity+0x108>
mov    -0x18(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x40(%rbp),%xmm1
subsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    120d <update_velocity+0x10d>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1150 <update_velocity+0x50>
jmp    1220 <update_velocity+0x120>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1138 <update_velocity+0x38>
movl   $0x1,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    0x10(%rbp),%eax
jg     132b <update_velocity+0x22b>
movl   $0x1,-0x50(%rbp)
mov    -0x50(%rbp),%eax
mov    0x18(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jg     1318 <update_velocity+0x218>
mov    -0x30(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1305 <update_velocity+0x205>
mov    -0x30(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1305 <update_velocity+0x205>
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x50(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm1
mulsd  -0x38(%rbp),%xmm1
divsd  -0x48(%rbp),%xmm1
subsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x50(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    130a <update_velocity+0x20a>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1248 <update_velocity+0x148>
jmp    131d <update_velocity+0x21d>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1235 <update_velocity+0x135>
pop    %rbp
ret

x86 assembly (clang, -O2):
<update_velocity>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    0x40(%rsp),%r10d
mov    0x38(%rsp),%eax
cmp    $0x2,%eax
jl     11cc <update_velocity+0xcc>
lea    0x1(%r10),%r12d
mov    0x38(%rsp),%eax
mov    %eax,%r14d
mov    $0x1,%ebx
jmp    113f <update_velocity+0x3f>
xchg   %ax,%ax
mov    %r15,%rbx
mov    %r11,%r10
cmp    %r14,%r15
je     11cc <update_velocity+0xcc>
test   %r10d,%r10d
jle    11c0 <update_velocity+0xc0>
mov    %r10,%r11
mov    (%r9,%rbx,8),%r13
lea    0x1(%rbx),%r15
mov    $0x1,%eax
jmp    1169 <update_velocity+0x69>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rax
cmp    %rax,%r12
je     1130 <update_velocity+0x30>
testb  $0x10,0x0(%r13,%rax,1)
je     1160 <update_velocity+0x60>
mov    0x8(%r9,%rbx,8),%rbp
testb  $0x10,0x0(%rbp,%rax,1)
je     1160 <update_velocity+0x60>
mov    (%rdx,%rbx,8),%rbp
movsd  0x0(%rbp,%rax,8),%xmm3
mov    (%r8,%rbx,8),%rbp
mov    0x8(%r8,%rbx,8),%r10
movsd  (%r10,%rax,8),%xmm4
subsd  0x0(%rbp,%rax,8),%xmm4
mulsd  %xmm0,%xmm4
divsd  %xmm1,%xmm4
subsd  %xmm4,%xmm3
mov    (%rdi,%rbx,8),%rbp
movsd  %xmm3,0x0(%rbp,%rax,8)
jmp    1160 <update_velocity+0x60>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rbx
mov    %rbx,%r15
jmp    1136 <update_velocity+0x36>
mov    0x38(%rsp),%r11d
test   %r11d,%r11d
jle    125b <update_velocity+0x15b>
add    $0x1,%r11d
mov    %r10d,%r14d
mov    $0x1,%edx
jmp    11f9 <update_velocity+0xf9>
nopl   0x0(%rax,%rax,1)
add    $0x1,%rdx
cmp    %r11,%rdx
je     125b <update_velocity+0x15b>
cmp    $0x2,%r10d
jl     11f0 <update_velocity+0xf0>
mov    (%r9,%rdx,8),%rdi
mov    $0x1,%eax
jmp    1215 <update_velocity+0x115>
nopw   0x0(%rax,%rax,1)
cmp    %rax,%r14
je     11f0 <update_velocity+0xf0>
mov    %rax,%rbx
add    $0x1,%rax
testb  $0x10,(%rdi,%rbx,1)
je     1210 <update_velocity+0x110>
testb  $0x10,0x1(%rdi,%rbx,1)
je     1210 <update_velocity+0x110>
mov    (%rcx,%rdx,8),%rbp
movsd  0x0(%rbp,%rbx,8),%xmm1
mov    (%r8,%rdx,8),%rbp
movsd  0x8(%rbp,%rbx,8),%xmm3
subsd  0x0(%rbp,%rbx,8),%xmm3
mulsd  %xmm0,%xmm3
divsd  %xmm2,%xmm3
subsd  %xmm3,%xmm1
mov    (%rsi,%rdx,8),%rbp
movsd  %xmm1,0x0(%rbp,%rbx,8)
jmp    1210 <update_velocity+0x110>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @update_velocity(double** %0, double** %1, double** %2, double** %3, double** %4, i8** %5, i32 %6, i32 %7, double %8, double %9, double %10) {
%12 = alloca double**
%13 = alloca double**
%14 = alloca double**
%15 = alloca double**
%16 = alloca double**
%17 = alloca i8**
%18 = alloca i32
%19 = alloca i32
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca i32
%24 = alloca i32
store double** %0, double*** %12
store double** %1, double*** %13
store double** %2, double*** %14
store double** %3, double*** %15
store double** %4, double*** %16
store i8** %5, i8*** %17
store i32 %6, i32* %18
store i32 %7, i32* %19
store double %8, double* %20
store double %9, double* %21
store double %10, double* %22
store i32 1, i32* %23
br label %25
25: ; preds = %110, %11
%26 = load i32, i32* %23
%27 = load i32, i32* %18
%28 = sub nsw i32 %27, 1
%29 = icmp sle i32 %26, %28
br i1 %29, label %30, label %113
30: ; preds = %25
store i32 1, i32* %24
br label %31
31: ; preds = %106, %30
%32 = load i32, i32* %24
%33 = load i32, i32* %19
%34 = icmp sle i32 %32, %33
br i1 %34, label %35, label %109
35: ; preds = %31
%36 = load i8**, i8*** %17
%37 = load i32, i32* %23
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i8*, i8** %36, i64 %38
%40 = load i8*, i8** %39
%41 = load i32, i32* %24
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i8, i8* %40, i64 %42
%44 = load i8, i8* %43
%45 = sext i8 %44 to i32
%46 = and i32 %45, 16
%47 = icmp ne i32 %46, 0
br i1 %47, label %48, label %105
48: ; preds = %35
%49 = load i8**, i8*** %17
%50 = load i32, i32* %23
%51 = add nsw i32 %50, 1
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i8*, i8** %49, i64 %52
%54 = load i8*, i8** %53
%55 = load i32, i32* %24
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i8, i8* %54, i64 %56
%58 = load i8, i8* %57
%59 = sext i8 %58 to i32
%60 = and i32 %59, 16
%61 = icmp ne i32 %60, 0
br i1 %61, label %62, label %105
62: ; preds = %48
%63 = load double**, double*** %14
%64 = load i32, i32* %23
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds double*, double** %63, i64 %65
%67 = load double*, double** %66
%68 = load i32, i32* %24
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds double, double* %67, i64 %69
%71 = load double, double* %70
%72 = load double**, double*** %16
%73 = load i32, i32* %23
%74 = add nsw i32 %73, 1
%75 = sext i32 %74 to i64
%76 = getelementptr inbounds double*, double** %72, i64 %75
%77 = load double*, double** %76
%78 = load i32, i32* %24
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds double, double* %77, i64 %79
%81 = load double, double* %80
%82 = load double**, double*** %16
%83 = load i32, i32* %23
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds double*, double** %82, i64 %84
%86 = load double*, double** %85
%87 = load i32, i32* %24
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds double, double* %86, i64 %88
%90 = load double, double* %89
%91 = fsub double %81, %90
%92 = load double, double* %20
%93 = fmul double %91, %92
%94 = load double, double* %21
%95 = fdiv double %93, %94
%96 = fsub double %71, %95
%97 = load double**, double*** %12
%98 = load i32, i32* %23
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds double*, double** %97, i64 %99
%101 = load double*, double** %100
%102 = load i32, i32* %24
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds double, double* %101, i64 %103
store double %96, double* %104
br label %105
105: ; preds = %62, %48, %35
br label %106
106: ; preds = %105
%107 = load i32, i32* %24
%108 = add nsw i32 %107, 1
store i32 %108, i32* %24
br label %31
109: ; preds = %31
br label %110
110: ; preds = %109
%111 = load i32, i32* %23
%112 = add nsw i32 %111, 1
store i32 %112, i32* %23
br label %25
113: ; preds = %25
store i32 1, i32* %23
br label %114
114: ; preds = %199, %113
%115 = load i32, i32* %23
%116 = load i32, i32* %18
%117 = icmp sle i32 %115, %116
br i1 %117, label %118, label %202
118: ; preds = %114
store i32 1, i32* %24
br label %119
119: ; preds = %195, %118
%120 = load i32, i32* %24
%121 = load i32, i32* %19
%122 = sub nsw i32 %121, 1
%123 = icmp sle i32 %120, %122
br i1 %123, label %124, label %198
124: ; preds = %119
%125 = load i8**, i8*** %17
%126 = load i32, i32* %23
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds i8*, i8** %125, i64 %127
%129 = load i8*, i8** %128
%130 = load i32, i32* %24
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds i8, i8* %129, i64 %131
%133 = load i8, i8* %132
%134 = sext i8 %133 to i32
%135 = and i32 %134, 16
%136 = icmp ne i32 %135, 0
br i1 %136, label %137, label %194
137: ; preds = %124
%138 = load i8**, i8*** %17
%139 = load i32, i32* %23
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds i8*, i8** %138, i64 %140
%142 = load i8*, i8** %141
%143 = load i32, i32* %24
%144 = add nsw i32 %143, 1
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds i8, i8* %142, i64 %145
%147 = load i8, i8* %146
%148 = sext i8 %147 to i32
%149 = and i32 %148, 16
%150 = icmp ne i32 %149, 0
br i1 %150, label %151, label %194
151: ; preds = %137
%152 = load double**, double*** %15
%153 = load i32, i32* %23
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds double*, double** %152, i64 %154
%156 = load double*, double** %155
%157 = load i32, i32* %24
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds double, double* %156, i64 %158
%160 = load double, double* %159
%161 = load double**, double*** %16
%162 = load i32, i32* %23
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds double*, double** %161, i64 %163
%165 = load double*, double** %164
%166 = load i32, i32* %24
%167 = add nsw i32 %166, 1
%168 = sext i32 %167 to i64
%169 = getelementptr inbounds double, double* %165, i64 %168
%170 = load double, double* %169
%171 = load double**, double*** %16
%172 = load i32, i32* %23
%173 = sext i32 %172 to i64
%174 = getelementptr inbounds double*, double** %171, i64 %173
%175 = load double*, double** %174
%176 = load i32, i32* %24
%177 = sext i32 %176 to i64
%178 = getelementptr inbounds double, double* %175, i64 %177
%179 = load double, double* %178
%180 = fsub double %170, %179
%181 = load double, double* %20
%182 = fmul double %180, %181
%183 = load double, double* %22
%184 = fdiv double %182, %183
%185 = fsub double %160, %184
%186 = load double**, double*** %13
%187 = load i32, i32* %23
%188 = sext i32 %187 to i64
%189 = getelementptr inbounds double*, double** %186, i64 %188
%190 = load double*, double** %189
%191 = load i32, i32* %24
%192 = sext i32 %191 to i64
%193 = getelementptr inbounds double, double* %190, i64 %192
store double %185, double* %193
br label %194
194: ; preds = %151, %137, %124
br label %195
195: ; preds = %194
%196 = load i32, i32* %24
%197 = add nsw i32 %196, 1
store i32 %197, i32* %24
br label %119
198: ; preds = %119
br label %199
199: ; preds = %198
%200 = load i32, i32* %23
%201 = add nsw i32 %200, 1
store i32 %201, i32* %23
br label %114
202: ; preds = %114
ret void
}

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