void get_maxmin_us_2d(int iX, int iY, int nX, int nY, int X_nbr, int Y_nbr,
                      int nrm, int fid, double *u_face, double *sc_old,
                      double *sc_min, double *sc_max) {
  int nbrid;
  int offset = 1;
  if (u_face[fid] * nrm > 0.)
    offset = 0;
  nbrid = (iY + (offset)*Y_nbr) * nX + iX + (offset)*X_nbr;
  sc_min[fid] = *(sc_old + nbrid);
  sc_max[fid] = *(sc_old + nbrid);
  nbrid = (iY + (offset)*Y_nbr + (1 - Y_nbr * nrm)) * nX + iX + (offset)*X_nbr +
          (1 - X_nbr * nrm);
  sc_min[fid] = (((sc_min[fid]) < (*(sc_old + nbrid))) ? (sc_min[fid])
                                                       : (*(sc_old + nbrid)));
  sc_max[fid] = (((sc_max[fid]) > (*(sc_old + nbrid))) ? (sc_max[fid])
                                                       : (*(sc_old + nbrid)));
  nbrid = (iY + (offset)*Y_nbr - (1 - Y_nbr * nrm)) * nX + iX + (offset)*X_nbr -
          (1 - X_nbr * nrm);
  sc_min[fid] = (((sc_min[fid]) < (*(sc_old + nbrid))) ? (sc_min[fid])
                                                       : (*(sc_old + nbrid)));
  sc_max[fid] = (((sc_max[fid]) > (*(sc_old + nbrid))) ? (sc_max[fid])
                                                       : (*(sc_old + nbrid)));
}


x86 assembly (clang, -O0):
<get_maxmin_us_2d>:
push   %rbp
mov    %rsp,%rbp
mov    0x38(%rbp),%rax
mov    0x30(%rbp),%rax
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    %r9d,-0x18(%rbp)
movl   $0x1,-0x20(%rbp)
mov    0x20(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
cvtsi2sdl 0x10(%rbp),%xmm1
mulsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    115f <get_maxmin_us_2d+0x5f>
movl   $0x0,-0x20(%rbp)
mov    -0x8(%rbp),%eax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    %ecx,%eax
imul   -0xc(%rbp),%eax
add    -0x4(%rbp),%eax
mov    -0x20(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    0x38(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%eax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    %ecx,%eax
mov    -0x18(%rbp),%edx
imul   0x10(%rbp),%edx
mov    $0x1,%ecx
sub    %edx,%ecx
add    %ecx,%eax
imul   -0xc(%rbp),%eax
add    -0x4(%rbp),%eax
mov    -0x20(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    %ecx,%eax
mov    -0x14(%rbp),%edx
imul   0x10(%rbp),%edx
mov    $0x1,%ecx
sub    %edx,%ecx
add    %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    122c <get_maxmin_us_2d+0x12c>
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    123e <get_maxmin_us_2d+0x13e>
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x38(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    1287 <get_maxmin_us_2d+0x187>
mov    0x38(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1299 <get_maxmin_us_2d+0x199>
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    0x38(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x8(%rbp),%eax
mov    -0x20(%rbp),%ecx
imul   -0x18(%rbp),%ecx
add    %ecx,%eax
mov    -0x18(%rbp),%edx
imul   0x10(%rbp),%edx
mov    $0x1,%ecx
sub    %edx,%ecx
sub    %ecx,%eax
imul   -0xc(%rbp),%eax
add    -0x4(%rbp),%eax
mov    -0x20(%rbp),%ecx
imul   -0x14(%rbp),%ecx
add    %ecx,%eax
mov    -0x14(%rbp),%edx
imul   0x10(%rbp),%edx
mov    $0x1,%ecx
sub    %edx,%ecx
sub    %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    1325 <get_maxmin_us_2d+0x225>
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1337 <get_maxmin_us_2d+0x237>
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
mov    0x30(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x38(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    1380 <get_maxmin_us_2d+0x280>
mov    0x38(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    1392 <get_maxmin_us_2d+0x292>
mov    0x28(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
mov    0x38(%rbp),%rax
movslq 0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_maxmin_us_2d>:
push   %r15
push   %r14
push   %rbx
mov    0x48(%rsp),%r10
movslq 0x28(%rsp),%rcx
mov    0x30(%rsp),%rax
mov    0x20(%rsp),%r15d
cvtsi2sd %r15d,%xmm0
mulsd  (%rax,%rcx,8),%xmm0
xor    %eax,%eax
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
mov    $0x0,%ebx
cmovbe %r9d,%ebx
mov    0x40(%rsp),%r11
cmovbe %r8d,%eax
mov    0x38(%rsp),%r14
add    %esi,%ebx
mov    %ebx,%esi
imul   %edx,%esi
add    %edi,%eax
add    %eax,%esi
movslq %esi,%rsi
movsd  (%r14,%rsi,8),%xmm0
movsd  %xmm0,(%r11,%rcx,8)
movsd  (%r14,%rsi,8),%xmm0
movsd  %xmm0,(%r10,%rcx,8)
imul   %r15d,%r9d
mov    $0x1,%esi
sub    %r9d,%esi
lea    (%rbx,%rsi,1),%edi
imul   %edx,%edi
imul   %r8d,%r15d
lea    (%r15,%rax,1),%r8d
sub    %r15d,%eax
add    %edi,%eax
add    $0x1,%eax
movsd  (%r11,%rcx,8),%xmm0
cltq
minsd  (%r14,%rax,8),%xmm0
movsd  %xmm0,(%r11,%rcx,8)
movsd  (%r10,%rcx,8),%xmm0
maxsd  (%r14,%rax,8),%xmm0
movsd  %xmm0,(%r10,%rcx,8)
sub    %esi,%ebx
imul   %edx,%ebx
lea    (%rbx,%r8,1),%eax
add    $0xffffffff,%eax
movsd  (%r11,%rcx,8),%xmm0
cltq
minsd  (%r14,%rax,8),%xmm0
movsd  %xmm0,(%r11,%rcx,8)
movsd  (%r10,%rcx,8),%xmm0
maxsd  (%r14,%rax,8),%xmm0
movsd  %xmm0,(%r10,%rcx,8)
pop    %rbx
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
define void @get_maxmin_us_2d(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, double* nocapture %8, double* nocapture %9, double* nocapture %10, double* nocapture %11) {
%13 = sext i32 %7 to i64
%14 = getelementptr inbounds double, double* %8, i64 %13
%15 = load double, double* %14
%16 = sitofp i32 %6 to double
%17 = fmul double %15, %16
%18 = fcmp ule double %17, 0.000000e+00
%19 = select i1 %18, i32 %5, i32 0
%20 = add nsw i32 %19, %1
%21 = mul nsw i32 %20, %2
%22 = select i1 %18, i32 %4, i32 0
%23 = add i32 %22, %0
%24 = add i32 %23, %21
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds double, double* %9, i64 %25
%27 = load double, double* %26
%28 = getelementptr inbounds double, double* %10, i64 %13
store double %27, double* %28
%29 = load double, double* %26
%30 = getelementptr inbounds double, double* %11, i64 %13
store double %29, double* %30
%31 = mul nsw i32 %6, %5
%32 = sub nsw i32 1, %31
%33 = add nsw i32 %20, %32
%34 = mul nsw i32 %33, %2
%35 = mul nsw i32 %6, %4
%36 = add i32 %35, -1
%37 = sub nsw i32 1, %35
%38 = add i32 %23, %37
%39 = add i32 %38, %34
%40 = load double, double* %28
%41 = sext i32 %39 to i64
%42 = getelementptr inbounds double, double* %9, i64 %41
%43 = load double, double* %42
%44 = fcmp olt double %40, %43
%45 = select i1 %44, double %40, double %43
store double %45, double* %28
%46 = load double, double* %30
%47 = load double, double* %42
%48 = fcmp ogt double %46, %47
%49 = select i1 %48, double %46, double %47
store double %49, double* %30
%50 = sub nsw i32 %20, %32
%51 = mul nsw i32 %50, %2
%52 = add i32 %23, %36
%53 = add i32 %52, %51
%54 = load double, double* %28
%55 = sext i32 %53 to i64
%56 = getelementptr inbounds double, double* %9, i64 %55
%57 = load double, double* %56
%58 = fcmp olt double %54, %57
%59 = select i1 %58, double %54, double %57
store double %59, double* %28
%60 = load double, double* %30
%61 = load double, double* %56
%62 = fcmp ogt double %60, %61
%63 = select i1 %62, double %60, double %61
store double %63, double* %30
ret void
}