#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double _I_0();
double _I_10(double const, double const *);
double _I_11(double const, double const *);
double _I_12(double const, double const *);
double _I_13(double const, double const *);
double _I_20(double const, double const *);
double _I_21(double const, double const *);
double _I_22(double const, double const *);
double _I_23(double const, double const *);
double _I_30(double const, double const *);
double _I_31(double const, double const *);
double _I_32(double const, double const *);
double _I_33(double const, double const *);
double _I_4();
double _I(const int i, const int ci, const double omega,
          const double vertices_omegas[4]) {
  switch (i) {
  case 0:
    return _I_0();
  case 1:
    switch (ci) {
    case 0:
      return _I_10(omega, vertices_omegas);
    case 1:
      return _I_11(omega, vertices_omegas);
    case 2:
      return _I_12(omega, vertices_omegas);
    case 3:
      return _I_13(omega, vertices_omegas);
    }
  case 2:
    switch (ci) {
    case 0:
      return _I_20(omega, vertices_omegas);
    case 1:
      return _I_21(omega, vertices_omegas);
    case 2:
      return _I_22(omega, vertices_omegas);
    case 3:
      return _I_23(omega, vertices_omegas);
    }
  case 3:
    switch (ci) {
    case 0:
      return _I_30(omega, vertices_omegas);
    case 1:
      return _I_31(omega, vertices_omegas);
    case 2:
      return _I_32(omega, vertices_omegas);
    case 3:
      return _I_33(omega, vertices_omegas);
    }
  case 4:
    return _I_4();
  };
  ;
  ;
  ;
  return 0;
}


x86 assembly (clang, -O0):
<_I>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0xc(%rbp),%eax
mov    %rax,-0x28(%rbp)
sub    $0x4,%rax
ja     13dc <_I+0x1fc>
mov    -0x28(%rbp),%rax
lea    0xded(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    $0x0,%al
call   10e0 <_I_0@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
mov    -0x10(%rbp),%eax
mov    %rax,-0x30(%rbp)
sub    $0x3,%rax
ja     12b2 <_I+0xd2>
mov    -0x30(%rbp),%rax
lea    0xdcb(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   1100 <_I_10@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   1080 <_I_11@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   10f0 <_I_12@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   1070 <_I_13@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
jmp    12b7 <_I+0xd7>
mov    -0x10(%rbp),%eax
mov    %rax,-0x38(%rbp)
sub    $0x3,%rax
ja     133c <_I+0x15c>
mov    -0x38(%rbp),%rax
lea    0xd51(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   1060 <_I_20@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   10b0 <_I_21@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   1050 <_I_22@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   10c0 <_I_23@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
jmp    1341 <_I+0x161>
mov    -0x10(%rbp),%eax
mov    %rax,-0x40(%rbp)
sub    $0x3,%rax
ja     13c6 <_I+0x1e6>
mov    -0x40(%rbp),%rax
lea    0xcd7(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   1030 <_I_30@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   10a0 <_I_31@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   1040 <_I_32@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
movsd  -0x18(%rbp),%xmm0
mov    -0x20(%rbp),%rdi
call   1090 <_I_33@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
jmp    13cb <_I+0x1eb>
mov    $0x0,%al
call   10d0 <_I_4@plt>
movsd  %xmm0,-0x8(%rbp)
jmp    13e4 <_I+0x204>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_I>:
cmp    $0x4,%edi
ja     121d <_I+0x3d>
mov    %edi,%eax
lea    0xe12(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
xor    %eax,%eax
jmp    10e0 <_I_0@plt>
cmp    $0x3,%esi
ja     125f <_I+0x7f>
mov    %esi,%eax
lea    0xe08(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    %rdx,%rdi
jmp    1030 <_I_30@plt>
xorps  %xmm0,%xmm0
ret
cmp    $0x3,%esi
ja     125f <_I+0x7f>
mov    %esi,%eax
lea    0xe05(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    %rdx,%rdi
jmp    1100 <_I_10@plt>
cmp    $0x3,%esi
ja     125f <_I+0x7f>
mov    %esi,%eax
lea    0xdd6(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    %rdx,%rdi
jmp    1060 <_I_20@plt>
xor    %eax,%eax
jmp    10d0 <_I_4@plt>
mov    %rdx,%rdi
jmp    10a0 <_I_31@plt>
mov    %rdx,%rdi
jmp    1040 <_I_32@plt>
mov    %rdx,%rdi
jmp    1090 <_I_33@plt>
mov    %rdx,%rdi
jmp    1080 <_I_11@plt>
mov    %rdx,%rdi
jmp    10f0 <_I_12@plt>
mov    %rdx,%rdi
jmp    1070 <_I_13@plt>
mov    %rdx,%rdi
jmp    10b0 <_I_21@plt>
mov    %rdx,%rdi
jmp    1050 <_I_22@plt>
mov    %rdx,%rdi
jmp    10c0 <_I_23@plt>

LLVM IR (-O0):
define double @_I(i32 %0, i32 %1, double %2, double* %3) {
%5 = alloca double
%6 = alloca i32
%7 = alloca i32
%8 = alloca double
%9 = alloca double*
store i32 %0, i32* %6
store i32 %1, i32* %7
store double %2, double* %8
store double* %3, double** %9
%10 = load i32, i32* %6
switch i32 %10, label %72 [
i32 0, label %11
i32 1, label %13
i32 2, label %32
i32 3, label %51
i32 4, label %70
]
11: ; preds = %4
%12 = call double (...) @_I_0()
store double %12, double* %5
br label %73
13: ; preds = %4
%14 = load i32, i32* %7
switch i32 %14, label %31 [
i32 0, label %15
i32 1, label %19
i32 2, label %23
i32 3, label %27
]
15: ; preds = %13
%16 = load double, double* %8
%17 = load double*, double** %9
%18 = call double @_I_10(double %16, double* %17)
store double %18, double* %5
br label %73
19: ; preds = %13
%20 = load double, double* %8
%21 = load double*, double** %9
%22 = call double @_I_11(double %20, double* %21)
store double %22, double* %5
br label %73
23: ; preds = %13
%24 = load double, double* %8
%25 = load double*, double** %9
%26 = call double @_I_12(double %24, double* %25)
store double %26, double* %5
br label %73
27: ; preds = %13
%28 = load double, double* %8
%29 = load double*, double** %9
%30 = call double @_I_13(double %28, double* %29)
store double %30, double* %5
br label %73
31: ; preds = %13
br label %32
32: ; preds = %4, %31
%33 = load i32, i32* %7
switch i32 %33, label %50 [
i32 0, label %34
i32 1, label %38
i32 2, label %42
i32 3, label %46
]
34: ; preds = %32
%35 = load double, double* %8
%36 = load double*, double** %9
%37 = call double @_I_20(double %35, double* %36)
store double %37, double* %5
br label %73
38: ; preds = %32
%39 = load double, double* %8
%40 = load double*, double** %9
%41 = call double @_I_21(double %39, double* %40)
store double %41, double* %5
br label %73
42: ; preds = %32
%43 = load double, double* %8
%44 = load double*, double** %9
%45 = call double @_I_22(double %43, double* %44)
store double %45, double* %5
br label %73
46: ; preds = %32
%47 = load double, double* %8
%48 = load double*, double** %9
%49 = call double @_I_23(double %47, double* %48)
store double %49, double* %5
br label %73
50: ; preds = %32
br label %51
51: ; preds = %4, %50
%52 = load i32, i32* %7
switch i32 %52, label %69 [
i32 0, label %53
i32 1, label %57
i32 2, label %61
i32 3, label %65
]
53: ; preds = %51
%54 = load double, double* %8
%55 = load double*, double** %9
%56 = call double @_I_30(double %54, double* %55)
store double %56, double* %5
br label %73
57: ; preds = %51
%58 = load double, double* %8
%59 = load double*, double** %9
%60 = call double @_I_31(double %58, double* %59)
store double %60, double* %5
br label %73
61: ; preds = %51
%62 = load double, double* %8
%63 = load double*, double** %9
%64 = call double @_I_32(double %62, double* %63)
store double %64, double* %5
br label %73
65: ; preds = %51
%66 = load double, double* %8
%67 = load double*, double** %9
%68 = call double @_I_33(double %66, double* %67)
store double %68, double* %5
br label %73
69: ; preds = %51
br label %70
70: ; preds = %4, %69
%71 = call double (...) @_I_4()
store double %71, double* %5
br label %73
72: ; preds = %4
store double 0.000000e+00, double* %5
br label %73
73: ; preds = %72, %70, %65, %61, %57, %53, %46, %42, %38, %34, %27, %23, %19, %15, %11
%74 = load double, double* %5
ret double %74
}

LLVM IR (-O2):
define double @_I(i32 %0, i32 %1, double %2, double* %3) {
switch i32 %0, label %36 [
i32 0, label %5
i32 1, label %7
i32 2, label %16
i32 3, label %25
i32 4, label %34
]
5: ; preds = %4
%6 = tail call double (...) @_I_0()
br label %36
7: ; preds = %4
switch i32 %1, label %34 [
i32 0, label %8
i32 1, label %10
i32 2, label %12
i32 3, label %14
]
8: ; preds = %7
%9 = tail call double @_I_10(double %2, double* %3)
br label %36
10: ; preds = %7
%11 = tail call double @_I_11(double %2, double* %3)
br label %36
12: ; preds = %7
%13 = tail call double @_I_12(double %2, double* %3)
br label %36
14: ; preds = %7
%15 = tail call double @_I_13(double %2, double* %3)
br label %36
16: ; preds = %4
switch i32 %1, label %34 [
i32 0, label %17
i32 1, label %19
i32 2, label %21
i32 3, label %23
]
17: ; preds = %16
%18 = tail call double @_I_20(double %2, double* %3)
br label %36
19: ; preds = %16
%20 = tail call double @_I_21(double %2, double* %3)
br label %36
21: ; preds = %16
%22 = tail call double @_I_22(double %2, double* %3)
br label %36
23: ; preds = %16
%24 = tail call double @_I_23(double %2, double* %3)
br label %36
25: ; preds = %4
switch i32 %1, label %34 [
i32 0, label %26
i32 1, label %28
i32 2, label %30
i32 3, label %32
]
26: ; preds = %25
%27 = tail call double @_I_30(double %2, double* %3)
br label %36
28: ; preds = %25
%29 = tail call double @_I_31(double %2, double* %3)
br label %36
30: ; preds = %25
%31 = tail call double @_I_32(double %2, double* %3)
br label %36
32: ; preds = %25
%33 = tail call double @_I_33(double %2, double* %3)
br label %36
34: ; preds = %7, %16, %25, %4
%35 = tail call double (...) @_I_4()
br label %36
36: ; preds = %4, %34, %32, %30, %28, %26, %23, %21, %19, %17, %14, %12, %10, %8, %5
%37 = phi double [ %35, %34 ], [ %33, %32 ], [ %31, %30 ], [ %29, %28 ], [ %27, %26 ], [ %24, %23 ], [ %22, %21 ], [ %20, %19 ], [ %18, %17 ], [ %15, %14 ], [ %13, %12 ], [ %11, %10 ], [ %9, %8 ], [ %6, %5 ], [ 0.000000e+00, %4 ]
ret double %37
}