int E_parDrv(int i, int j, int type, double drv[][2]) {
  int ind[2], ii;
  if (type == 1)
    return 0;
  else if (type == 2) {
    drv[0][0] = drv[0][1] = drv[1][0] = drv[1][1] = 0.0;
    if (i == 0 && j == 1) {
      drv[0][0] = 1.0;
      drv[1][1] = 1.0;
    } else if (i == 1 && j == 0) {
      drv[0][1] = 1.0;
      drv[1][0] = 1.0;
    } else if (i == 1 && j == 2) {
      drv[0][1] = -1.0;
      drv[1][0] = 1.0;
      drv[1][1] = -1.0;
    } else if (i == 2 && j == 1) {
      drv[0][0] = -1.0;
      drv[1][0] = -1.0;
      drv[1][1] = 1.0;
    } else if (i == 2 && j == 0) {
      drv[0][0] = -1.0;
      drv[0][1] = 1.0;
      drv[1][0] = -1.0;
    } else if (i == 0 && j == 2) {
      drv[0][0] = 1.0;
      drv[0][1] = -1.0;
      drv[1][1] = -1.0;
    } else
      return 0;
    return 1;
  } else if (type == 4) {
    drv[0][0] = drv[0][1] = drv[1][0] = drv[1][1] = drv[2][0] = drv[2][1] = 0.0;
    ind[0] = i;
    ind[1] = j;
    for (ii = 0; ii < 2; ii++) {
      if (ind[ii] == 0)
        drv[0][ii] = 1.0;
      else if (ind[ii] == 1)
        drv[1][ii] = 1.0;
      else if (ind[ii] == 2)
        drv[2][ii] = 1.0;
      else if (ind[ii] == 3)
        drv[0][ii] = drv[1][ii] = drv[2][ii] = -1.0;
    }
    return 1;
  } else
    return 0;
}


x86 assembly (clang, -O0):
<E_parDrv>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
cmpl   $0x1,-0x10(%rbp)
jne    1127 <E_parDrv+0x27>
movl   $0x0,-0x4(%rbp)
jmp    14a3 <E_parDrv+0x3a3>
cmpl   $0x2,-0x10(%rbp)
jne    1333 <E_parDrv+0x233>
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
cmpl   $0x0,-0x8(%rbp)
jne    119a <E_parDrv+0x9a>
cmpl   $0x1,-0xc(%rbp)
jne    119a <E_parDrv+0x9a>
mov    -0x18(%rbp),%rax
movsd  0xe88(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  0xe78(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
jmp    1327 <E_parDrv+0x227>
cmpl   $0x1,-0x8(%rbp)
jne    11d5 <E_parDrv+0xd5>
cmpl   $0x0,-0xc(%rbp)
jne    11d5 <E_parDrv+0xd5>
mov    -0x18(%rbp),%rax
movsd  0xe4e(%rip),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0xe3d(%rip),%xmm0
movsd  %xmm0,0x10(%rax)
jmp    1322 <E_parDrv+0x222>
cmpl   $0x1,-0x8(%rbp)
jne    1221 <E_parDrv+0x121>
cmpl   $0x2,-0xc(%rbp)
jne    1221 <E_parDrv+0x121>
mov    -0x18(%rbp),%rax
movsd  0xe0b(%rip),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0xe02(%rip),%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x18(%rbp),%rax
movsd  0xde9(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
jmp    131d <E_parDrv+0x21d>
cmpl   $0x2,-0x8(%rbp)
jne    126c <E_parDrv+0x16c>
cmpl   $0x1,-0xc(%rbp)
jne    126c <E_parDrv+0x16c>
mov    -0x18(%rbp),%rax
movsd  0xdbf(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  0xdaf(%rip),%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x18(%rbp),%rax
movsd  0xda6(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
jmp    1318 <E_parDrv+0x218>
cmpl   $0x2,-0x8(%rbp)
jne    12b7 <E_parDrv+0x1b7>
cmpl   $0x0,-0xc(%rbp)
jne    12b7 <E_parDrv+0x1b7>
mov    -0x18(%rbp),%rax
movsd  0xd74(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  0xd6c(%rip),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0xd53(%rip),%xmm0
movsd  %xmm0,0x10(%rax)
jmp    1313 <E_parDrv+0x213>
cmpl   $0x0,-0x8(%rbp)
jne    1302 <E_parDrv+0x202>
cmpl   $0x2,-0xc(%rbp)
jne    1302 <E_parDrv+0x202>
mov    -0x18(%rbp),%rax
movsd  0xd31(%rip),%xmm0
movsd  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movsd  0xd19(%rip),%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0xd08(%rip),%xmm0
movsd  %xmm0,0x18(%rax)
jmp    130e <E_parDrv+0x20e>
movl   $0x0,-0x4(%rbp)
jmp    14a3 <E_parDrv+0x3a3>
jmp    1313 <E_parDrv+0x213>
jmp    1318 <E_parDrv+0x218>
jmp    131d <E_parDrv+0x21d>
jmp    1322 <E_parDrv+0x222>
jmp    1327 <E_parDrv+0x227>
movl   $0x1,-0x4(%rbp)
jmp    14a3 <E_parDrv+0x3a3>
cmpl   $0x4,-0x10(%rbp)
jne    149c <E_parDrv+0x39c>
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x28(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x20(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x18(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x10(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x8(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x2,-0x24(%rbp)
jge    1490 <E_parDrv+0x390>
movslq -0x24(%rbp),%rax
cmpl   $0x0,-0x20(%rbp,%rax,4)
jne    13ca <E_parDrv+0x2ca>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  0xc48(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    147d <E_parDrv+0x37d>
movslq -0x24(%rbp),%rax
cmpl   $0x1,-0x20(%rbp,%rax,4)
jne    13f4 <E_parDrv+0x2f4>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  0xc1f(%rip),%xmm0
movsd  %xmm0,0x10(%rax,%rcx,8)
jmp    1478 <E_parDrv+0x378>
movslq -0x24(%rbp),%rax
cmpl   $0x2,-0x20(%rbp,%rax,4)
jne    141e <E_parDrv+0x31e>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  0xbf5(%rip),%xmm0
movsd  %xmm0,0x20(%rax,%rcx,8)
jmp    1473 <E_parDrv+0x373>
movslq -0x24(%rbp),%rax
cmpl   $0x3,-0x20(%rbp,%rax,4)
jne    146e <E_parDrv+0x36e>
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  0xbc3(%rip),%xmm0
movsd  %xmm0,0x20(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  0xbad(%rip),%xmm0
movsd  %xmm0,0x10(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  0xb97(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
jmp    1473 <E_parDrv+0x373>
jmp    1478 <E_parDrv+0x378>
jmp    147d <E_parDrv+0x37d>
jmp    1482 <E_parDrv+0x382>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1397 <E_parDrv+0x297>
movl   $0x1,-0x4(%rbp)
jmp    14a3 <E_parDrv+0x3a3>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<E_parDrv>:
cmp    $0x4,%edx
je     1132 <E_parDrv+0x32>
xor    %eax,%eax
cmp    $0x2,%edx
jne    1243 <E_parDrv+0x143>
xorps  %xmm0,%xmm0
movups %xmm0,0x10(%rcx)
movups %xmm0,(%rcx)
test   %edi,%edi
jne    1167 <E_parDrv+0x67>
cmp    $0x1,%esi
jne    1167 <E_parDrv+0x67>
movabs $0x3ff0000000000000,%rax
mov    %rax,(%rcx)
jmp    11a8 <E_parDrv+0xa8>
xorps  %xmm0,%xmm0
movups %xmm0,0x20(%rcx)
movups %xmm0,0x10(%rcx)
movups %xmm0,(%rcx)
cmp    $0x3,%edi
ja     11e7 <E_parDrv+0xe7>
mov    %edi,%eax
lea    0xede(%rip),%rdx
movslq (%rdx,%rax,4),%rax
add    %rdx,%rax
jmp    *%rax
movabs $0x3ff0000000000000,%rax
jmp    11e4 <E_parDrv+0xe4>
cmp    $0x1,%edi
jne    1181 <E_parDrv+0x81>
test   %esi,%esi
jne    1181 <E_parDrv+0x81>
movaps 0xea9(%rip),%xmm0
movups %xmm0,0x8(%rcx)
mov    $0x1,%eax
ret
cmp    $0x1,%edi
jne    1244 <E_parDrv+0x144>
cmp    $0x2,%esi
jne    1244 <E_parDrv+0x144>
movaps 0xe76(%rip),%xmm0
movups %xmm0,0x8(%rcx)
movabs $0xbff0000000000000,%rax
mov    %rax,0x18(%rcx)
mov    $0x1,%eax
ret
movabs $0x3ff0000000000000,%rax
mov    %rax,0x10(%rcx)
jmp    11e7 <E_parDrv+0xe7>
movabs $0x3ff0000000000000,%rax
mov    %rax,0x20(%rcx)
jmp    11e7 <E_parDrv+0xe7>
movabs $0xbff0000000000000,%rax
mov    %rax,0x20(%rcx)
mov    %rax,0x10(%rcx)
mov    %rax,(%rcx)
mov    $0x1,%eax
cmp    $0x3,%esi
ja     1243 <E_parDrv+0x143>
mov    %esi,%edx
lea    0xe46(%rip),%rsi
movslq (%rsi,%rdx,4),%rdx
add    %rsi,%rdx
jmp    *%rdx
movabs $0x3ff0000000000000,%rdx
jmp    123f <E_parDrv+0x13f>
movabs $0x3ff0000000000000,%rdx
mov    %rdx,0x18(%rcx)
ret
movabs $0x3ff0000000000000,%rdx
mov    %rdx,0x28(%rcx)
ret
movabs $0xbff0000000000000,%rdx
mov    %rdx,0x28(%rcx)
mov    %rdx,0x18(%rcx)
mov    %rdx,0x8(%rcx)
ret
cmp    $0x2,%edi
jne    126c <E_parDrv+0x16c>
cmp    $0x1,%esi
jne    126c <E_parDrv+0x16c>
movabs $0xbff0000000000000,%rax
mov    %rax,(%rcx)
movaps 0xdae(%rip),%xmm0
movups %xmm0,0x10(%rcx)
mov    $0x1,%eax
ret
cmp    $0x2,%edi
jne    1293 <E_parDrv+0x193>
test   %esi,%esi
jne    1293 <E_parDrv+0x193>
movaps 0xd94(%rip),%xmm0
movups %xmm0,(%rcx)
movabs $0xbff0000000000000,%rax
mov    %rax,0x10(%rcx)
mov    $0x1,%eax
ret
test   %edi,%edi
jne    1243 <E_parDrv+0x143>
cmp    $0x2,%esi
jne    1243 <E_parDrv+0x143>
movaps 0xd5d(%rip),%xmm0
movups %xmm0,(%rcx)
jmp    119e <E_parDrv+0x9e>

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

LLVM IR (-O2):
define i32 @E_parDrv(i32 %0, i32 %1, i32 %2, [2 x double]* nocapture writeonly %3) {
switch i32 %2, label %56 [
i32 4, label %39
i32 2, label %5
]
5: ; preds = %4
%6 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 1, i64 1
%7 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 1, i64 0
%8 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 0, i64 1
%9 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 0, i64 0
%10 = icmp eq i32 %0, 0
%11 = icmp eq i32 %1, 1
%12 = and i1 %10, %11
%13 = bitcast [2 x double]* %3 to i8*
br i1 %12, label %14, label %15
14: ; preds = %5
store double 1.000000e+00, double* %9
store double 1.000000e+00, double* %6
br label %56
15: ; preds = %5
%16 = icmp eq i32 %0, 1
%17 = icmp eq i32 %1, 0
%18 = and i1 %16, %17
br i1 %18, label %19, label %21
19: ; preds = %15
%20 = bitcast double* %8 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %20
br label %56
21: ; preds = %15
%22 = icmp eq i32 %1, 2
%23 = and i1 %16, %22
br i1 %23, label %24, label %26
24: ; preds = %21
%25 = bitcast double* %8 to <2 x double>*
store <2 x double> <double -1.000000e+00, double 1.000000e+00>, <2 x double>* %25
store double -1.000000e+00, double* %6
br label %56
26: ; preds = %21
%27 = icmp eq i32 %0, 2
%28 = and i1 %27, %11
br i1 %28, label %29, label %31
29: ; preds = %26
store double -1.000000e+00, double* %9
%30 = bitcast double* %7 to <2 x double>*
store <2 x double> <double -1.000000e+00, double 1.000000e+00>, <2 x double>* %30
br label %56
31: ; preds = %26
%32 = and i1 %27, %17
br i1 %32, label %33, label %35
33: ; preds = %31
%34 = bitcast [2 x double]* %3 to <2 x double>*
store <2 x double> <double -1.000000e+00, double 1.000000e+00>, <2 x double>* %34
store double -1.000000e+00, double* %7
br label %56
35: ; preds = %31
%36 = and i1 %10, %22
br i1 %36, label %37, label %56
37: ; preds = %35
%38 = bitcast [2 x double]* %3 to <2 x double>*
store <2 x double> <double 1.000000e+00, double -1.000000e+00>, <2 x double>* %38
store double -1.000000e+00, double* %6
br label %56
39: ; preds = %4
%40 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 2, i64 1
%41 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 2, i64 0
%42 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 1, i64 1
%43 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 1, i64 0
%44 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 0, i64 1
%45 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 0, i64 0
%46 = bitcast [2 x double]* %3 to i8*
switch i32 %0, label %51 [
i32 0, label %47
i32 1, label %48
i32 2, label %49
i32 3, label %50
]
47: ; preds = %39
store double 1.000000e+00, double* %45
br label %51
48: ; preds = %39
store double 1.000000e+00, double* %43
br label %51
49: ; preds = %39
store double 1.000000e+00, double* %41
br label %51
50: ; preds = %39
store double -1.000000e+00, double* %41
store double -1.000000e+00, double* %43
store double -1.000000e+00, double* %45
br label %51
51: ; preds = %39, %47, %49, %50, %48
switch i32 %1, label %56 [
i32 0, label %55
i32 1, label %54
i32 2, label %53
i32 3, label %52
]
52: ; preds = %51
store double -1.000000e+00, double* %40
store double -1.000000e+00, double* %42
store double -1.000000e+00, double* %44
br label %56
53: ; preds = %51
store double 1.000000e+00, double* %40
br label %56
54: ; preds = %51
store double 1.000000e+00, double* %42
br label %56
55: ; preds = %51
store double 1.000000e+00, double* %44
br label %56
56: ; preds = %51, %52, %53, %54, %55, %4, %14, %24, %33, %37, %29, %19, %35
%57 = phi i32 [ 0, %35 ], [ 1, %19 ], [ 1, %29 ], [ 1, %37 ], [ 1, %33 ], [ 1, %24 ], [ 1, %14 ], [ 0, %4 ], [ 1, %55 ], [ 1, %54 ], [ 1, %53 ], [ 1, %52 ], [ 1, %51 ]
ret i32 %57
}