Problem 829

Integral Fusion - sum_{n=2..31} M(n) where M(n) is smallest integer whose factor tree has the same shape as T(n!!). Uses Miller-Rabin, Pollard rho, shape trees, and min-heap sequence generation.

Answer41768797657018024
Output41768797657018024
StatusPASS
Native helperno
Runtime2600 ms
Peak memory26976 KB
Time complexityO(2^n) (estimated)
Space complexityO(n^2) (estimated)

Performance comparison

MetricOur solutionBest known
Time complexityO(2^n)?
Space complexityO(n^2)?
ApproachFlow solutionNot curated
VerdictUnknown

Flow source

# Project Euler 829
# Integral Fusion - sum_{n=2..31} M(n) where M(n) is smallest integer whose
# factor tree has the same shape as T(n!!).
# Uses Miller-Rabin, Pollard rho, shape trees, and min-heap sequence generation.

extern {
    function calloc(n: i64, size: i64) -> ptr<void>
    function malloc(n: i64) -> ptr<void>
    function realloc(p: ptr<void>, n: i64) -> ptr<void>
    function free(p: ptr<void>) -> void
    function sqrt(x: f64) -> f64
}

struct Factor {
    p: u64,
    e: i32
}

# Pre-allocated global buffers to avoid millions of per-call malloc/free.
let mut g_sp: ptr<u64> = null
let mut g_bases: ptr<u64> = null
let mut g_cvals: ptr<u64> = null
let mut g_fac: ptr<Factor> = null
let mut g_fstack: ptr<u64> = null
let mut g_val_ptr: ptr<u64> = null
let mut g_data_ptr: ptr<i32> = null
let mut g_best_d: i64 = 0

# ---- Miller-Rabin ----

function mulmod_u64(a: u64, b: u64, m: u64) -> u64 {
    return ((a as i128 * b as i128) % (m as i128)) as u64
}

function powmod_u64(a0: u64, d0: u64, n: u64) -> u64 {
    let mut r: u64 = 1
    let mut a: u64 = a0 % n
    let mut d: u64 = d0
    while d != 0 {
        if d % 2 == 1 { r = mulmod_u64(r, a, n) }
        a = mulmod_u64(a, a, n)
        d = d >> 1
    }
    return r
}

function is_prime_u64(n: u64) -> bool {
    if n < 2 { return false }
    let mut i: i32 = 0
    while i < 12 {
        if n == g_sp[i] { return true }
        if n % g_sp[i] == 0 { return false }
        i = i + 1
    }
    let mut d: u64 = n - 1
    let mut s: i32 = 0
    while d % 2 == 0 { d = d / 2; s = s + 1 }
    let mut bi: i32 = 0
    while bi < 7 {
        let a: u64 = g_bases[bi] % n
        if a == 0 { bi = bi + 1; continue }
        let mut x: u64 = powmod_u64(a, d, n)
        if x == 1 || x == n - 1 { bi = bi + 1; continue }
        let mut found: bool = false
        let mut j: i32 = 0
        while j < s - 1 {
            x = mulmod_u64(x, x, n)
            if x == n - 1 { found = true; break }
            j = j + 1
        }
        if !found { return false }
        bi = bi + 1
    }
    return true
}

function gcd_u64(a0: u64, b0: u64) -> u64 {
    let mut a: u64 = a0
    let mut b: u64 = b0
    while b != 0 {
        let t: u64 = a % b
        a = b
        b = t
    }
    return a
}

function pollard_rho_u64(n: u64) -> u64 {
    if n % 2 == 0 { return 2 }
    if n % 3 == 0 { return 3 }
    let mut ci: i32 = 0
    while ci < 9 {
        let c: u64 = g_cvals[ci]
        let mut y: u64 = 2
        let mut x: u64 = 0
        let mut ys: u64 = 0
        let mut g: u64 = 1
        let mut q: u64 = 1
        let mut r: u64 = 1
        let m: u64 = 128
        while g == 1 {
            x = y
            let mut i2: u64 = 0
            while i2 < r {
                y = (mulmod_u64(y, y, n) + c) % n
                i2 = i2 + 1
            }
            let mut k: u64 = 0
            while k < r && g == 1 {
                ys = y
                let lim: u64 = if m < r - k { m } else { r - k }
                let mut i3: u64 = 0
                while i3 < lim {
                    y = (mulmod_u64(y, y, n) + c) % n
                    let diff: u64 = if x > y { x - y } else { y - x }
                    q = mulmod_u64(q, diff, n)
                    i3 = i3 + 1
                }
                g = gcd_u64(q, n)
                k = k + m
            }
            r = r << 1
        }
        if g == n {
            g = 1
            y = ys
            while g == 1 {
                y = (mulmod_u64(y, y, n) + c) % n
                let diff: u64 = if x > y { x - y } else { y - x }
                g = gcd_u64(diff, n)
            }
        }
        if 1 < g && g < n {
            return g
        }
        ci = ci + 1
    }
    let mut d: u64 = 5
    while d <= 1000000 && d * d <= n {
        if n % d == 0 { return d }
        d = d + 2
    }
    return n
}

function factorize_u64(n0: u64, out: ptr<Factor>) -> i32 {
    let mut n: u64 = n0
    let mut nf: i32 = 0
    let mut i: i32 = 0
    while i < 12 {
        if n % g_sp[i] == 0 {
            let mut e: i32 = 0
            while n % g_sp[i] == 0 { n = n / g_sp[i]; e = e + 1 }
            out[nf].p = g_sp[i]
            out[nf].e = e
            nf = nf + 1
        }
        i = i + 1
    }
    let mut sp2: i32 = 0
    if n > 1 { g_fstack[sp2] = n; sp2 = sp2 + 1 }
    while sp2 > 0 {
        sp2 = sp2 - 1
        let m: u64 = g_fstack[sp2]
        if m == 1 { continue }
        if is_prime_u64(m) {
            let mut found: bool = false
            let mut i2: i32 = 0
            while i2 < nf {
                if out[i2].p == m { out[i2].e = out[i2].e + 1; found = true; break }
                i2 = i2 + 1
            }
            if !found { out[nf].p = m; out[nf].e = 1; nf = nf + 1 }
            continue
        }
        let d: u64 = pollard_rho_u64(m)
        if d == m {
            let mut found: bool = false
            let mut i3: i32 = 0
            while i3 < nf {
                if out[i3].p == m { out[i3].e = out[i3].e + 1; found = true; break }
                i3 = i3 + 1
            }
            if !found { out[nf].p = m; out[nf].e = 1; nf = nf + 1 }
            continue
        }
        g_fstack[sp2] = d; sp2 = sp2 + 1
        g_fstack[sp2] = m / d; sp2 = sp2 + 1
    }
    return nf
}

function isqrt_u64(n: u64) -> u64 {
    if n == 0 { return 0 }
    let r: u64 = sqrt(n as f64) as u64
    while r > 0 && r * r > n { r = r - 1 }
    while (r + 1) * (r + 1) <= n { r = r + 1 }
    return r
}

# Branch-and-bound DFS: find the largest divisor of n that is <= sqrt(n),
# without generating all divisors.  Prunes when the current partial divisor
# times the remaining prime-power product cannot beat the best found so far.
# cur * max_rem <= n always holds, so no u64 overflow.
function best_dfs(idx: i32, cur: u64, root: u64, nf: i32, max_rem: u64) -> void {
    if cur > (g_best_d as u64) { g_best_d = cur as i64 }
    if idx >= nf { return }
    if cur * max_rem <= (g_best_d as u64) { return }
    let p: u64 = g_fac[idx].p
    let e: i32 = g_fac[idx].e
    let mut pe_full: u64 = 1
    let mut j: i32 = 0
    while j < e { pe_full = pe_full * p; j = j + 1 }
    let next_rem: u64 = max_rem / pe_full
    let mut pe: u64 = pe_full
    let mut k: i32 = e
    while k >= 0 {
        if cur <= root / pe {
            best_dfs(idx + 1, cur * pe, root, nf, next_rem)
        }
        pe = pe / p
        k = k - 1
    }
}

function best_divisor_le_sqrt(n: u64) -> u64 {
    let nf: i32 = factorize_u64(n, g_fac)
    # Sort factors by prime descending for tighter pruning.
    let mut i: i32 = 1
    while i < nf {
        let key_p: u64 = g_fac[i].p
        let key_e: i32 = g_fac[i].e
        let mut j: i32 = i - 1
        while j >= 0 && g_fac[j].p < key_p {
            g_fac[j + 1].p = g_fac[j].p
            g_fac[j + 1].e = g_fac[j].e
            j = j - 1
        }
        g_fac[j + 1].p = key_p
        g_fac[j + 1].e = key_e
        i = i + 1
    }
    let root: u64 = isqrt_u64(n)
    g_best_d = 1
    best_dfs(0, 1, root, nf, n)
    return g_best_d as u64
}

# ---- Shape tree ----

struct ShapeNode {
    is_leaf: i32,
    left: ptr<ShapeNode>,
    right: ptr<ShapeNode>
}

let mut leaf_node: ptr<ShapeNode> = null

function new_shape(is_leaf: i32, l: ptr<ShapeNode>, r: ptr<ShapeNode>) -> ptr<ShapeNode> {
    let n: ptr<ShapeNode> = malloc(24) as ptr<ShapeNode>
    n[0].is_leaf = is_leaf
    n[0].left = l
    n[0].right = r
    return n
}

function shape_eq(a: ptr<ShapeNode>, b: ptr<ShapeNode>) -> bool {
    if a == b { return true }
    if a[0].is_leaf != b[0].is_leaf { return false }
    if a[0].is_leaf != 0 { return true }
    return shape_eq(a[0].left, b[0].left) && shape_eq(a[0].right, b[0].right)
}

struct SCacheEntry {
    key: u64,
    val: ptr<ShapeNode>
}

let mut scache: ptr<SCacheEntry> = null
let mut scache_count: i32 = 0

function get_shape(n: u64) -> ptr<ShapeNode> {
    let mut i: i32 = 0
    while i < scache_count {
        if scache[i].key == n { return scache[i].val }
        i = i + 1
    }
    let result: ptr<ShapeNode>
    if is_prime_u64(n) {
        result = leaf_node
    } else {
        let d: u64 = best_divisor_le_sqrt(n)
        let mut a: u64 = d
        let mut b: u64 = n / d
        if a > b { let t: u64 = a; a = b; b = t }
        result = new_shape(0, get_shape(a), get_shape(b))
    }
    if scache_count < 8192 {
        scache[scache_count].key = n
        scache[scache_count].val = result
        scache_count = scache_count + 1
    }
    return result
}

function count_leaves(sh: ptr<ShapeNode>) -> i32 {
    if sh[0].is_leaf != 0 { return 1 }
    return count_leaves(sh[0].left) + count_leaves(sh[0].right)
}

function shape_matches(n: u64, sh: ptr<ShapeNode>) -> bool {
    if sh[0].is_leaf != 0 { return is_prime_u64(n) }
    if is_prime_u64(n) { return false }
    let d: u64 = best_divisor_le_sqrt(n)
    let mut a: u64 = d
    let mut b: u64 = n / d
    if a > b { let t: u64 = a; a = b; b = t }
    return shape_eq(get_shape(a), sh[0].left) && shape_eq(get_shape(b), sh[0].right)
}

function next_prime(p: u64) -> u64 {
    if p < 2 { return 2 }
    if p == 2 { return 3 }
    let mut c: u64 = p + 2
    while !is_prime_u64(c) { c = c + 2 }
    return c
}

# ---- Min-heap ----

struct HeapEntry {
    val: u64,
    data: i32
}

# ---- Seq struct ----

struct Seq {
    sh: ptr<ShapeNode>,
    maxval: u64,
    next_prime_val: u64,
    left_idx: i32,
    right_idx: i32,
    heap: ptr<HeapEntry>,
    heap_size: i32,
    heap_cap: i32,
    seen_keys: ptr<i64>,
    seen_count: i32,
    seen_cap: i32,
    values: ptr<u64>,
    val_count: i32,
    val_cap: i32
}

let mut seqs: ptr<ptr<Seq> > = null
let mut seqs_count: i32 = 0

function find_seq(sh: ptr<ShapeNode>) -> ptr<Seq> {
    let mut i: i32 = 0
    while i < seqs_count {
        if seqs[i][0].sh == sh { return seqs[i] }
        i = i + 1
    }
    return null
}

# Forward declarations needed for mutual recursion
# get_value is called by ensure_right_ge, try_push, next_candidate
# next_value is called by get_value
# next_candidate is called by next_value

function hpush(s: ptr<Seq>, val: u64, data: i32) -> void {
    if s[0].heap_size >= s[0].heap_cap {
        s[0].heap_cap = s[0].heap_cap * 2
        s[0].heap = realloc(s[0].heap as ptr<void>, (s[0].heap_cap as i64) * 16) as ptr<HeapEntry>
    }
    let pos: i32 = s[0].heap_size
    s[0].heap_size = s[0].heap_size + 1
    s[0].heap[pos].val = val
    s[0].heap[pos].data = data
    let mut p: i32 = pos
    while p > 0 {
        let pp: i32 = (p - 1) / 2
        if s[0].heap[pp].val <= s[0].heap[p].val { break }
        let t: HeapEntry = s[0].heap[pp]
        s[0].heap[pp] = s[0].heap[p]
        s[0].heap[p] = t
        p = pp
    }
}

function hpop(s: ptr<Seq>, val: ptr<u64>, data: ptr<i32>) -> void {
    val[0] = s[0].heap[0].val
    data[0] = s[0].heap[0].data
    s[0].heap_size = s[0].heap_size - 1
    if s[0].heap_size > 0 {
        s[0].heap[0] = s[0].heap[s[0].heap_size]
        let mut pos: i32 = 0
        let mut cont: bool = true
        while cont {
            let l: i32 = 2 * pos + 1
            let r: i32 = 2 * pos + 2
            let mut sm: i32 = pos
            if l < s[0].heap_size && s[0].heap[l].val < s[0].heap[sm].val { sm = l }
            if r < s[0].heap_size && s[0].heap[r].val < s[0].heap[sm].val { sm = r }
            if sm == pos {
                cont = false
            } else {
                let t: HeapEntry = s[0].heap[pos]
                s[0].heap[pos] = s[0].heap[sm]
                s[0].heap[sm] = t
                pos = sm
            }
        }
    }
}

# Open-addressing hash set for (i,j) pairs.  Key = i*1000000+j (>= 0).
# Stored value = key + 1 so that 0 (from calloc) means empty.
function seen_contains(s: ptr<Seq>, i: i32, j: i32) -> bool {
    let key: i64 = (i as i64) * 1000000 + (j as i64)
    let stored: i64 = key + 1
    let mask: i64 = (s[0].seen_cap as i64) - 1
    let mut h: i64 = (key ^ (key >> 16)) & mask
    while true {
        let v: i64 = s[0].seen_keys[h]
        if v == 0 { return false }
        if v == stored { return true }
        h = (h + 1) & mask
    }
    return false
}

function seen_add(s: ptr<Seq>, i: i32, j: i32) -> void {
    let key: i64 = (i as i64) * 1000000 + (j as i64)
    let stored: i64 = key + 1
    let mask: i64 = (s[0].seen_cap as i64) - 1
    let mut h: i64 = (key ^ (key >> 16)) & mask
    while true {
        let v: i64 = s[0].seen_keys[h]
        if v == 0 {
            s[0].seen_keys[h] = stored
            s[0].seen_count = s[0].seen_count + 1
            if s[0].seen_count * 2 >= s[0].seen_cap {
                # Resize: rehash into a new table.
                let old_keys: ptr<i64> = s[0].seen_keys
                let old_cap: i32 = s[0].seen_cap
                s[0].seen_cap = s[0].seen_cap * 2
                s[0].seen_keys = calloc(s[0].seen_cap as i64, 8) as ptr<i64>
                s[0].seen_count = 0
                let new_mask: i64 = (s[0].seen_cap as i64) - 1
                let mut k: i32 = 0
                while k < old_cap {
                    let ov: i64 = old_keys[k]
                    if ov != 0 {
                        let ok: i64 = ov - 1
                        let mut nh: i64 = (ok ^ (ok >> 16)) & new_mask
                        while s[0].seen_keys[nh] != 0 {
                            nh = (nh + 1) & new_mask
                        }
                        s[0].seen_keys[nh] = ov
                        s[0].seen_count = s[0].seen_count + 1
                    }
                    k = k + 1
                }
                free(old_keys as ptr<void>)
            }
            return
        }
        if v == stored { return }
        h = (h + 1) & mask
    }
}

# Mutual recursion: get_value, next_value, next_candidate, ensure_right_ge, try_push

function get_value(sh: ptr<ShapeNode>, idx: i32) -> u64

function ensure_right_ge(s: ptr<Seq>, x: u64) -> i32 {
    let rs: ptr<Seq> = find_seq(s[0].sh[0].right)
    if rs == null { return -1 }
    if rs[0].val_count == 0 {
        let v: u64 = get_value(s[0].sh[0].right, 0)
        if v == 0 || v > s[0].maxval { return -1 }
    }
    while rs[0].values[rs[0].val_count - 1] < x {
        let v: u64 = get_value(s[0].sh[0].right, rs[0].val_count)
        if v == 0 || v > s[0].maxval { break }
    }
    if rs[0].values[rs[0].val_count - 1] < x { return -1 }
    let mut lo: i32 = 0
    let mut hi: i32 = rs[0].val_count - 1
    while lo < hi {
        let mid: i32 = (lo + hi) / 2
        if rs[0].values[mid] < x { lo = mid + 1 } else { hi = mid }
    }
    return lo
}

function try_push(s: ptr<Seq>, i: i32, j: i32) -> void {
    if seen_contains(s, i, j) { return }
    let a: u64 = get_value(s[0].sh[0].left, i)
    let b: u64 = get_value(s[0].sh[0].right, j)
    if a == 0 || b == 0 { return }
    if a > b { return }
    let prod: u64 = a * b
    if prod > s[0].maxval { return }
    seen_add(s, i, j)
    hpush(s, prod, i * 1000000 + j)
}

function next_candidate(s: ptr<Seq>) -> u64 {
    if s[0].left_idx == 0 && s[0].heap_size == 0 {
        let a0: u64 = get_value(s[0].sh[0].left, 0)
        if a0 == 0 { return 0 }
        let j0: i32 = ensure_right_ge(s, a0)
        if j0 >= 0 { try_push(s, 0, j0) }
        s[0].left_idx = 1
    }

    let val_ptr: ptr<u64> = g_val_ptr
    let data_ptr: ptr<i32> = g_data_ptr

    while true {
        if s[0].heap_size == 0 {
            let a: u64 = get_value(s[0].sh[0].left, s[0].left_idx)
            if a == 0 { return 0 }
            if a * a > s[0].maxval {
                return 0
            }
            let j0: i32 = ensure_right_ge(s, a)
            if j0 < 0 { return 0 }
            try_push(s, s[0].left_idx, j0)
            s[0].left_idx = s[0].left_idx + 1
            continue
        }
        hpop(s, val_ptr, data_ptr)
        let prod: u64 = val_ptr[0]
        let ij: i32 = data_ptr[0]
        let i: i32 = ij / 1000000
        let j: i32 = ij % 1000000

        # Maybe add more i values
        while true {
            let a: u64 = get_value(s[0].sh[0].left, s[0].left_idx)
            if a == 0 { break }
            if a * a > prod && s[0].heap_size > 0 { break }
            let j0: i32 = ensure_right_ge(s, a)
            if j0 >= 0 { try_push(s, s[0].left_idx, j0) }
            s[0].left_idx = s[0].left_idx + 1
        }

        try_push(s, i, j + 1)
        return prod
    }
    return 0
}

function next_value(s: ptr<Seq>) -> u64 {
    if s[0].sh[0].is_leaf != 0 {
        let p: u64 = s[0].next_prime_val
        if p > s[0].maxval { return 0 }
        s[0].next_prime_val = next_prime(p)
        return p
    }
    let last: u64 = if s[0].val_count > 0 { s[0].values[s[0].val_count - 1] } else { 0 }
    while true {
        let cand: u64 = next_candidate(s)
        if cand == 0 { return 0 }
        if last != 0 && cand == last { continue }
        if shape_matches(cand, s[0].sh) { return cand }
    }
    return 0
}

function get_value(sh: ptr<ShapeNode>, idx: i32) -> u64 {
    let s: ptr<Seq> = find_seq(sh)
    if s == null { return 0 }
    while s[0].val_count <= idx {
        let v: u64 = next_value(s)
        if v == 0 { return 0 }
        if s[0].val_count >= s[0].val_cap {
            s[0].val_cap = s[0].val_cap * 2
            s[0].values = realloc(s[0].values as ptr<void>, (s[0].val_cap as i64) * 8) as ptr<u64>
        }
        s[0].values[s[0].val_count] = v
        s[0].val_count = s[0].val_count + 1
    }
    return s[0].values[idx]
}

# Collect all unique subshapes
let mut all_shapes_arr: ptr<ptr<ShapeNode> > = null
let mut all_shapes_arr_count: i32 = 0
let mut all_shapes_arr_cap: i32 = 0

function collect_shape(sh: ptr<ShapeNode>) -> void {
    let mut i: i32 = 0
    while i < all_shapes_arr_count {
        if all_shapes_arr[i] == sh { return }
        i = i + 1
    }
    if all_shapes_arr_count >= all_shapes_arr_cap {
        if all_shapes_arr_cap == 0 { all_shapes_arr_cap = 64 } else { all_shapes_arr_cap = all_shapes_arr_cap * 2 }
        all_shapes_arr = realloc(all_shapes_arr as ptr<void>, (all_shapes_arr_cap as i64) * 8) as ptr<ptr<ShapeNode> >
    }
    all_shapes_arr[all_shapes_arr_count] = sh
    all_shapes_arr_count = all_shapes_arr_count + 1
    if sh[0].is_leaf == 0 {
        collect_shape(sh[0].left)
        collect_shape(sh[0].right)
    }
}

function double_factorial(n: i32) -> u64 {
    let mut r: u64 = 1
    let mut k: i32 = n
    while k > 1 {
        r = r * (k as u64)
        k = k - 2
    }
    return r
}

function main() -> i32 {
    leaf_node = new_shape(1, null, null)

    # Initialize pre-allocated global buffers.
    g_sp = calloc(12, 8) as ptr<u64>
    g_sp[0]=2; g_sp[1]=3; g_sp[2]=5; g_sp[3]=7; g_sp[4]=11; g_sp[5]=13
    g_sp[6]=17; g_sp[7]=19; g_sp[8]=23; g_sp[9]=29; g_sp[10]=31; g_sp[11]=37
    g_bases = calloc(7, 8) as ptr<u64>
    g_bases[0]=2; g_bases[1]=325; g_bases[2]=9375; g_bases[3]=28178
    g_bases[4]=450775; g_bases[5]=9780504; g_bases[6]=1795265022
    g_cvals = calloc(9, 8) as ptr<u64>
    g_cvals[0]=1; g_cvals[1]=3; g_cvals[2]=5; g_cvals[3]=7; g_cvals[4]=11
    g_cvals[5]=13; g_cvals[6]=17; g_cvals[7]=19; g_cvals[8]=23
    g_fac = calloc(20, 16) as ptr<Factor>
    g_fstack = calloc(64, 8) as ptr<u64>
    g_val_ptr = calloc(1, 8) as ptr<u64>
    g_data_ptr = calloc(1, 4) as ptr<i32>

    let max_n: i32 = 31
    let maxval: u64 = double_factorial(max_n)

    # Shape cache
    scache = calloc(8192, 16) as ptr<SCacheEntry>
    scache_count = 0

    let targets: ptr<ptr<ShapeNode> > = calloc(32, 8) as ptr<ptr<ShapeNode> >
    let mut n: i32 = 2
    while n <= max_n {
        targets[n] = get_shape(double_factorial(n))
        n = n + 1
    }

    all_shapes_arr = null
    all_shapes_arr_count = 0
    all_shapes_arr_cap = 0
    n = 2
    while n <= max_n {
        collect_shape(targets[n])
        n = n + 1
    }

    # Sort by leaf count (insertion sort)
    let mut i: i32 = 1
    while i < all_shapes_arr_count {
        let key: ptr<ShapeNode> = all_shapes_arr[i]
        let mut j: i32 = i - 1
        while j >= 0 && count_leaves(all_shapes_arr[j]) > count_leaves(key) {
            all_shapes_arr[j + 1] = all_shapes_arr[j]
            j = j - 1
        }
        all_shapes_arr[j + 1] = key
        i = i + 1
    }

    # Create sequences
    seqs = malloc((all_shapes_arr_count as i64) * 8) as ptr<ptr<Seq> >
    seqs_count = 0
    i = 0
    while i < all_shapes_arr_count {
        let s: ptr<Seq> = calloc(1, 80) as ptr<Seq>
        s[0].sh = all_shapes_arr[i]
        s[0].maxval = maxval
        s[0].next_prime_val = 2
        s[0].left_idx = 0
        s[0].heap_cap = 4096
        s[0].heap = malloc((s[0].heap_cap as i64) * 16) as ptr<HeapEntry>
        s[0].heap_size = 0
        s[0].seen_cap = 256
        s[0].seen_keys = calloc(s[0].seen_cap as i64, 8) as ptr<i64>
        s[0].seen_count = 0
        s[0].val_cap = 256
        s[0].values = malloc((s[0].val_cap as i64) * 8) as ptr<u64>
        s[0].val_count = 0
        seqs[seqs_count] = s
        seqs_count = seqs_count + 1
        i = i + 1
    }

    let mut total: u64 = 0
    n = 2
    while n <= max_n {
        let m: u64 = get_value(targets[n], 0)
        total = total + m
        n = n + 1
    }

    printf("%lld\n", total as i64)
    return 0
}

Generated C

#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Flow runtime helpers */
typedef struct flow_temp_node { struct flow_temp_node* next; } flow_temp_node;
static flow_temp_node* flow_temp_head = NULL;
static int flow_temp_atexit_set = 0;
__attribute__((unused)) static void flow_temp_free_all(void) {
    while (flow_temp_head) {
        flow_temp_node* n = flow_temp_head;
        flow_temp_head = n->next;
        free(n);
    }
}
__attribute__((unused)) static void* flow_temp_alloc(size_t nbytes) {
    flow_temp_node* node = (flow_temp_node*)malloc(sizeof(flow_temp_node) + nbytes);
    if (!node) return NULL;
    node->next = flow_temp_head;
    flow_temp_head = node;
    if (!flow_temp_atexit_set) {
        flow_temp_atexit_set = 1;
        atexit(flow_temp_free_all);
    }
    return (void*)(node + 1);
}
#ifndef FLOW_DIAG
#define FLOW_DIAG(msg) fprintf(stderr, "%s", (msg))
#endif
#ifndef FLOW_LOG
#define FLOW_LOG(fmt, ...) printf(fmt, __VA_ARGS__)
#endif
#ifndef FLOW_LOG_EMPTY
#define FLOW_LOG_EMPTY(fmt) printf(fmt)
#endif
static char* flow_strcat(const char* a, const char* b) {
    size_t la = strlen(a ? a : ""), lb = strlen(b ? b : "");
    char* r = (char*)flow_temp_alloc(la + lb + 1);
    if (!r) return NULL;
    if (la) memcpy(r, a, la);
    if (lb) memcpy(r + la, b, lb);
    r[la + lb] = '\0';
    return r;
}

#define __flow_in_arr(arr, val) __extension__ ({ \
    int _found = 0; \
    size_t _n = sizeof(arr)/sizeof((arr)[0]); \
    for (size_t _i = 0; _i < _n; _i++) { \
        if ((arr)[_i] == (val)) { _found = 1; break; } \
    } _found; })

/* Unified fault handler (MISRA #279) — override with -DFLOW_FAULT_HANDLER=fn */
#ifndef FLOW_FAULT_HANDLER
__attribute__((unused)) static inline void flow_fault_handler(const char* msg) {
    fprintf(stderr, "flow: %s\n", msg ? msg : "fault");
    abort();
#if defined(__GNUC__) || defined(__clang__)
    __builtin_unreachable();
#endif
}
#else
#define flow_fault_handler FLOW_FAULT_HANDLER
#endif
#define flow_div_by_zero_handler() flow_fault_handler("division by zero")
#define flow_shift_ub_handler() flow_fault_handler("invalid shift (amount out of range or left-shift of negative)")

#ifndef FLOW_CHECKED_DIV
#define FLOW_CHECKED_DIV(L, R) (((R) != 0) ? ((L) / (R)) : (flow_div_by_zero_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_MOD
#define FLOW_CHECKED_MOD(L, R) (((R) != 0) ? ((L) % (R)) : (flow_div_by_zero_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_SHL
#define FLOW_CHECKED_SHL(L, R) ((((R) >= 0) && ((unsigned long long)(R) < (sizeof(L) * 8ull)) && ((L) >= 0)) ? ((L) << (R)) : (flow_shift_ub_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_SHR
#define FLOW_CHECKED_SHR(L, R) ((((R) >= 0) && ((unsigned long long)(R) < (sizeof(L) * 8ull))) ? ((L) >> (R)) : (flow_shift_ub_handler(), (L) * 0))
#endif

#include <math.h>

void* _ui_state = NULL;

static inline float i32_to_f32(int32_t v) { return (float)v; }

/* Host stub for @gpu kernels (device codegen replaces this). */
static inline int32_t gpu_thread_id(void) { return 0; }

typedef struct Factor Factor;
typedef struct HeapEntry HeapEntry;
typedef struct SCacheEntry SCacheEntry;
typedef struct Seq Seq;
typedef struct ShapeNode ShapeNode;

struct Factor {
    uint64_t p;
    int32_t e;
};

struct HeapEntry {
    uint64_t val;
    int32_t data;
};

struct SCacheEntry {
    uint64_t key;
    ShapeNode* val;
};

struct Seq {
    ShapeNode* sh;
    uint64_t maxval;
    uint64_t next_prime_val;
    int32_t left_idx;
    int32_t right_idx;
    HeapEntry* heap;
    int32_t heap_size;
    int32_t heap_cap;
    int64_t* seen_keys;
    int32_t seen_count;
    int32_t seen_cap;
    uint64_t* values;
    int32_t val_count;
    int32_t val_cap;
};

struct ShapeNode {
    int32_t is_leaf;
    ShapeNode* left;
    ShapeNode* right;
};

uint64_t mulmod_u64_u64_u64_u64(uint64_t a, uint64_t b, uint64_t m);
uint64_t powmod_u64_u64_u64_u64(uint64_t a0, uint64_t d0, uint64_t n);
bool is_prime_u64_u64(uint64_t n);
uint64_t gcd_u64_u64_u64(uint64_t a0, uint64_t b0);
uint64_t pollard_rho_u64_u64(uint64_t n);
int32_t factorize_u64_u64_ptr_Factor(uint64_t n0, Factor* out);
uint64_t isqrt_u64_u64(uint64_t n);
void best_dfs_i32_u64_u64_i32_u64(int32_t idx, uint64_t cur, uint64_t root, int32_t nf, uint64_t max_rem);
uint64_t best_divisor_le_sqrt_u64(uint64_t n);
ShapeNode* new_shape_i32_ptr_ShapeNode_ptr_ShapeNode(int32_t is_leaf, ShapeNode* l, ShapeNode* r);
bool shape_eq_ptr_ShapeNode_ptr_ShapeNode(ShapeNode* a, ShapeNode* b);
ShapeNode* get_shape_u64(uint64_t n);
int32_t count_leaves_ptr_ShapeNode(ShapeNode* sh);
bool shape_matches_u64_ptr_ShapeNode(uint64_t n, ShapeNode* sh);
uint64_t next_prime_u64(uint64_t p);
Seq* find_seq_ptr_ShapeNode(ShapeNode* sh);
void hpush_ptr_Seq_u64_i32(Seq* s, uint64_t val, int32_t data);
void hpop_ptr_Seq_ptr_u64_ptr_i32(Seq* s, uint64_t* val, int32_t* data);
bool seen_contains_ptr_Seq_i32_i32(Seq* s, int32_t i, int32_t j);
void seen_add_ptr_Seq_i32_i32(Seq* s, int32_t i, int32_t j);
uint64_t get_value_ptr_ShapeNode_i32(ShapeNode* sh, int32_t idx);
int32_t ensure_right_ge_ptr_Seq_u64(Seq* s, uint64_t x);
void try_push_ptr_Seq_i32_i32(Seq* s, int32_t i, int32_t j);
uint64_t next_candidate_ptr_Seq(Seq* s);
uint64_t next_value_ptr_Seq(Seq* s);
uint64_t get_value_ptr_ShapeNode_i32(ShapeNode* sh, int32_t idx);
void collect_shape_ptr_ShapeNode(ShapeNode* sh);
uint64_t double_factorial_i32(int32_t n);
int32_t main(void);

/* Module statics */
static uint64_t* g_sp = NULL;
static uint64_t* g_bases = NULL;
static uint64_t* g_cvals = NULL;
static Factor* g_fac = NULL;
static uint64_t* g_fstack = NULL;
static uint64_t* g_val_ptr = NULL;
static int32_t* g_data_ptr = NULL;
static int64_t g_best_d = 0;
static ShapeNode* leaf_node = NULL;
static SCacheEntry* scache = NULL;
static int32_t scache_count = 0;
static Seq** seqs = NULL;
static int32_t seqs_count = 0;
static ShapeNode** all_shapes_arr = NULL;
static int32_t all_shapes_arr_count = 0;
static int32_t all_shapes_arr_cap = 0;






uint64_t mulmod_u64_u64_u64_u64(uint64_t a, uint64_t b, uint64_t m) {
    return ((uint64_t)(FLOW_CHECKED_MOD(((((__int128)(a)) * ((__int128)(b)))), (((__int128)(m))))));
}

uint64_t powmod_u64_u64_u64_u64(uint64_t a0, uint64_t d0, uint64_t n) {
    uint64_t r = 1;
    uint64_t a = FLOW_CHECKED_MOD((a0), (n));
    uint64_t d = d0;
    while (d != 0) {
        if (FLOW_CHECKED_MOD((d), (2)) == 1) {
            r = mulmod_u64_u64_u64_u64(r, a, n);
        }
        a = mulmod_u64_u64_u64_u64(a, a, n);
        d = FLOW_CHECKED_SHR((d), (1));
    }
    return r;
}

bool is_prime_u64_u64(uint64_t n) {
    if (n < 2) {
        return 0;
    }
    int32_t i = 0;
    while (i < 12) {
        if (n == g_sp[i]) {
            return 1;
        }
        if (FLOW_CHECKED_MOD((n), (g_sp[i])) == 0) {
            return 0;
        }
        i = (i + 1);
    }
    uint64_t d = (n - 1);
    int32_t s = 0;
    while (FLOW_CHECKED_MOD((d), (2)) == 0) {
        d = FLOW_CHECKED_DIV((d), (2));
        s = (s + 1);
    }
    int32_t bi = 0;
    while (bi < 7) {
        uint64_t a = FLOW_CHECKED_MOD((g_bases[bi]), (n));
        if (a == 0) {
            bi = (bi + 1);
            continue;
        }
        uint64_t x = powmod_u64_u64_u64_u64(a, d, n);
        if ((x == 1 || x == (n - 1))) {
            bi = (bi + 1);
            continue;
        }
        bool found = 0;
        int32_t j = 0;
        while (j < (s - 1)) {
            x = mulmod_u64_u64_u64_u64(x, x, n);
            if (x == (n - 1)) {
                found = 1;
                break;
            }
            j = (j + 1);
        }
        if ((!(found))) {
            return 0;
        }
        bi = (bi + 1);
    }
    return 1;
}

uint64_t gcd_u64_u64_u64(uint64_t a0, uint64_t b0) {
    uint64_t a = a0;
    uint64_t b = b0;
    while (b != 0) {
        uint64_t t = FLOW_CHECKED_MOD((a), (b));
        a = b;
        b = t;
    }
    return a;
}

uint64_t pollard_rho_u64_u64(uint64_t n) {
    if (FLOW_CHECKED_MOD((n), (2)) == 0) {
        return 2;
    }
    if (FLOW_CHECKED_MOD((n), (3)) == 0) {
        return 3;
    }
    int32_t ci = 0;
    while (ci < 9) {
        uint64_t c = g_cvals[ci];
        uint64_t y = 2;
        uint64_t x = 0;
        uint64_t ys = 0;
        uint64_t g = 1;
        uint64_t q = 1;
        uint64_t r = 1;
        uint64_t m = 128;
        while (g == 1) {
            x = y;
            uint64_t i2 = 0;
            while (i2 < r) {
                y = FLOW_CHECKED_MOD(((mulmod_u64_u64_u64_u64(y, y, n) + c)), (n));
                i2 = (i2 + 1);
            }
            uint64_t k = 0;
            while ((k < r && g == 1)) {
                ys = y;
                uint64_t lim = ((m < (r - k)) ? (m) : ((r - k)));
                uint64_t i3 = 0;
                while (i3 < lim) {
                    y = FLOW_CHECKED_MOD(((mulmod_u64_u64_u64_u64(y, y, n) + c)), (n));
                    uint64_t diff = ((x > y) ? ((x - y)) : ((y - x)));
                    q = mulmod_u64_u64_u64_u64(q, diff, n);
                    i3 = (i3 + 1);
                }
                g = gcd_u64_u64_u64(q, n);
                k = (k + m);
            }
            r = FLOW_CHECKED_SHL((r), (1));
        }
        if (g == n) {
            g = 1;
            y = ys;
            while (g == 1) {
                y = FLOW_CHECKED_MOD(((mulmod_u64_u64_u64_u64(y, y, n) + c)), (n));
                uint64_t diff = ((x > y) ? ((x - y)) : ((y - x)));
                g = gcd_u64_u64_u64(diff, n);
            }
        }
        if ((1 < g && g < n)) {
            return g;
        }
        ci = (ci + 1);
    }
    uint64_t d = 5;
    while ((d <= 1000000 && (d * d) <= n)) {
        if (FLOW_CHECKED_MOD((n), (d)) == 0) {
            return d;
        }
        d = (d + 2);
    }
    return n;
}

int32_t factorize_u64_u64_ptr_Factor(uint64_t n0, Factor* out) {
    uint64_t n = n0;
    int32_t nf = 0;
    int32_t i = 0;
    while (i < 12) {
        if (FLOW_CHECKED_MOD((n), (g_sp[i])) == 0) {
            int32_t e = 0;
            while (FLOW_CHECKED_MOD((n), (g_sp[i])) == 0) {
                n = FLOW_CHECKED_DIV((n), (g_sp[i]));
                e = (e + 1);
            }
            out[nf].p = g_sp[i];
            out[nf].e = e;
            nf = (nf + 1);
        }
        i = (i + 1);
    }
    int32_t sp2 = 0;
    if (n > 1) {
        g_fstack[sp2] = n;
        sp2 = (sp2 + 1);
    }
    while (sp2 > 0) {
        sp2 = (sp2 - 1);
        uint64_t m = g_fstack[sp2];
        if (m == 1) {
            continue;
        }
        if (is_prime_u64_u64(m)) {
            bool found = 0;
            int32_t i2 = 0;
            while (i2 < nf) {
                if (out[i2].p == m) {
                    out[i2].e = (out[i2].e + 1);
                    found = 1;
                    break;
                }
                i2 = (i2 + 1);
            }
            if ((!(found))) {
                out[nf].p = m;
                out[nf].e = 1;
                nf = (nf + 1);
            }
            continue;
        }
        uint64_t d = pollard_rho_u64_u64(m);
        if (d == m) {
            bool found = 0;
            int32_t i3 = 0;
            while (i3 < nf) {
                if (out[i3].p == m) {
                    out[i3].e = (out[i3].e + 1);
                    found = 1;
                    break;
                }
                i3 = (i3 + 1);
            }
            if ((!(found))) {
                out[nf].p = m;
                out[nf].e = 1;
                nf = (nf + 1);
            }
            continue;
        }
        g_fstack[sp2] = d;
        sp2 = (sp2 + 1);
        g_fstack[sp2] = FLOW_CHECKED_DIV((m), (d));
        sp2 = (sp2 + 1);
    }
    return nf;
}

uint64_t isqrt_u64_u64(uint64_t n) {
    if (n == 0) {
        return 0;
    }
    uint64_t r = ((uint64_t)(sqrt(((double)(n)))));
    while ((r > 0 && (r * r) > n)) {
        r = (r - 1);
    }
    while (((r + 1) * (r + 1)) <= n) {
        r = (r + 1);
    }
    return r;
}

void best_dfs_i32_u64_u64_i32_u64(int32_t idx, uint64_t cur, uint64_t root, int32_t nf, uint64_t max_rem) {
    if (cur > ((uint64_t)(g_best_d))) {
        g_best_d = ((int64_t)(cur));
    }
    if (idx >= nf) {
        return;
    }
    if ((cur * max_rem) <= ((uint64_t)(g_best_d))) {
        return;
    }
    uint64_t p = g_fac[idx].p;
    int32_t e = g_fac[idx].e;
    uint64_t pe_full = 1;
    int32_t j = 0;
    while (j < e) {
        pe_full = (pe_full * p);
        j = (j + 1);
    }
    uint64_t next_rem = FLOW_CHECKED_DIV((max_rem), (pe_full));
    uint64_t pe = pe_full;
    int32_t k = e;
    while (k >= 0) {
        if (cur <= FLOW_CHECKED_DIV((root), (pe))) {
            best_dfs_i32_u64_u64_i32_u64((idx + 1), (cur * pe), root, nf, next_rem);
        }
        pe = FLOW_CHECKED_DIV((pe), (p));
        k = (k - 1);
    }
}

uint64_t best_divisor_le_sqrt_u64(uint64_t n) {
    int32_t nf = factorize_u64_u64_ptr_Factor(n, g_fac);
    int32_t i = 1;
    while (i < nf) {
        uint64_t key_p = g_fac[i].p;
        int32_t key_e = g_fac[i].e;
        int32_t j = (i - 1);
        while ((j >= 0 && g_fac[j].p < key_p)) {
            g_fac[(j + 1)].p = g_fac[j].p;
            g_fac[(j + 1)].e = g_fac[j].e;
            j = (j - 1);
        }
        g_fac[(j + 1)].p = key_p;
        g_fac[(j + 1)].e = key_e;
        i = (i + 1);
    }
    uint64_t root = isqrt_u64_u64(n);
    g_best_d = 1;
    best_dfs_i32_u64_u64_i32_u64(0, 1, root, nf, n);
    return ((uint64_t)(g_best_d));
}

ShapeNode* new_shape_i32_ptr_ShapeNode_ptr_ShapeNode(int32_t is_leaf, ShapeNode* l, ShapeNode* r) {
    ShapeNode* n = (ShapeNode*)(((ShapeNode*)(malloc(24))));
    n[0].is_leaf = is_leaf;
    n[0].left = l;
    n[0].right = r;
    return n;
}

bool shape_eq_ptr_ShapeNode_ptr_ShapeNode(ShapeNode* a, ShapeNode* b) {
    if (a == b) {
        return 1;
    }
    if (a[0].is_leaf != b[0].is_leaf) {
        return 0;
    }
    if (a[0].is_leaf != 0) {
        return 1;
    }
    return (shape_eq_ptr_ShapeNode_ptr_ShapeNode(a[0].left, b[0].left) && shape_eq_ptr_ShapeNode_ptr_ShapeNode(a[0].right, b[0].right));
}

ShapeNode* get_shape_u64(uint64_t n) {
    int32_t i = 0;
    while (i < scache_count) {
        if (scache[i].key == n) {
            return scache[i].val;
        }
        i = (i + 1);
    }
    ShapeNode* result;
    if (is_prime_u64_u64(n)) {
        result = leaf_node;
    } else {
        uint64_t d = best_divisor_le_sqrt_u64(n);
        uint64_t a = d;
        uint64_t b = FLOW_CHECKED_DIV((n), (d));
        if (a > b) {
            uint64_t t = a;
            a = b;
            b = t;
        }
        result = new_shape_i32_ptr_ShapeNode_ptr_ShapeNode(0, get_shape_u64(a), get_shape_u64(b));
    }
    if (scache_count < 8192) {
        scache[scache_count].key = n;
        scache[scache_count].val = result;
        scache_count = (scache_count + 1);
    }
    return result;
}

int32_t count_leaves_ptr_ShapeNode(ShapeNode* sh) {
    if (sh[0].is_leaf != 0) {
        return 1;
    }
    return (count_leaves_ptr_ShapeNode(sh[0].left) + count_leaves_ptr_ShapeNode(sh[0].right));
}

bool shape_matches_u64_ptr_ShapeNode(uint64_t n, ShapeNode* sh) {
    if (sh[0].is_leaf != 0) {
        return is_prime_u64_u64(n);
    }
    if (is_prime_u64_u64(n)) {
        return 0;
    }
    uint64_t d = best_divisor_le_sqrt_u64(n);
    uint64_t a = d;
    uint64_t b = FLOW_CHECKED_DIV((n), (d));
    if (a > b) {
        uint64_t t = a;
        a = b;
        b = t;
    }
    return (shape_eq_ptr_ShapeNode_ptr_ShapeNode(get_shape_u64(a), sh[0].left) && shape_eq_ptr_ShapeNode_ptr_ShapeNode(get_shape_u64(b), sh[0].right));
}

uint64_t next_prime_u64(uint64_t p) {
    if (p < 2) {
        return 2;
    }
    if (p == 2) {
        return 3;
    }
    uint64_t c = (p + 2);
    while ((!(is_prime_u64_u64(c)))) {
        c = (c + 2);
    }
    return c;
}

Seq* find_seq_ptr_ShapeNode(ShapeNode* sh) {
    int32_t i = 0;
    while (i < seqs_count) {
        if (seqs[i][0].sh == sh) {
            return seqs[i];
        }
        i = (i + 1);
    }
    return NULL;
}

void hpush_ptr_Seq_u64_i32(Seq* s, uint64_t val, int32_t data) {
    if (s[0].heap_size >= s[0].heap_cap) {
        s[0].heap_cap = (s[0].heap_cap * 2);
        s[0].heap = ((HeapEntry*)(realloc(((void*)(s[0].heap)), (((int64_t)(s[0].heap_cap)) * 16))));
    }
    int32_t pos = s[0].heap_size;
    s[0].heap_size = (s[0].heap_size + 1);
    s[0].heap[pos].val = val;
    s[0].heap[pos].data = data;
    int32_t p = pos;
    while (p > 0) {
        int32_t pp = FLOW_CHECKED_DIV(((p - 1)), (2));
        if (s[0].heap[pp].val <= s[0].heap[p].val) {
            break;
        }
        HeapEntry t = s[0].heap[pp];
        s[0].heap[pp] = s[0].heap[p];
        s[0].heap[p] = t;
        p = pp;
    }
}

void hpop_ptr_Seq_ptr_u64_ptr_i32(Seq* s, uint64_t* val, int32_t* data) {
    val[0] = s[0].heap[0].val;
    data[0] = s[0].heap[0].data;
    s[0].heap_size = (s[0].heap_size - 1);
    if (s[0].heap_size > 0) {
        s[0].heap[0] = s[0].heap[s[0].heap_size];
        int32_t pos = 0;
        bool cont = 1;
        while (cont) {
            int32_t l = ((2 * pos) + 1);
            int32_t r = ((2 * pos) + 2);
            int32_t sm = pos;
            if ((l < s[0].heap_size && s[0].heap[l].val < s[0].heap[sm].val)) {
                sm = l;
            }
            if ((r < s[0].heap_size && s[0].heap[r].val < s[0].heap[sm].val)) {
                sm = r;
            }
            if (sm == pos) {
                cont = 0;
            } else {
                HeapEntry t = s[0].heap[pos];
                s[0].heap[pos] = s[0].heap[sm];
                s[0].heap[sm] = t;
                pos = sm;
            }
        }
    }
}

bool seen_contains_ptr_Seq_i32_i32(Seq* s, int32_t i, int32_t j) {
    int64_t key = ((((int64_t)(i)) * 1000000) + ((int64_t)(j)));
    int64_t stored = (key + 1);
    int64_t mask = (((int64_t)(s[0].seen_cap)) - 1);
    int64_t h = ((key ^ FLOW_CHECKED_SHR((key), (16))) & mask);
    while (1) {
        int64_t v = s[0].seen_keys[h];
        if (v == 0) {
            return 0;
        }
        if (v == stored) {
            return 1;
        }
        h = ((h + 1) & mask);
    }
    return 0;
}

void seen_add_ptr_Seq_i32_i32(Seq* s, int32_t i, int32_t j) {
    int64_t key = ((((int64_t)(i)) * 1000000) + ((int64_t)(j)));
    int64_t stored = (key + 1);
    int64_t mask = (((int64_t)(s[0].seen_cap)) - 1);
    int64_t h = ((key ^ FLOW_CHECKED_SHR((key), (16))) & mask);
    while (1) {
        int64_t v = s[0].seen_keys[h];
        if (v == 0) {
            s[0].seen_keys[h] = stored;
            s[0].seen_count = (s[0].seen_count + 1);
            if ((s[0].seen_count * 2) >= s[0].seen_cap) {
                int64_t* old_keys = (int64_t*)(s[0].seen_keys);
                int32_t old_cap = s[0].seen_cap;
                s[0].seen_cap = (s[0].seen_cap * 2);
                s[0].seen_keys = ((int64_t*)(calloc(((int64_t)(s[0].seen_cap)), 8)));
                s[0].seen_count = 0;
                int64_t new_mask = (((int64_t)(s[0].seen_cap)) - 1);
                int32_t k = 0;
                while (k < old_cap) {
                    int64_t ov = old_keys[k];
                    if (ov != 0) {
                        int64_t ok = (ov - 1);
                        int64_t nh = ((ok ^ FLOW_CHECKED_SHR((ok), (16))) & new_mask);
                        while (s[0].seen_keys[nh] != 0) {
                            nh = ((nh + 1) & new_mask);
                        }
                        s[0].seen_keys[nh] = ov;
                        s[0].seen_count = (s[0].seen_count + 1);
                    }
                    k = (k + 1);
                }
                free(((void*)(old_keys)));
            }
            return;
        }
        if (v == stored) {
            return;
        }
        h = ((h + 1) & mask);
    }
}


int32_t ensure_right_ge_ptr_Seq_u64(Seq* s, uint64_t x) {
    Seq* rs = (Seq*)(find_seq_ptr_ShapeNode(s[0].sh[0].right));
    if (rs == NULL) {
        return (-1);
    }
    if (rs[0].val_count == 0) {
        uint64_t v = get_value_ptr_ShapeNode_i32(s[0].sh[0].right, 0);
        if ((v == 0 || v > s[0].maxval)) {
            return (-1);
        }
    }
    while (rs[0].values[(rs[0].val_count - 1)] < x) {
        uint64_t v = get_value_ptr_ShapeNode_i32(s[0].sh[0].right, rs[0].val_count);
        if ((v == 0 || v > s[0].maxval)) {
            break;
        }
    }
    if (rs[0].values[(rs[0].val_count - 1)] < x) {
        return (-1);
    }
    int32_t lo = 0;
    int32_t hi = (rs[0].val_count - 1);
    while (lo < hi) {
        int32_t mid = FLOW_CHECKED_DIV(((lo + hi)), (2));
        if (rs[0].values[mid] < x) {
            lo = (mid + 1);
        } else {
            hi = mid;
        }
    }
    return lo;
}

void try_push_ptr_Seq_i32_i32(Seq* s, int32_t i, int32_t j) {
    if (seen_contains_ptr_Seq_i32_i32(s, i, j)) {
        return;
    }
    uint64_t a = get_value_ptr_ShapeNode_i32(s[0].sh[0].left, i);
    uint64_t b = get_value_ptr_ShapeNode_i32(s[0].sh[0].right, j);
    if ((a == 0 || b == 0)) {
        return;
    }
    if (a > b) {
        return;
    }
    uint64_t prod = (a * b);
    if (prod > s[0].maxval) {
        return;
    }
    seen_add_ptr_Seq_i32_i32(s, i, j);
    hpush_ptr_Seq_u64_i32(s, prod, ((i * 1000000) + j));
}

uint64_t next_candidate_ptr_Seq(Seq* s) {
    if ((s[0].left_idx == 0 && s[0].heap_size == 0)) {
        uint64_t a0 = get_value_ptr_ShapeNode_i32(s[0].sh[0].left, 0);
        if (a0 == 0) {
            return 0;
        }
        int32_t j0 = ensure_right_ge_ptr_Seq_u64(s, a0);
        if (j0 >= 0) {
            try_push_ptr_Seq_i32_i32(s, 0, j0);
        }
        s[0].left_idx = 1;
    }
    uint64_t* val_ptr = (uint64_t*)(g_val_ptr);
    int32_t* data_ptr = (int32_t*)(g_data_ptr);
    while (1) {
        if (s[0].heap_size == 0) {
            uint64_t a = get_value_ptr_ShapeNode_i32(s[0].sh[0].left, s[0].left_idx);
            if (a == 0) {
                return 0;
            }
            if ((a * a) > s[0].maxval) {
                return 0;
            }
            int32_t j0 = ensure_right_ge_ptr_Seq_u64(s, a);
            if (j0 < 0) {
                return 0;
            }
            try_push_ptr_Seq_i32_i32(s, s[0].left_idx, j0);
            s[0].left_idx = (s[0].left_idx + 1);
            continue;
        }
        hpop_ptr_Seq_ptr_u64_ptr_i32(s, val_ptr, data_ptr);
        uint64_t prod = val_ptr[0];
        int32_t ij = data_ptr[0];
        int32_t i = FLOW_CHECKED_DIV((ij), (1000000));
        int32_t j = FLOW_CHECKED_MOD((ij), (1000000));
        while (1) {
            uint64_t a = get_value_ptr_ShapeNode_i32(s[0].sh[0].left, s[0].left_idx);
            if (a == 0) {
                break;
            }
            if (((a * a) > prod && s[0].heap_size > 0)) {
                break;
            }
            int32_t j0 = ensure_right_ge_ptr_Seq_u64(s, a);
            if (j0 >= 0) {
                try_push_ptr_Seq_i32_i32(s, s[0].left_idx, j0);
            }
            s[0].left_idx = (s[0].left_idx + 1);
        }
        try_push_ptr_Seq_i32_i32(s, i, (j + 1));
        return prod;
    }
    return 0;
}

uint64_t next_value_ptr_Seq(Seq* s) {
    if (s[0].sh[0].is_leaf != 0) {
        uint64_t p = s[0].next_prime_val;
        if (p > s[0].maxval) {
            return 0;
        }
        s[0].next_prime_val = next_prime_u64(p);
        return p;
    }
    uint64_t last = ((s[0].val_count > 0) ? (s[0].values[(s[0].val_count - 1)]) : (0));
    while (1) {
        uint64_t cand = next_candidate_ptr_Seq(s);
        if (cand == 0) {
            return 0;
        }
        if ((last != 0 && cand == last)) {
            continue;
        }
        if (shape_matches_u64_ptr_ShapeNode(cand, s[0].sh)) {
            return cand;
        }
    }
    return 0;
}

uint64_t get_value_ptr_ShapeNode_i32(ShapeNode* sh, int32_t idx) {
    Seq* s = (Seq*)(find_seq_ptr_ShapeNode(sh));
    if (s == NULL) {
        return 0;
    }
    while (s[0].val_count <= idx) {
        uint64_t v = next_value_ptr_Seq(s);
        if (v == 0) {
            return 0;
        }
        if (s[0].val_count >= s[0].val_cap) {
            s[0].val_cap = (s[0].val_cap * 2);
            s[0].values = ((uint64_t*)(realloc(((void*)(s[0].values)), (((int64_t)(s[0].val_cap)) * 8))));
        }
        s[0].values[s[0].val_count] = v;
        s[0].val_count = (s[0].val_count + 1);
    }
    return s[0].values[idx];
}

void collect_shape_ptr_ShapeNode(ShapeNode* sh) {
    int32_t i = 0;
    while (i < all_shapes_arr_count) {
        if (all_shapes_arr[i] == sh) {
            return;
        }
        i = (i + 1);
    }
    if (all_shapes_arr_count >= all_shapes_arr_cap) {
        if (all_shapes_arr_cap == 0) {
            all_shapes_arr_cap = 64;
        } else {
            all_shapes_arr_cap = (all_shapes_arr_cap * 2);
        }
        all_shapes_arr = ((ShapeNode**)(realloc(((void*)(all_shapes_arr)), (((int64_t)(all_shapes_arr_cap)) * 8))));
    }
    all_shapes_arr[all_shapes_arr_count] = sh;
    all_shapes_arr_count = (all_shapes_arr_count + 1);
    if (sh[0].is_leaf == 0) {
        collect_shape_ptr_ShapeNode(sh[0].left);
        collect_shape_ptr_ShapeNode(sh[0].right);
    }
}

uint64_t double_factorial_i32(int32_t n) {
    uint64_t r = 1;
    int32_t k = n;
    while (k > 1) {
        r = (r * ((uint64_t)(k)));
        k = (k - 2);
    }
    return r;
}

int32_t main(void) {
    leaf_node = new_shape_i32_ptr_ShapeNode_ptr_ShapeNode(1, NULL, NULL);
    g_sp = ((uint64_t*)(calloc(12, 8)));
    g_sp[0] = 2;
    g_sp[1] = 3;
    g_sp[2] = 5;
    g_sp[3] = 7;
    g_sp[4] = 11;
    g_sp[5] = 13;
    g_sp[6] = 17;
    g_sp[7] = 19;
    g_sp[8] = 23;
    g_sp[9] = 29;
    g_sp[10] = 31;
    g_sp[11] = 37;
    g_bases = ((uint64_t*)(calloc(7, 8)));
    g_bases[0] = 2;
    g_bases[1] = 325;
    g_bases[2] = 9375;
    g_bases[3] = 28178;
    g_bases[4] = 450775;
    g_bases[5] = 9780504;
    g_bases[6] = 1795265022;
    g_cvals = ((uint64_t*)(calloc(9, 8)));
    g_cvals[0] = 1;
    g_cvals[1] = 3;
    g_cvals[2] = 5;
    g_cvals[3] = 7;
    g_cvals[4] = 11;
    g_cvals[5] = 13;
    g_cvals[6] = 17;
    g_cvals[7] = 19;
    g_cvals[8] = 23;
    g_fac = ((Factor*)(calloc(20, 16)));
    g_fstack = ((uint64_t*)(calloc(64, 8)));
    g_val_ptr = ((uint64_t*)(calloc(1, 8)));
    g_data_ptr = ((int32_t*)(calloc(1, 4)));
    int32_t max_n = 31;
    uint64_t maxval = double_factorial_i32(max_n);
    scache = ((SCacheEntry*)(calloc(8192, 16)));
    scache_count = 0;
    ShapeNode** targets = (ShapeNode**)(((ShapeNode**)(calloc(32, 8))));
    int32_t n = 2;
    while (n <= max_n) {
        targets[n] = get_shape_u64(double_factorial_i32(n));
        n = (n + 1);
    }
    all_shapes_arr = NULL;
    all_shapes_arr_count = 0;
    all_shapes_arr_cap = 0;
    n = 2;
    while (n <= max_n) {
        collect_shape_ptr_ShapeNode(targets[n]);
        n = (n + 1);
    }
    int32_t i = 1;
    while (i < all_shapes_arr_count) {
        ShapeNode* key = (ShapeNode*)(all_shapes_arr[i]);
        int32_t j = (i - 1);
        while ((j >= 0 && count_leaves_ptr_ShapeNode(all_shapes_arr[j]) > count_leaves_ptr_ShapeNode(key))) {
            all_shapes_arr[(j + 1)] = all_shapes_arr[j];
            j = (j - 1);
        }
        all_shapes_arr[(j + 1)] = key;
        i = (i + 1);
    }
    seqs = ((Seq**)(malloc((((int64_t)(all_shapes_arr_count)) * 8))));
    seqs_count = 0;
    i = 0;
    while (i < all_shapes_arr_count) {
        Seq* s = (Seq*)(((Seq*)(calloc(1, 80))));
        s[0].sh = all_shapes_arr[i];
        s[0].maxval = maxval;
        s[0].next_prime_val = 2;
        s[0].left_idx = 0;
        s[0].heap_cap = 4096;
        s[0].heap = ((HeapEntry*)(malloc((((int64_t)(s[0].heap_cap)) * 16))));
        s[0].heap_size = 0;
        s[0].seen_cap = 256;
        s[0].seen_keys = ((int64_t*)(calloc(((int64_t)(s[0].seen_cap)), 8)));
        s[0].seen_count = 0;
        s[0].val_cap = 256;
        s[0].values = ((uint64_t*)(malloc((((int64_t)(s[0].val_cap)) * 8))));
        s[0].val_count = 0;
        seqs[seqs_count] = s;
        seqs_count = (seqs_count + 1);
        i = (i + 1);
    }
    uint64_t total = 0;
    n = 2;
    while (n <= max_n) {
        uint64_t m = get_value_ptr_ShapeNode_i32(targets[n], 0);
        total = (total + m);
        n = (n + 1);
    }
    printf("%lld\n", ((int64_t)(total)));
    return 0;
}

Generated MLIR

module {
  llvm.func @printf(!llvm.ptr, ...) -> i32
  llvm.mlir.global internal constant @str_0("%lld\n\00") {addr_space = 0 : i32} : !llvm.array<6 x i8>
  func.func private @calloc(i64, i64) -> !llvm.ptr
  func.func private @malloc(i64) -> !llvm.ptr
  func.func private @realloc(!llvm.ptr, i64) -> !llvm.ptr
  func.func private @free(!llvm.ptr) -> ()
  func.func private @sqrt(f64) -> f64
  // Struct: Factor
  // Fields:
  //   p: i64
  //   e: i32
  // Module static: g_sp
  llvm.mlir.global internal @g_sp() {addr_space = 0 : i32} : !llvm.ptr {
    %0 = llvm.mlir.zero : !llvm.ptr
    llvm.return %0 : !llvm.ptr
  }
  // Module static: g_bases
  llvm.mlir.global internal @g_bases() {addr_space = 0 : i32} : !llvm.ptr {
    %1 = llvm.mlir.zero : !llvm.ptr
    llvm.return %1 : !llvm.ptr
  }
  // Module static: g_cvals
  llvm.mlir.global internal @g_cvals() {addr_space = 0 : i32} : !llvm.ptr {
    %2 = llvm.mlir.zero : !llvm.ptr
    llvm.return %2 : !llvm.ptr
  }
  // Module static: g_fac
  llvm.mlir.global internal @g_fac() {addr_space = 0 : i32} : !llvm.ptr {
    %3 = llvm.mlir.zero : !llvm.ptr
    llvm.return %3 : !llvm.ptr
  }
  // Module static: g_fstack
  llvm.mlir.global internal @g_fstack() {addr_space = 0 : i32} : !llvm.ptr {
    %4 = llvm.mlir.zero : !llvm.ptr
    llvm.return %4 : !llvm.ptr
  }
  // Module static: g_val_ptr
  llvm.mlir.global internal @g_val_ptr() {addr_space = 0 : i32} : !llvm.ptr {
    %5 = llvm.mlir.zero : !llvm.ptr
    llvm.return %5 : !llvm.ptr
  }
  // Module static: g_data_ptr
  llvm.mlir.global internal @g_data_ptr() {addr_space = 0 : i32} : !llvm.ptr {
    %6 = llvm.mlir.zero : !llvm.ptr
    llvm.return %6 : !llvm.ptr
  }
  // Module static: g_best_d
  llvm.mlir.global internal @g_best_d(0 : i64) : i64
  func.func @mulmod_u64(%arg0: i64, %arg1: i64, %arg2: i64) -> i64 {
    %7 = arith.extui %arg0 : i64 to i128
    %8 = arith.extui %arg1 : i64 to i128
    %10 = arith.trunci %7 : i128 to i64
    %11 = arith.trunci %8 : i128 to i64
    %9 = arith.muli %10, %11 : i64
    %12 = arith.extui %arg2 : i64 to i128
    %14 = arith.trunci %12 : i128 to i64
    %13 = arith.remsi %9, %14 : i64
    func.return %13 : i64
  }
  func.func @powmod_u64(%arg0: i64, %arg1: i64, %arg2: i64) -> i64 {
    %15 = arith.constant 1 : i32
    %16 = arith.extsi %15 : i32 to i64
    %17 = llvm.mlir.constant(1 : i64) : i64
    %18 = llvm.alloca %17 x i64 : (i64) -> !llvm.ptr
    llvm.store %16, %18 : i64, !llvm.ptr
    %19 = arith.remui %arg0, %arg2 : i64
    %20 = llvm.mlir.constant(1 : i64) : i64
    %21 = llvm.alloca %20 x i64 : (i64) -> !llvm.ptr
    llvm.store %19, %21 : i64, !llvm.ptr
    %22 = llvm.mlir.constant(1 : i64) : i64
    %23 = llvm.alloca %22 x i64 : (i64) -> !llvm.ptr
    llvm.store %arg1, %23 : i64, !llvm.ptr
    cf.br ^bb0
    ^bb0:
    %24 = llvm.load %23 : !llvm.ptr -> i64
    %25 = arith.constant 0 : i32
    %27 = arith.extsi %25 : i32 to i64
    %26 = arith.cmpi ne, %24, %27 : i64
    cf.cond_br %26, ^bb1, ^bb2
    ^bb1:
      %28 = llvm.load %23 : !llvm.ptr -> i64
      %29 = arith.constant 2 : i32
      %31 = arith.extsi %29 : i32 to i64
      %30 = arith.remui %28, %31 : i64
      %32 = arith.constant 1 : i32
      %34 = arith.extsi %32 : i32 to i64
      %33 = arith.cmpi eq, %30, %34 : i64
      cf.cond_br %33, ^bb3, ^bb4
      ^bb3:
        %36 = llvm.load %18 : !llvm.ptr -> i64
        %37 = llvm.load %21 : !llvm.ptr -> i64
        %35 = func.call @mulmod_u64(%36, %37, %arg2) : (i64, i64, i64) -> i64
        llvm.store %35, %18 : i64, !llvm.ptr
        cf.br ^bb5
      ^bb4:
        cf.br ^bb5
      ^bb5:
      %39 = llvm.load %21 : !llvm.ptr -> i64
      %40 = llvm.load %21 : !llvm.ptr -> i64
      %38 = func.call @mulmod_u64(%39, %40, %arg2) : (i64, i64, i64) -> i64
      llvm.store %38, %21 : i64, !llvm.ptr
      %41 = llvm.load %23 : !llvm.ptr -> i64
      %42 = arith.constant 1 : i32
      %44 = arith.extsi %42 : i32 to i64
      %43 = arith.shrui %41, %44 : i64
      llvm.store %43, %23 : i64, !llvm.ptr
      cf.br ^bb0
    ^bb2:
    %45 = llvm.load %18 : !llvm.ptr -> i64
    func.return %45 : i64
  }
  func.func @is_prime_u64(%arg0: i64) -> i1 {
    %46 = arith.constant 2 : i32
    %48 = arith.extsi %46 : i32 to i64
    %47 = arith.cmpi ult, %arg0, %48 : i64
    cf.cond_br %47, ^bb6, ^bb7
    ^bb6:
      %49 = arith.constant 0 : i1
      func.return %49 : i1
    ^bb7:
      cf.br ^bb8
    ^bb8:
    %50 = arith.constant 0 : i32
    %51 = llvm.mlir.constant(1 : i64) : i64
    %52 = llvm.alloca %51 x i32 : (i64) -> !llvm.ptr
    llvm.store %50, %52 : i32, !llvm.ptr
    cf.br ^bb9
    ^bb9:
    %53 = llvm.load %52 : !llvm.ptr -> i32
    %54 = arith.constant 12 : i32
    %55 = arith.cmpi slt, %53, %54 : i32
    cf.cond_br %55, ^bb10, ^bb11
    ^bb10:
      %57 = llvm.mlir.addressof @g_sp : !llvm.ptr
      %58 = llvm.load %57 : !llvm.ptr -> !llvm.ptr
      %59 = llvm.load %52 : !llvm.ptr -> i32
      %60 = arith.extsi %59 : i32 to i64
      %61 = llvm.getelementptr %58[%60] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %56 = llvm.load %61 : !llvm.ptr -> i64
      %62 = arith.cmpi eq, %arg0, %56 : i64
      cf.cond_br %62, ^bb12, ^bb13
      ^bb12:
        %63 = arith.constant 1 : i1
        func.return %63 : i1
      ^bb13:
        cf.br ^bb14
      ^bb14:
      %65 = llvm.mlir.addressof @g_sp : !llvm.ptr
      %66 = llvm.load %65 : !llvm.ptr -> !llvm.ptr
      %67 = llvm.load %52 : !llvm.ptr -> i32
      %68 = arith.extsi %67 : i32 to i64
      %69 = llvm.getelementptr %66[%68] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %64 = llvm.load %69 : !llvm.ptr -> i64
      %70 = arith.remui %arg0, %64 : i64
      %71 = arith.constant 0 : i32
      %73 = arith.extsi %71 : i32 to i64
      %72 = arith.cmpi eq, %70, %73 : i64
      cf.cond_br %72, ^bb15, ^bb16
      ^bb15:
        %74 = arith.constant 0 : i1
        func.return %74 : i1
      ^bb16:
        cf.br ^bb17
      ^bb17:
      %75 = llvm.load %52 : !llvm.ptr -> i32
      %76 = arith.constant 1 : i32
      %77 = arith.addi %75, %76 : i32
      llvm.store %77, %52 : i32, !llvm.ptr
      cf.br ^bb9
    ^bb11:
    %78 = arith.constant 1 : i32
    %80 = arith.extsi %78 : i32 to i64
    %79 = arith.subi %arg0, %80 : i64
    %81 = llvm.mlir.constant(1 : i64) : i64
    %82 = llvm.alloca %81 x i64 : (i64) -> !llvm.ptr
    llvm.store %79, %82 : i64, !llvm.ptr
    %83 = arith.constant 0 : i32
    %84 = llvm.mlir.constant(1 : i64) : i64
    %85 = llvm.alloca %84 x i32 : (i64) -> !llvm.ptr
    llvm.store %83, %85 : i32, !llvm.ptr
    cf.br ^bb18
    ^bb18:
    %86 = llvm.load %82 : !llvm.ptr -> i64
    %87 = arith.constant 2 : i32
    %89 = arith.extsi %87 : i32 to i64
    %88 = arith.remui %86, %89 : i64
    %90 = arith.constant 0 : i32
    %92 = arith.extsi %90 : i32 to i64
    %91 = arith.cmpi eq, %88, %92 : i64
    cf.cond_br %91, ^bb19, ^bb20
    ^bb19:
      %93 = llvm.load %82 : !llvm.ptr -> i64
      %94 = arith.constant 2 : i32
      %96 = arith.extsi %94 : i32 to i64
      %95 = arith.divui %93, %96 : i64
      llvm.store %95, %82 : i64, !llvm.ptr
      %97 = llvm.load %85 : !llvm.ptr -> i32
      %98 = arith.constant 1 : i32
      %99 = arith.addi %97, %98 : i32
      llvm.store %99, %85 : i32, !llvm.ptr
      cf.br ^bb18
    ^bb20:
    %100 = arith.constant 0 : i32
    %101 = llvm.mlir.constant(1 : i64) : i64
    %102 = llvm.alloca %101 x i32 : (i64) -> !llvm.ptr
    llvm.store %100, %102 : i32, !llvm.ptr
    cf.br ^bb21
    ^bb21:
    %103 = llvm.load %102 : !llvm.ptr -> i32
    %104 = arith.constant 7 : i32
    %105 = arith.cmpi slt, %103, %104 : i32
    cf.cond_br %105, ^bb22, ^bb23
    ^bb22:
      %107 = llvm.mlir.addressof @g_bases : !llvm.ptr
      %108 = llvm.load %107 : !llvm.ptr -> !llvm.ptr
      %109 = llvm.load %102 : !llvm.ptr -> i32
      %110 = arith.extsi %109 : i32 to i64
      %111 = llvm.getelementptr %108[%110] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %106 = llvm.load %111 : !llvm.ptr -> i64
      %112 = arith.remui %106, %arg0 : i64
      %113 = arith.constant 0 : i32
      %115 = arith.extsi %113 : i32 to i64
      %114 = arith.cmpi eq, %112, %115 : i64
      cf.cond_br %114, ^bb24, ^bb25
      ^bb24:
        %116 = llvm.load %102 : !llvm.ptr -> i32
        %117 = arith.constant 1 : i32
        %118 = arith.addi %116, %117 : i32
        llvm.store %118, %102 : i32, !llvm.ptr
        cf.br ^bb21
      ^bb25:
        cf.br ^bb26
      ^bb26:
      %120 = llvm.load %82 : !llvm.ptr -> i64
      %119 = func.call @powmod_u64(%112, %120, %arg0) : (i64, i64, i64) -> i64
      %121 = llvm.mlir.constant(1 : i64) : i64
      %122 = llvm.alloca %121 x i64 : (i64) -> !llvm.ptr
      llvm.store %119, %122 : i64, !llvm.ptr
      %123 = llvm.load %122 : !llvm.ptr -> i64
      %124 = arith.constant 1 : i32
      %126 = arith.extsi %124 : i32 to i64
      %125 = arith.cmpi eq, %123, %126 : i64
      %127 = scf.if %125 -> (i1) {
        %128 = arith.constant true
        scf.yield %128 : i1
      } else {
        %129 = llvm.load %122 : !llvm.ptr -> i64
        %130 = arith.constant 1 : i32
        %132 = arith.extsi %130 : i32 to i64
        %131 = arith.subi %arg0, %132 : i64
        %133 = arith.cmpi eq, %129, %131 : i64
        scf.yield %133 : i1
      }
      cf.cond_br %127, ^bb27, ^bb28
      ^bb27:
        %134 = llvm.load %102 : !llvm.ptr -> i32
        %135 = arith.constant 1 : i32
        %136 = arith.addi %134, %135 : i32
        llvm.store %136, %102 : i32, !llvm.ptr
        cf.br ^bb21
      ^bb28:
        cf.br ^bb29
      ^bb29:
      %137 = arith.constant 0 : i1
      %138 = llvm.mlir.constant(1 : i64) : i64
      %139 = llvm.alloca %138 x i1 : (i64) -> !llvm.ptr
      llvm.store %137, %139 : i1, !llvm.ptr
      %140 = arith.constant 0 : i32
      %141 = llvm.mlir.constant(1 : i64) : i64
      %142 = llvm.alloca %141 x i32 : (i64) -> !llvm.ptr
      llvm.store %140, %142 : i32, !llvm.ptr
      cf.br ^bb30
      ^bb30:
      %143 = llvm.load %142 : !llvm.ptr -> i32
      %144 = llvm.load %85 : !llvm.ptr -> i32
      %145 = arith.constant 1 : i32
      %146 = arith.subi %144, %145 : i32
      %147 = arith.cmpi slt, %143, %146 : i32
      cf.cond_br %147, ^bb31, ^bb32
      ^bb31:
        %149 = llvm.load %122 : !llvm.ptr -> i64
        %150 = llvm.load %122 : !llvm.ptr -> i64
        %148 = func.call @mulmod_u64(%149, %150, %arg0) : (i64, i64, i64) -> i64
        llvm.store %148, %122 : i64, !llvm.ptr
        %151 = llvm.load %122 : !llvm.ptr -> i64
        %152 = arith.constant 1 : i32
        %154 = arith.extsi %152 : i32 to i64
        %153 = arith.subi %arg0, %154 : i64
        %155 = arith.cmpi eq, %151, %153 : i64
        cf.cond_br %155, ^bb33, ^bb34
        ^bb33:
          %156 = arith.constant 1 : i1
          llvm.store %156, %139 : i1, !llvm.ptr
          cf.br ^bb32
        ^bb34:
          cf.br ^bb35
        ^bb35:
        %157 = llvm.load %142 : !llvm.ptr -> i32
        %158 = arith.constant 1 : i32
        %159 = arith.addi %157, %158 : i32
        llvm.store %159, %142 : i32, !llvm.ptr
        cf.br ^bb30
      ^bb32:
      %160 = llvm.load %139 : !llvm.ptr -> i1
      %162 = arith.constant 1 : i1
      %161 = arith.xori %160, %162 : i1
      cf.cond_br %161, ^bb36, ^bb37
      ^bb36:
        %164 = arith.constant 0 : i1
        func.return %164 : i1
      ^bb37:
        cf.br ^bb38
      ^bb38:
      %165 = llvm.load %102 : !llvm.ptr -> i32
      %166 = arith.constant 1 : i32
      %167 = arith.addi %165, %166 : i32
      llvm.store %167, %102 : i32, !llvm.ptr
      cf.br ^bb21
    ^bb23:
    %168 = arith.constant 1 : i1
    func.return %168 : i1
  }
  func.func @gcd_u64(%arg0: i64, %arg1: i64) -> i64 {
    %169 = llvm.mlir.constant(1 : i64) : i64
    %170 = llvm.alloca %169 x i64 : (i64) -> !llvm.ptr
    llvm.store %arg0, %170 : i64, !llvm.ptr
    %171 = llvm.mlir.constant(1 : i64) : i64
    %172 = llvm.alloca %171 x i64 : (i64) -> !llvm.ptr
    llvm.store %arg1, %172 : i64, !llvm.ptr
    cf.br ^bb39
    ^bb39:
    %173 = llvm.load %172 : !llvm.ptr -> i64
    %174 = arith.constant 0 : i32
    %176 = arith.extsi %174 : i32 to i64
    %175 = arith.cmpi ne, %173, %176 : i64
    cf.cond_br %175, ^bb40, ^bb41
    ^bb40:
      %177 = llvm.load %170 : !llvm.ptr -> i64
      %178 = llvm.load %172 : !llvm.ptr -> i64
      %179 = arith.remui %177, %178 : i64
      %180 = llvm.load %172 : !llvm.ptr -> i64
      llvm.store %180, %170 : i64, !llvm.ptr
      llvm.store %179, %172 : i64, !llvm.ptr
      cf.br ^bb39
    ^bb41:
    %181 = llvm.load %170 : !llvm.ptr -> i64
    func.return %181 : i64
  }
  func.func @pollard_rho_u64(%arg0: i64) -> i64 {
    %182 = arith.constant 2 : i32
    %184 = arith.extsi %182 : i32 to i64
    %183 = arith.remui %arg0, %184 : i64
    %185 = arith.constant 0 : i32
    %187 = arith.extsi %185 : i32 to i64
    %186 = arith.cmpi eq, %183, %187 : i64
    cf.cond_br %186, ^bb42, ^bb43
    ^bb42:
      %188 = arith.constant 2 : i32
      %189 = arith.extsi %188 : i32 to i64
      func.return %189 : i64
    ^bb43:
      cf.br ^bb44
    ^bb44:
    %190 = arith.constant 3 : i32
    %192 = arith.extsi %190 : i32 to i64
    %191 = arith.remui %arg0, %192 : i64
    %193 = arith.constant 0 : i32
    %195 = arith.extsi %193 : i32 to i64
    %194 = arith.cmpi eq, %191, %195 : i64
    cf.cond_br %194, ^bb45, ^bb46
    ^bb45:
      %196 = arith.constant 3 : i32
      %197 = arith.extsi %196 : i32 to i64
      func.return %197 : i64
    ^bb46:
      cf.br ^bb47
    ^bb47:
    %198 = arith.constant 0 : i32
    %199 = llvm.mlir.constant(1 : i64) : i64
    %200 = llvm.alloca %199 x i32 : (i64) -> !llvm.ptr
    llvm.store %198, %200 : i32, !llvm.ptr
    cf.br ^bb48
    ^bb48:
    %201 = llvm.load %200 : !llvm.ptr -> i32
    %202 = arith.constant 9 : i32
    %203 = arith.cmpi slt, %201, %202 : i32
    cf.cond_br %203, ^bb49, ^bb50
    ^bb49:
      %205 = llvm.mlir.addressof @g_cvals : !llvm.ptr
      %206 = llvm.load %205 : !llvm.ptr -> !llvm.ptr
      %207 = llvm.load %200 : !llvm.ptr -> i32
      %208 = arith.extsi %207 : i32 to i64
      %209 = llvm.getelementptr %206[%208] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %204 = llvm.load %209 : !llvm.ptr -> i64
      %210 = arith.constant 2 : i32
      %211 = arith.extsi %210 : i32 to i64
      %212 = llvm.mlir.constant(1 : i64) : i64
      %213 = llvm.alloca %212 x i64 : (i64) -> !llvm.ptr
      llvm.store %211, %213 : i64, !llvm.ptr
      %214 = arith.constant 0 : i32
      %215 = arith.extsi %214 : i32 to i64
      %216 = llvm.mlir.constant(1 : i64) : i64
      %217 = llvm.alloca %216 x i64 : (i64) -> !llvm.ptr
      llvm.store %215, %217 : i64, !llvm.ptr
      %218 = arith.constant 0 : i32
      %219 = arith.extsi %218 : i32 to i64
      %220 = llvm.mlir.constant(1 : i64) : i64
      %221 = llvm.alloca %220 x i64 : (i64) -> !llvm.ptr
      llvm.store %219, %221 : i64, !llvm.ptr
      %222 = arith.constant 1 : i32
      %223 = arith.extsi %222 : i32 to i64
      %224 = llvm.mlir.constant(1 : i64) : i64
      %225 = llvm.alloca %224 x i64 : (i64) -> !llvm.ptr
      llvm.store %223, %225 : i64, !llvm.ptr
      %226 = arith.constant 1 : i32
      %227 = arith.extsi %226 : i32 to i64
      %228 = llvm.mlir.constant(1 : i64) : i64
      %229 = llvm.alloca %228 x i64 : (i64) -> !llvm.ptr
      llvm.store %227, %229 : i64, !llvm.ptr
      %230 = arith.constant 1 : i32
      %231 = arith.extsi %230 : i32 to i64
      %232 = llvm.mlir.constant(1 : i64) : i64
      %233 = llvm.alloca %232 x i64 : (i64) -> !llvm.ptr
      llvm.store %231, %233 : i64, !llvm.ptr
      %234 = arith.constant 128 : i32
      %235 = arith.extsi %234 : i32 to i64
      cf.br ^bb51
      ^bb51:
      %236 = llvm.load %225 : !llvm.ptr -> i64
      %237 = arith.constant 1 : i32
      %239 = arith.extsi %237 : i32 to i64
      %238 = arith.cmpi eq, %236, %239 : i64
      cf.cond_br %238, ^bb52, ^bb53
      ^bb52:
        %240 = llvm.load %213 : !llvm.ptr -> i64
        llvm.store %240, %217 : i64, !llvm.ptr
        %241 = arith.constant 0 : i32
        %242 = arith.extsi %241 : i32 to i64
        %243 = llvm.mlir.constant(1 : i64) : i64
        %244 = llvm.alloca %243 x i64 : (i64) -> !llvm.ptr
        llvm.store %242, %244 : i64, !llvm.ptr
        cf.br ^bb54
        ^bb54:
        %245 = llvm.load %244 : !llvm.ptr -> i64
        %246 = llvm.load %233 : !llvm.ptr -> i64
        %247 = arith.cmpi ult, %245, %246 : i64
        cf.cond_br %247, ^bb55, ^bb56
        ^bb55:
          %249 = llvm.load %213 : !llvm.ptr -> i64
          %250 = llvm.load %213 : !llvm.ptr -> i64
          %248 = func.call @mulmod_u64(%249, %250, %arg0) : (i64, i64, i64) -> i64
          %251 = arith.addi %248, %204 : i64
          %252 = arith.remui %251, %arg0 : i64
          llvm.store %252, %213 : i64, !llvm.ptr
          %253 = llvm.load %244 : !llvm.ptr -> i64
          %254 = arith.constant 1 : i32
          %256 = arith.extsi %254 : i32 to i64
          %255 = arith.addi %253, %256 : i64
          llvm.store %255, %244 : i64, !llvm.ptr
          cf.br ^bb54
        ^bb56:
        %257 = arith.constant 0 : i32
        %258 = arith.extsi %257 : i32 to i64
        %259 = llvm.mlir.constant(1 : i64) : i64
        %260 = llvm.alloca %259 x i64 : (i64) -> !llvm.ptr
        llvm.store %258, %260 : i64, !llvm.ptr
        cf.br ^bb57
        ^bb57:
        %261 = llvm.load %260 : !llvm.ptr -> i64
        %262 = llvm.load %233 : !llvm.ptr -> i64
        %263 = arith.cmpi ult, %261, %262 : i64
        %264 = scf.if %263 -> (i1) {
          %265 = llvm.load %225 : !llvm.ptr -> i64
          %266 = arith.constant 1 : i32
          %268 = arith.extsi %266 : i32 to i64
          %267 = arith.cmpi eq, %265, %268 : i64
          scf.yield %267 : i1
        } else {
          %269 = arith.constant false
          scf.yield %269 : i1
        }
        cf.cond_br %264, ^bb58, ^bb59
        ^bb58:
          %270 = llvm.load %213 : !llvm.ptr -> i64
          llvm.store %270, %221 : i64, !llvm.ptr
          %271 = llvm.load %233 : !llvm.ptr -> i64
          %272 = llvm.load %260 : !llvm.ptr -> i64
          %273 = arith.subi %271, %272 : i64
          %274 = arith.cmpi ult, %235, %273 : i64
          %275 = scf.if %274 -> (i64) {
            scf.yield %235 : i64
          } else {
            %276 = llvm.load %233 : !llvm.ptr -> i64
            %277 = llvm.load %260 : !llvm.ptr -> i64
            %278 = arith.subi %276, %277 : i64
            scf.yield %278 : i64
          }
          %279 = arith.constant 0 : i32
          %280 = arith.extsi %279 : i32 to i64
          %281 = llvm.mlir.constant(1 : i64) : i64
          %282 = llvm.alloca %281 x i64 : (i64) -> !llvm.ptr
          llvm.store %280, %282 : i64, !llvm.ptr
          cf.br ^bb60
          ^bb60:
          %283 = llvm.load %282 : !llvm.ptr -> i64
          %284 = arith.cmpi ult, %283, %275 : i64
          cf.cond_br %284, ^bb61, ^bb62
          ^bb61:
            %286 = llvm.load %213 : !llvm.ptr -> i64
            %287 = llvm.load %213 : !llvm.ptr -> i64
            %285 = func.call @mulmod_u64(%286, %287, %arg0) : (i64, i64, i64) -> i64
            %288 = arith.addi %285, %204 : i64
            %289 = arith.remui %288, %arg0 : i64
            llvm.store %289, %213 : i64, !llvm.ptr
            %290 = llvm.load %217 : !llvm.ptr -> i64
            %291 = llvm.load %213 : !llvm.ptr -> i64
            %292 = arith.cmpi ugt, %290, %291 : i64
            %293 = scf.if %292 -> (i64) {
              %294 = llvm.load %217 : !llvm.ptr -> i64
              %295 = llvm.load %213 : !llvm.ptr -> i64
              %296 = arith.subi %294, %295 : i64
              scf.yield %296 : i64
            } else {
              %297 = llvm.load %213 : !llvm.ptr -> i64
              %298 = llvm.load %217 : !llvm.ptr -> i64
              %299 = arith.subi %297, %298 : i64
              scf.yield %299 : i64
            }
            %301 = llvm.load %229 : !llvm.ptr -> i64
            %300 = func.call @mulmod_u64(%301, %293, %arg0) : (i64, i64, i64) -> i64
            llvm.store %300, %229 : i64, !llvm.ptr
            %302 = llvm.load %282 : !llvm.ptr -> i64
            %303 = arith.constant 1 : i32
            %305 = arith.extsi %303 : i32 to i64
            %304 = arith.addi %302, %305 : i64
            llvm.store %304, %282 : i64, !llvm.ptr
            cf.br ^bb60
          ^bb62:
          %307 = llvm.load %229 : !llvm.ptr -> i64
          %306 = func.call @gcd_u64(%307, %arg0) : (i64, i64) -> i64
          llvm.store %306, %225 : i64, !llvm.ptr
          %308 = llvm.load %260 : !llvm.ptr -> i64
          %309 = arith.addi %308, %235 : i64
          llvm.store %309, %260 : i64, !llvm.ptr
          cf.br ^bb57
        ^bb59:
        %310 = llvm.load %233 : !llvm.ptr -> i64
        %311 = arith.constant 1 : i32
        %313 = arith.extsi %311 : i32 to i64
        %312 = arith.shli %310, %313 : i64
        llvm.store %312, %233 : i64, !llvm.ptr
        cf.br ^bb51
      ^bb53:
      %314 = llvm.load %225 : !llvm.ptr -> i64
      %315 = arith.cmpi eq, %314, %arg0 : i64
      cf.cond_br %315, ^bb63, ^bb64
      ^bb63:
        %316 = arith.constant 1 : i32
        %317 = arith.extsi %316 : i32 to i64
        llvm.store %317, %225 : i64, !llvm.ptr
        %318 = llvm.load %221 : !llvm.ptr -> i64
        llvm.store %318, %213 : i64, !llvm.ptr
        cf.br ^bb66
        ^bb66:
        %319 = llvm.load %225 : !llvm.ptr -> i64
        %320 = arith.constant 1 : i32
        %322 = arith.extsi %320 : i32 to i64
        %321 = arith.cmpi eq, %319, %322 : i64
        cf.cond_br %321, ^bb67, ^bb68
        ^bb67:
          %324 = llvm.load %213 : !llvm.ptr -> i64
          %325 = llvm.load %213 : !llvm.ptr -> i64
          %323 = func.call @mulmod_u64(%324, %325, %arg0) : (i64, i64, i64) -> i64
          %326 = arith.addi %323, %204 : i64
          %327 = arith.remui %326, %arg0 : i64
          llvm.store %327, %213 : i64, !llvm.ptr
          %328 = llvm.load %217 : !llvm.ptr -> i64
          %329 = llvm.load %213 : !llvm.ptr -> i64
          %330 = arith.cmpi ugt, %328, %329 : i64
          %331 = scf.if %330 -> (i64) {
            %332 = llvm.load %217 : !llvm.ptr -> i64
            %333 = llvm.load %213 : !llvm.ptr -> i64
            %334 = arith.subi %332, %333 : i64
            scf.yield %334 : i64
          } else {
            %335 = llvm.load %213 : !llvm.ptr -> i64
            %336 = llvm.load %217 : !llvm.ptr -> i64
            %337 = arith.subi %335, %336 : i64
            scf.yield %337 : i64
          }
          %338 = func.call @gcd_u64(%331, %arg0) : (i64, i64) -> i64
          llvm.store %338, %225 : i64, !llvm.ptr
          cf.br ^bb66
        ^bb68:
        cf.br ^bb65
      ^bb64:
        cf.br ^bb65
      ^bb65:
      %339 = arith.constant 1 : i32
      %340 = llvm.load %225 : !llvm.ptr -> i64
      %342 = arith.extsi %339 : i32 to i64
      %341 = arith.cmpi ult, %342, %340 : i64
      %343 = scf.if %341 -> (i1) {
        %344 = llvm.load %225 : !llvm.ptr -> i64
        %345 = arith.cmpi ult, %344, %arg0 : i64
        scf.yield %345 : i1
      } else {
        %346 = arith.constant false
        scf.yield %346 : i1
      }
      cf.cond_br %343, ^bb69, ^bb70
      ^bb69:
        %347 = llvm.load %225 : !llvm.ptr -> i64
        func.return %347 : i64
      ^bb70:
        cf.br ^bb71
      ^bb71:
      %348 = llvm.load %200 : !llvm.ptr -> i32
      %349 = arith.constant 1 : i32
      %350 = arith.addi %348, %349 : i32
      llvm.store %350, %200 : i32, !llvm.ptr
      cf.br ^bb48
    ^bb50:
    %351 = arith.constant 5 : i32
    %352 = arith.extsi %351 : i32 to i64
    %353 = llvm.mlir.constant(1 : i64) : i64
    %354 = llvm.alloca %353 x i64 : (i64) -> !llvm.ptr
    llvm.store %352, %354 : i64, !llvm.ptr
    cf.br ^bb72
    ^bb72:
    %355 = llvm.load %354 : !llvm.ptr -> i64
    %356 = arith.constant 1000000 : i32
    %358 = arith.extsi %356 : i32 to i64
    %357 = arith.cmpi ule, %355, %358 : i64
    %359 = scf.if %357 -> (i1) {
      %360 = llvm.load %354 : !llvm.ptr -> i64
      %361 = llvm.load %354 : !llvm.ptr -> i64
      %362 = arith.muli %360, %361 : i64
      %363 = arith.cmpi ule, %362, %arg0 : i64
      scf.yield %363 : i1
    } else {
      %364 = arith.constant false
      scf.yield %364 : i1
    }
    cf.cond_br %359, ^bb73, ^bb74
    ^bb73:
      %365 = llvm.load %354 : !llvm.ptr -> i64
      %366 = arith.remui %arg0, %365 : i64
      %367 = arith.constant 0 : i32
      %369 = arith.extsi %367 : i32 to i64
      %368 = arith.cmpi eq, %366, %369 : i64
      cf.cond_br %368, ^bb75, ^bb76
      ^bb75:
        %370 = llvm.load %354 : !llvm.ptr -> i64
        func.return %370 : i64
      ^bb76:
        cf.br ^bb77
      ^bb77:
      %371 = llvm.load %354 : !llvm.ptr -> i64
      %372 = arith.constant 2 : i32
      %374 = arith.extsi %372 : i32 to i64
      %373 = arith.addi %371, %374 : i64
      llvm.store %373, %354 : i64, !llvm.ptr
      cf.br ^bb72
    ^bb74:
    func.return %arg0 : i64
  }
  func.func @factorize_u64(%arg0: i64, %arg1: !llvm.ptr) -> i32 {
    %375 = llvm.mlir.constant(1 : i64) : i64
    %376 = llvm.alloca %375 x i64 : (i64) -> !llvm.ptr
    llvm.store %arg0, %376 : i64, !llvm.ptr
    %377 = arith.constant 0 : i32
    %378 = llvm.mlir.constant(1 : i64) : i64
    %379 = llvm.alloca %378 x i32 : (i64) -> !llvm.ptr
    llvm.store %377, %379 : i32, !llvm.ptr
    %380 = arith.constant 0 : i32
    %381 = llvm.mlir.constant(1 : i64) : i64
    %382 = llvm.alloca %381 x i32 : (i64) -> !llvm.ptr
    llvm.store %380, %382 : i32, !llvm.ptr
    cf.br ^bb78
    ^bb78:
    %383 = llvm.load %382 : !llvm.ptr -> i32
    %384 = arith.constant 12 : i32
    %385 = arith.cmpi slt, %383, %384 : i32
    cf.cond_br %385, ^bb79, ^bb80
    ^bb79:
      %386 = llvm.load %376 : !llvm.ptr -> i64
      %388 = llvm.mlir.addressof @g_sp : !llvm.ptr
      %389 = llvm.load %388 : !llvm.ptr -> !llvm.ptr
      %390 = llvm.load %382 : !llvm.ptr -> i32
      %391 = arith.extsi %390 : i32 to i64
      %392 = llvm.getelementptr %389[%391] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %387 = llvm.load %392 : !llvm.ptr -> i64
      %393 = arith.remui %386, %387 : i64
      %394 = arith.constant 0 : i32
      %396 = arith.extsi %394 : i32 to i64
      %395 = arith.cmpi eq, %393, %396 : i64
      cf.cond_br %395, ^bb81, ^bb82
      ^bb81:
        %397 = arith.constant 0 : i32
        %398 = llvm.mlir.constant(1 : i64) : i64
        %399 = llvm.alloca %398 x i32 : (i64) -> !llvm.ptr
        llvm.store %397, %399 : i32, !llvm.ptr
        cf.br ^bb84
        ^bb84:
        %400 = llvm.load %376 : !llvm.ptr -> i64
        %402 = llvm.mlir.addressof @g_sp : !llvm.ptr
        %403 = llvm.load %402 : !llvm.ptr -> !llvm.ptr
        %404 = llvm.load %382 : !llvm.ptr -> i32
        %405 = arith.extsi %404 : i32 to i64
        %406 = llvm.getelementptr %403[%405] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        %401 = llvm.load %406 : !llvm.ptr -> i64
        %407 = arith.remui %400, %401 : i64
        %408 = arith.constant 0 : i32
        %410 = arith.extsi %408 : i32 to i64
        %409 = arith.cmpi eq, %407, %410 : i64
        cf.cond_br %409, ^bb85, ^bb86
        ^bb85:
          %411 = llvm.load %376 : !llvm.ptr -> i64
          %413 = llvm.mlir.addressof @g_sp : !llvm.ptr
          %414 = llvm.load %413 : !llvm.ptr -> !llvm.ptr
          %415 = llvm.load %382 : !llvm.ptr -> i32
          %416 = arith.extsi %415 : i32 to i64
          %417 = llvm.getelementptr %414[%416] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %412 = llvm.load %417 : !llvm.ptr -> i64
          %418 = arith.divui %411, %412 : i64
          llvm.store %418, %376 : i64, !llvm.ptr
          %419 = llvm.load %399 : !llvm.ptr -> i32
          %420 = arith.constant 1 : i32
          %421 = arith.addi %419, %420 : i32
          llvm.store %421, %399 : i32, !llvm.ptr
          cf.br ^bb84
        ^bb86:
        %423 = llvm.mlir.addressof @g_sp : !llvm.ptr
        %424 = llvm.load %423 : !llvm.ptr -> !llvm.ptr
        %425 = llvm.load %382 : !llvm.ptr -> i32
        %426 = arith.extsi %425 : i32 to i64
        %427 = llvm.getelementptr %424[%426] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        %422 = llvm.load %427 : !llvm.ptr -> i64
        %428 = llvm.load %379 : !llvm.ptr -> i32
        %429 = arith.extsi %428 : i32 to i64
        %430 = llvm.getelementptr %arg1[%429] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %431 = llvm.getelementptr %430[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        llvm.store %422, %431 : i64, !llvm.ptr
        %432 = llvm.load %399 : !llvm.ptr -> i32
        %433 = llvm.load %379 : !llvm.ptr -> i32
        %434 = arith.extsi %433 : i32 to i64
        %435 = llvm.getelementptr %arg1[%434] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %436 = llvm.getelementptr %435[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        llvm.store %432, %436 : i32, !llvm.ptr
        %437 = llvm.load %379 : !llvm.ptr -> i32
        %438 = arith.constant 1 : i32
        %439 = arith.addi %437, %438 : i32
        llvm.store %439, %379 : i32, !llvm.ptr
        cf.br ^bb83
      ^bb82:
        cf.br ^bb83
      ^bb83:
      %440 = llvm.load %382 : !llvm.ptr -> i32
      %441 = arith.constant 1 : i32
      %442 = arith.addi %440, %441 : i32
      llvm.store %442, %382 : i32, !llvm.ptr
      cf.br ^bb78
    ^bb80:
    %443 = arith.constant 0 : i32
    %444 = llvm.mlir.constant(1 : i64) : i64
    %445 = llvm.alloca %444 x i32 : (i64) -> !llvm.ptr
    llvm.store %443, %445 : i32, !llvm.ptr
    %446 = llvm.load %376 : !llvm.ptr -> i64
    %447 = arith.constant 1 : i32
    %449 = arith.extsi %447 : i32 to i64
    %448 = arith.cmpi ugt, %446, %449 : i64
    cf.cond_br %448, ^bb87, ^bb88
    ^bb87:
      %450 = llvm.load %376 : !llvm.ptr -> i64
      %451 = llvm.mlir.addressof @g_fstack : !llvm.ptr
      %452 = llvm.load %451 : !llvm.ptr -> !llvm.ptr
      %453 = llvm.load %445 : !llvm.ptr -> i32
      %454 = arith.extsi %453 : i32 to i64
      %455 = llvm.getelementptr %452[%454] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %450, %455 : i64, !llvm.ptr
      %456 = llvm.load %445 : !llvm.ptr -> i32
      %457 = arith.constant 1 : i32
      %458 = arith.addi %456, %457 : i32
      llvm.store %458, %445 : i32, !llvm.ptr
      cf.br ^bb89
    ^bb88:
      cf.br ^bb89
    ^bb89:
    cf.br ^bb90
    ^bb90:
    %459 = llvm.load %445 : !llvm.ptr -> i32
    %460 = arith.constant 0 : i32
    %461 = arith.cmpi sgt, %459, %460 : i32
    cf.cond_br %461, ^bb91, ^bb92
    ^bb91:
      %462 = llvm.load %445 : !llvm.ptr -> i32
      %463 = arith.constant 1 : i32
      %464 = arith.subi %462, %463 : i32
      llvm.store %464, %445 : i32, !llvm.ptr
      %466 = llvm.mlir.addressof @g_fstack : !llvm.ptr
      %467 = llvm.load %466 : !llvm.ptr -> !llvm.ptr
      %468 = llvm.load %445 : !llvm.ptr -> i32
      %469 = arith.extsi %468 : i32 to i64
      %470 = llvm.getelementptr %467[%469] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %465 = llvm.load %470 : !llvm.ptr -> i64
      %471 = arith.constant 1 : i32
      %473 = arith.extsi %471 : i32 to i64
      %472 = arith.cmpi eq, %465, %473 : i64
      cf.cond_br %472, ^bb93, ^bb94
      ^bb93:
        cf.br ^bb90
      ^bb94:
        cf.br ^bb95
      ^bb95:
      %474 = func.call @is_prime_u64(%465) : (i64) -> i1
      cf.cond_br %474, ^bb96, ^bb97
      ^bb96:
        %475 = arith.constant 0 : i1
        %476 = llvm.mlir.constant(1 : i64) : i64
        %477 = llvm.alloca %476 x i1 : (i64) -> !llvm.ptr
        llvm.store %475, %477 : i1, !llvm.ptr
        %478 = arith.constant 0 : i32
        %479 = llvm.mlir.constant(1 : i64) : i64
        %480 = llvm.alloca %479 x i32 : (i64) -> !llvm.ptr
        llvm.store %478, %480 : i32, !llvm.ptr
        cf.br ^bb99
        ^bb99:
        %481 = llvm.load %480 : !llvm.ptr -> i32
        %482 = llvm.load %379 : !llvm.ptr -> i32
        %483 = arith.cmpi slt, %481, %482 : i32
        cf.cond_br %483, ^bb100, ^bb101
        ^bb100:
          %485 = llvm.load %480 : !llvm.ptr -> i32
          %486 = arith.extsi %485 : i32 to i64
          %487 = llvm.getelementptr %arg1[%486] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %484 = llvm.load %487 : !llvm.ptr -> !llvm.struct<(i64, i32)>
          %488 = llvm.load %480 : !llvm.ptr -> i32
          %489 = arith.extsi %488 : i32 to i64
          %490 = llvm.getelementptr %arg1[%489] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %491 = llvm.getelementptr %490[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %492 = llvm.load %491 : !llvm.ptr -> i64
          %493 = arith.cmpi eq, %492, %465 : i64
          cf.cond_br %493, ^bb102, ^bb103
          ^bb102:
            %495 = llvm.load %480 : !llvm.ptr -> i32
            %496 = arith.extsi %495 : i32 to i64
            %497 = llvm.getelementptr %arg1[%496] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            %494 = llvm.load %497 : !llvm.ptr -> !llvm.struct<(i64, i32)>
            %498 = llvm.load %480 : !llvm.ptr -> i32
            %499 = arith.extsi %498 : i32 to i64
            %500 = llvm.getelementptr %arg1[%499] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            %501 = llvm.getelementptr %500[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            %502 = llvm.load %501 : !llvm.ptr -> i32
            %503 = arith.constant 1 : i32
            %504 = arith.addi %502, %503 : i32
            %505 = llvm.load %480 : !llvm.ptr -> i32
            %506 = arith.extsi %505 : i32 to i64
            %507 = llvm.getelementptr %arg1[%506] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            %508 = llvm.getelementptr %507[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            llvm.store %504, %508 : i32, !llvm.ptr
            %509 = arith.constant 1 : i1
            llvm.store %509, %477 : i1, !llvm.ptr
            cf.br ^bb101
          ^bb103:
            cf.br ^bb104
          ^bb104:
          %510 = llvm.load %480 : !llvm.ptr -> i32
          %511 = arith.constant 1 : i32
          %512 = arith.addi %510, %511 : i32
          llvm.store %512, %480 : i32, !llvm.ptr
          cf.br ^bb99
        ^bb101:
        %513 = llvm.load %477 : !llvm.ptr -> i1
        %515 = arith.constant 1 : i1
        %514 = arith.xori %513, %515 : i1
        cf.cond_br %514, ^bb105, ^bb106
        ^bb105:
          %517 = llvm.load %379 : !llvm.ptr -> i32
          %518 = arith.extsi %517 : i32 to i64
          %519 = llvm.getelementptr %arg1[%518] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %520 = llvm.getelementptr %519[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          llvm.store %465, %520 : i64, !llvm.ptr
          %521 = arith.constant 1 : i32
          %522 = llvm.load %379 : !llvm.ptr -> i32
          %523 = arith.extsi %522 : i32 to i64
          %524 = llvm.getelementptr %arg1[%523] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %525 = llvm.getelementptr %524[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          llvm.store %521, %525 : i32, !llvm.ptr
          %526 = llvm.load %379 : !llvm.ptr -> i32
          %527 = arith.constant 1 : i32
          %528 = arith.addi %526, %527 : i32
          llvm.store %528, %379 : i32, !llvm.ptr
          cf.br ^bb107
        ^bb106:
          cf.br ^bb107
        ^bb107:
        cf.br ^bb90
      ^bb97:
        cf.br ^bb98
      ^bb98:
      %529 = func.call @pollard_rho_u64(%465) : (i64) -> i64
      %530 = arith.cmpi eq, %529, %465 : i64
      cf.cond_br %530, ^bb108, ^bb109
      ^bb108:
        %531 = arith.constant 0 : i1
        %532 = llvm.mlir.constant(1 : i64) : i64
        %533 = llvm.alloca %532 x i1 : (i64) -> !llvm.ptr
        llvm.store %531, %533 : i1, !llvm.ptr
        %534 = arith.constant 0 : i32
        %535 = llvm.mlir.constant(1 : i64) : i64
        %536 = llvm.alloca %535 x i32 : (i64) -> !llvm.ptr
        llvm.store %534, %536 : i32, !llvm.ptr
        cf.br ^bb111
        ^bb111:
        %537 = llvm.load %536 : !llvm.ptr -> i32
        %538 = llvm.load %379 : !llvm.ptr -> i32
        %539 = arith.cmpi slt, %537, %538 : i32
        cf.cond_br %539, ^bb112, ^bb113
        ^bb112:
          %541 = llvm.load %536 : !llvm.ptr -> i32
          %542 = arith.extsi %541 : i32 to i64
          %543 = llvm.getelementptr %arg1[%542] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %540 = llvm.load %543 : !llvm.ptr -> !llvm.struct<(i64, i32)>
          %544 = llvm.load %536 : !llvm.ptr -> i32
          %545 = arith.extsi %544 : i32 to i64
          %546 = llvm.getelementptr %arg1[%545] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %547 = llvm.getelementptr %546[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %548 = llvm.load %547 : !llvm.ptr -> i64
          %549 = arith.cmpi eq, %548, %465 : i64
          cf.cond_br %549, ^bb114, ^bb115
          ^bb114:
            %551 = llvm.load %536 : !llvm.ptr -> i32
            %552 = arith.extsi %551 : i32 to i64
            %553 = llvm.getelementptr %arg1[%552] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            %550 = llvm.load %553 : !llvm.ptr -> !llvm.struct<(i64, i32)>
            %554 = llvm.load %536 : !llvm.ptr -> i32
            %555 = arith.extsi %554 : i32 to i64
            %556 = llvm.getelementptr %arg1[%555] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            %557 = llvm.getelementptr %556[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            %558 = llvm.load %557 : !llvm.ptr -> i32
            %559 = arith.constant 1 : i32
            %560 = arith.addi %558, %559 : i32
            %561 = llvm.load %536 : !llvm.ptr -> i32
            %562 = arith.extsi %561 : i32 to i64
            %563 = llvm.getelementptr %arg1[%562] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            %564 = llvm.getelementptr %563[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
            llvm.store %560, %564 : i32, !llvm.ptr
            %565 = arith.constant 1 : i1
            llvm.store %565, %533 : i1, !llvm.ptr
            cf.br ^bb113
          ^bb115:
            cf.br ^bb116
          ^bb116:
          %566 = llvm.load %536 : !llvm.ptr -> i32
          %567 = arith.constant 1 : i32
          %568 = arith.addi %566, %567 : i32
          llvm.store %568, %536 : i32, !llvm.ptr
          cf.br ^bb111
        ^bb113:
        %569 = llvm.load %533 : !llvm.ptr -> i1
        %571 = arith.constant 1 : i1
        %570 = arith.xori %569, %571 : i1
        cf.cond_br %570, ^bb117, ^bb118
        ^bb117:
          %573 = llvm.load %379 : !llvm.ptr -> i32
          %574 = arith.extsi %573 : i32 to i64
          %575 = llvm.getelementptr %arg1[%574] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %576 = llvm.getelementptr %575[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          llvm.store %465, %576 : i64, !llvm.ptr
          %577 = arith.constant 1 : i32
          %578 = llvm.load %379 : !llvm.ptr -> i32
          %579 = arith.extsi %578 : i32 to i64
          %580 = llvm.getelementptr %arg1[%579] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %581 = llvm.getelementptr %580[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          llvm.store %577, %581 : i32, !llvm.ptr
          %582 = llvm.load %379 : !llvm.ptr -> i32
          %583 = arith.constant 1 : i32
          %584 = arith.addi %582, %583 : i32
          llvm.store %584, %379 : i32, !llvm.ptr
          cf.br ^bb119
        ^bb118:
          cf.br ^bb119
        ^bb119:
        cf.br ^bb90
      ^bb109:
        cf.br ^bb110
      ^bb110:
      %585 = llvm.mlir.addressof @g_fstack : !llvm.ptr
      %586 = llvm.load %585 : !llvm.ptr -> !llvm.ptr
      %587 = llvm.load %445 : !llvm.ptr -> i32
      %588 = arith.extsi %587 : i32 to i64
      %589 = llvm.getelementptr %586[%588] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %529, %589 : i64, !llvm.ptr
      %590 = llvm.load %445 : !llvm.ptr -> i32
      %591 = arith.constant 1 : i32
      %592 = arith.addi %590, %591 : i32
      llvm.store %592, %445 : i32, !llvm.ptr
      %593 = arith.divui %465, %529 : i64
      %594 = llvm.mlir.addressof @g_fstack : !llvm.ptr
      %595 = llvm.load %594 : !llvm.ptr -> !llvm.ptr
      %596 = llvm.load %445 : !llvm.ptr -> i32
      %597 = arith.extsi %596 : i32 to i64
      %598 = llvm.getelementptr %595[%597] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %593, %598 : i64, !llvm.ptr
      %599 = llvm.load %445 : !llvm.ptr -> i32
      %600 = arith.constant 1 : i32
      %601 = arith.addi %599, %600 : i32
      llvm.store %601, %445 : i32, !llvm.ptr
      cf.br ^bb90
    ^bb92:
    %602 = llvm.load %379 : !llvm.ptr -> i32
    func.return %602 : i32
  }
  func.func @isqrt_u64(%arg0: i64) -> i64 {
    %603 = arith.constant 0 : i32
    %605 = arith.extsi %603 : i32 to i64
    %604 = arith.cmpi eq, %arg0, %605 : i64
    cf.cond_br %604, ^bb120, ^bb121
    ^bb120:
      %606 = arith.constant 0 : i32
      %607 = arith.extsi %606 : i32 to i64
      func.return %607 : i64
    ^bb121:
      cf.br ^bb122
    ^bb122:
    %608 = arith.sitofp %arg0 : i64 to f64
    %609 = math.sqrt %608 : f64
    %610 = arith.fptosi %609 : f64 to i64
    cf.br ^bb123(%610 : i64)
    ^bb123(%611: i64):
    %612 = arith.constant 0 : i32
    %614 = arith.extsi %612 : i32 to i64
    %613 = arith.cmpi ugt, %611, %614 : i64
    %615 = scf.if %613 -> (i1) {
      %616 = arith.muli %611, %611 : i64
      %617 = arith.cmpi ugt, %616, %arg0 : i64
      scf.yield %617 : i1
    } else {
      %618 = arith.constant false
      scf.yield %618 : i1
    }
    cf.cond_br %615, ^bb124(%611 : i64), ^bb125(%611 : i64)
    ^bb124(%619: i64):
      %620 = arith.constant 1 : i32
      %622 = arith.extsi %620 : i32 to i64
      %621 = arith.subi %619, %622 : i64
      cf.br ^bb123(%621 : i64)
    ^bb125(%623: i64):
    cf.br ^bb126(%623 : i64)
    ^bb126(%624: i64):
    %625 = arith.constant 1 : i32
    %627 = arith.extsi %625 : i32 to i64
    %626 = arith.addi %624, %627 : i64
    %628 = arith.constant 1 : i32
    %630 = arith.extsi %628 : i32 to i64
    %629 = arith.addi %624, %630 : i64
    %631 = arith.muli %626, %629 : i64
    %632 = arith.cmpi ule, %631, %arg0 : i64
    cf.cond_br %632, ^bb127(%624 : i64), ^bb128(%624 : i64)
    ^bb127(%633: i64):
      %634 = arith.constant 1 : i32
      %636 = arith.extsi %634 : i32 to i64
      %635 = arith.addi %633, %636 : i64
      cf.br ^bb126(%635 : i64)
    ^bb128(%637: i64):
    func.return %637 : i64
  }
  func.func @best_dfs(%arg0: i32, %arg1: i64, %arg2: i64, %arg3: i32, %arg4: i64) -> () {
    %638 = llvm.mlir.addressof @g_best_d : !llvm.ptr
    %639 = llvm.load %638 : !llvm.ptr -> i64
    %640 = arith.cmpi ugt, %arg1, %639 : i64
    cf.cond_br %640, ^bb129, ^bb130
    ^bb129:
      %641 = llvm.mlir.addressof @g_best_d : !llvm.ptr
      llvm.store %arg1, %641 : i64, !llvm.ptr
      cf.br ^bb131
    ^bb130:
      cf.br ^bb131
    ^bb131:
    %642 = arith.cmpi sge, %arg0, %arg3 : i32
    cf.cond_br %642, ^bb132, ^bb133
    ^bb132:
      func.return
    ^bb133:
      cf.br ^bb134
    ^bb134:
    %643 = arith.muli %arg1, %arg4 : i64
    %644 = llvm.mlir.addressof @g_best_d : !llvm.ptr
    %645 = llvm.load %644 : !llvm.ptr -> i64
    %646 = arith.cmpi ule, %643, %645 : i64
    cf.cond_br %646, ^bb135, ^bb136
    ^bb135:
      func.return
    ^bb136:
      cf.br ^bb137
    ^bb137:
    %648 = llvm.mlir.addressof @g_fac : !llvm.ptr
    %649 = llvm.load %648 : !llvm.ptr -> !llvm.ptr
    %650 = arith.extsi %arg0 : i32 to i64
    %651 = llvm.getelementptr %649[%650] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %647 = llvm.load %651 : !llvm.ptr -> !llvm.struct<(i64, i32)>
    %652 = llvm.mlir.addressof @g_fac : !llvm.ptr
    %653 = llvm.load %652 : !llvm.ptr -> !llvm.ptr
    %654 = arith.extsi %arg0 : i32 to i64
    %655 = llvm.getelementptr %653[%654] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %656 = llvm.getelementptr %655[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %657 = llvm.load %656 : !llvm.ptr -> i64
    %659 = llvm.mlir.addressof @g_fac : !llvm.ptr
    %660 = llvm.load %659 : !llvm.ptr -> !llvm.ptr
    %661 = arith.extsi %arg0 : i32 to i64
    %662 = llvm.getelementptr %660[%661] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %658 = llvm.load %662 : !llvm.ptr -> !llvm.struct<(i64, i32)>
    %663 = llvm.mlir.addressof @g_fac : !llvm.ptr
    %664 = llvm.load %663 : !llvm.ptr -> !llvm.ptr
    %665 = arith.extsi %arg0 : i32 to i64
    %666 = llvm.getelementptr %664[%665] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %667 = llvm.getelementptr %666[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %668 = llvm.load %667 : !llvm.ptr -> i32
    %669 = arith.constant 1 : i32
    %670 = arith.extsi %669 : i32 to i64
    %671 = llvm.mlir.constant(1 : i64) : i64
    %672 = llvm.alloca %671 x i64 : (i64) -> !llvm.ptr
    llvm.store %670, %672 : i64, !llvm.ptr
    %673 = arith.constant 0 : i32
    %674 = llvm.mlir.constant(1 : i64) : i64
    %675 = llvm.alloca %674 x i32 : (i64) -> !llvm.ptr
    llvm.store %673, %675 : i32, !llvm.ptr
    cf.br ^bb138
    ^bb138:
    %676 = llvm.load %675 : !llvm.ptr -> i32
    %677 = arith.cmpi slt, %676, %668 : i32
    cf.cond_br %677, ^bb139, ^bb140
    ^bb139:
      %678 = llvm.load %672 : !llvm.ptr -> i64
      %679 = arith.muli %678, %657 : i64
      llvm.store %679, %672 : i64, !llvm.ptr
      %680 = llvm.load %675 : !llvm.ptr -> i32
      %681 = arith.constant 1 : i32
      %682 = arith.addi %680, %681 : i32
      llvm.store %682, %675 : i32, !llvm.ptr
      cf.br ^bb138
    ^bb140:
    %683 = llvm.load %672 : !llvm.ptr -> i64
    %684 = arith.divui %arg4, %683 : i64
    %685 = llvm.load %672 : !llvm.ptr -> i64
    %686 = llvm.mlir.constant(1 : i64) : i64
    %687 = llvm.alloca %686 x i64 : (i64) -> !llvm.ptr
    llvm.store %685, %687 : i64, !llvm.ptr
    %688 = llvm.mlir.constant(1 : i64) : i64
    %689 = llvm.alloca %688 x i32 : (i64) -> !llvm.ptr
    llvm.store %668, %689 : i32, !llvm.ptr
    cf.br ^bb141
    ^bb141:
    %690 = llvm.load %689 : !llvm.ptr -> i32
    %691 = arith.constant 0 : i32
    %692 = arith.cmpi sge, %690, %691 : i32
    cf.cond_br %692, ^bb142, ^bb143
    ^bb142:
      %693 = llvm.load %687 : !llvm.ptr -> i64
      %694 = arith.divui %arg2, %693 : i64
      %695 = arith.cmpi ule, %arg1, %694 : i64
      cf.cond_br %695, ^bb144, ^bb145
      ^bb144:
        %697 = arith.constant 1 : i32
        %698 = arith.addi %arg0, %697 : i32
        %699 = llvm.load %687 : !llvm.ptr -> i64
        %700 = arith.muli %arg1, %699 : i64
        func.call @best_dfs(%698, %700, %arg2, %arg3, %684) : (i32, i64, i64, i32, i64) -> ()
        cf.br ^bb146
      ^bb145:
        cf.br ^bb146
      ^bb146:
      %701 = llvm.load %687 : !llvm.ptr -> i64
      %702 = arith.divui %701, %657 : i64
      llvm.store %702, %687 : i64, !llvm.ptr
      %703 = llvm.load %689 : !llvm.ptr -> i32
      %704 = arith.constant 1 : i32
      %705 = arith.subi %703, %704 : i32
      llvm.store %705, %689 : i32, !llvm.ptr
      cf.br ^bb141
    ^bb143:
    func.return
  }
  func.func @best_divisor_le_sqrt(%arg0: i64) -> i64 {
    %707 = llvm.mlir.addressof @g_fac : !llvm.ptr
    %708 = llvm.load %707 : !llvm.ptr -> !llvm.ptr
    %706 = func.call @factorize_u64(%arg0, %708) : (i64, !llvm.ptr) -> i32
    %709 = arith.constant 1 : i32
    %710 = llvm.mlir.constant(1 : i64) : i64
    %711 = llvm.alloca %710 x i32 : (i64) -> !llvm.ptr
    llvm.store %709, %711 : i32, !llvm.ptr
    cf.br ^bb147
    ^bb147:
    %712 = llvm.load %711 : !llvm.ptr -> i32
    %713 = arith.cmpi slt, %712, %706 : i32
    cf.cond_br %713, ^bb148, ^bb149
    ^bb148:
      %715 = llvm.mlir.addressof @g_fac : !llvm.ptr
      %716 = llvm.load %715 : !llvm.ptr -> !llvm.ptr
      %717 = llvm.load %711 : !llvm.ptr -> i32
      %718 = arith.extsi %717 : i32 to i64
      %719 = llvm.getelementptr %716[%718] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %714 = llvm.load %719 : !llvm.ptr -> !llvm.struct<(i64, i32)>
      %720 = llvm.mlir.addressof @g_fac : !llvm.ptr
      %721 = llvm.load %720 : !llvm.ptr -> !llvm.ptr
      %722 = llvm.load %711 : !llvm.ptr -> i32
      %723 = arith.extsi %722 : i32 to i64
      %724 = llvm.getelementptr %721[%723] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %725 = llvm.getelementptr %724[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %726 = llvm.load %725 : !llvm.ptr -> i64
      %728 = llvm.mlir.addressof @g_fac : !llvm.ptr
      %729 = llvm.load %728 : !llvm.ptr -> !llvm.ptr
      %730 = llvm.load %711 : !llvm.ptr -> i32
      %731 = arith.extsi %730 : i32 to i64
      %732 = llvm.getelementptr %729[%731] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %727 = llvm.load %732 : !llvm.ptr -> !llvm.struct<(i64, i32)>
      %733 = llvm.mlir.addressof @g_fac : !llvm.ptr
      %734 = llvm.load %733 : !llvm.ptr -> !llvm.ptr
      %735 = llvm.load %711 : !llvm.ptr -> i32
      %736 = arith.extsi %735 : i32 to i64
      %737 = llvm.getelementptr %734[%736] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %738 = llvm.getelementptr %737[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %739 = llvm.load %738 : !llvm.ptr -> i32
      %740 = llvm.load %711 : !llvm.ptr -> i32
      %741 = arith.constant 1 : i32
      %742 = arith.subi %740, %741 : i32
      %743 = llvm.mlir.constant(1 : i64) : i64
      %744 = llvm.alloca %743 x i32 : (i64) -> !llvm.ptr
      llvm.store %742, %744 : i32, !llvm.ptr
      cf.br ^bb150
      ^bb150:
      %745 = llvm.load %744 : !llvm.ptr -> i32
      %746 = arith.constant 0 : i32
      %747 = arith.cmpi sge, %745, %746 : i32
      %748 = scf.if %747 -> (i1) {
        %750 = llvm.mlir.addressof @g_fac : !llvm.ptr
        %751 = llvm.load %750 : !llvm.ptr -> !llvm.ptr
        %752 = llvm.load %744 : !llvm.ptr -> i32
        %753 = arith.extsi %752 : i32 to i64
        %754 = llvm.getelementptr %751[%753] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %749 = llvm.load %754 : !llvm.ptr -> !llvm.struct<(i64, i32)>
        %755 = llvm.mlir.addressof @g_fac : !llvm.ptr
        %756 = llvm.load %755 : !llvm.ptr -> !llvm.ptr
        %757 = llvm.load %744 : !llvm.ptr -> i32
        %758 = arith.extsi %757 : i32 to i64
        %759 = llvm.getelementptr %756[%758] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %760 = llvm.getelementptr %759[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %761 = llvm.load %760 : !llvm.ptr -> i64
        %762 = arith.cmpi ult, %761, %726 : i64
        scf.yield %762 : i1
      } else {
        %763 = arith.constant false
        scf.yield %763 : i1
      }
      cf.cond_br %748, ^bb151, ^bb152
      ^bb151:
        %765 = llvm.mlir.addressof @g_fac : !llvm.ptr
        %766 = llvm.load %765 : !llvm.ptr -> !llvm.ptr
        %767 = llvm.load %744 : !llvm.ptr -> i32
        %768 = arith.extsi %767 : i32 to i64
        %769 = llvm.getelementptr %766[%768] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %764 = llvm.load %769 : !llvm.ptr -> !llvm.struct<(i64, i32)>
        %770 = llvm.mlir.addressof @g_fac : !llvm.ptr
        %771 = llvm.load %770 : !llvm.ptr -> !llvm.ptr
        %772 = llvm.load %744 : !llvm.ptr -> i32
        %773 = arith.extsi %772 : i32 to i64
        %774 = llvm.getelementptr %771[%773] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %775 = llvm.getelementptr %774[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %776 = llvm.load %775 : !llvm.ptr -> i64
        %777 = llvm.mlir.addressof @g_fac : !llvm.ptr
        %778 = llvm.load %777 : !llvm.ptr -> !llvm.ptr
        %779 = llvm.load %744 : !llvm.ptr -> i32
        %780 = arith.constant 1 : i32
        %781 = arith.addi %779, %780 : i32
        %782 = arith.extsi %781 : i32 to i64
        %783 = llvm.getelementptr %778[%782] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %784 = llvm.getelementptr %783[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        llvm.store %776, %784 : i64, !llvm.ptr
        %786 = llvm.mlir.addressof @g_fac : !llvm.ptr
        %787 = llvm.load %786 : !llvm.ptr -> !llvm.ptr
        %788 = llvm.load %744 : !llvm.ptr -> i32
        %789 = arith.extsi %788 : i32 to i64
        %790 = llvm.getelementptr %787[%789] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %785 = llvm.load %790 : !llvm.ptr -> !llvm.struct<(i64, i32)>
        %791 = llvm.mlir.addressof @g_fac : !llvm.ptr
        %792 = llvm.load %791 : !llvm.ptr -> !llvm.ptr
        %793 = llvm.load %744 : !llvm.ptr -> i32
        %794 = arith.extsi %793 : i32 to i64
        %795 = llvm.getelementptr %792[%794] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %796 = llvm.getelementptr %795[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %797 = llvm.load %796 : !llvm.ptr -> i32
        %798 = llvm.mlir.addressof @g_fac : !llvm.ptr
        %799 = llvm.load %798 : !llvm.ptr -> !llvm.ptr
        %800 = llvm.load %744 : !llvm.ptr -> i32
        %801 = arith.constant 1 : i32
        %802 = arith.addi %800, %801 : i32
        %803 = arith.extsi %802 : i32 to i64
        %804 = llvm.getelementptr %799[%803] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        %805 = llvm.getelementptr %804[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
        llvm.store %797, %805 : i32, !llvm.ptr
        %806 = llvm.load %744 : !llvm.ptr -> i32
        %807 = arith.constant 1 : i32
        %808 = arith.subi %806, %807 : i32
        llvm.store %808, %744 : i32, !llvm.ptr
        cf.br ^bb150
      ^bb152:
      %809 = llvm.mlir.addressof @g_fac : !llvm.ptr
      %810 = llvm.load %809 : !llvm.ptr -> !llvm.ptr
      %811 = llvm.load %744 : !llvm.ptr -> i32
      %812 = arith.constant 1 : i32
      %813 = arith.addi %811, %812 : i32
      %814 = arith.extsi %813 : i32 to i64
      %815 = llvm.getelementptr %810[%814] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %816 = llvm.getelementptr %815[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      llvm.store %726, %816 : i64, !llvm.ptr
      %817 = llvm.mlir.addressof @g_fac : !llvm.ptr
      %818 = llvm.load %817 : !llvm.ptr -> !llvm.ptr
      %819 = llvm.load %744 : !llvm.ptr -> i32
      %820 = arith.constant 1 : i32
      %821 = arith.addi %819, %820 : i32
      %822 = arith.extsi %821 : i32 to i64
      %823 = llvm.getelementptr %818[%822] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %824 = llvm.getelementptr %823[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      llvm.store %739, %824 : i32, !llvm.ptr
      %825 = llvm.load %711 : !llvm.ptr -> i32
      %826 = arith.constant 1 : i32
      %827 = arith.addi %825, %826 : i32
      llvm.store %827, %711 : i32, !llvm.ptr
      cf.br ^bb147
    ^bb149:
    %828 = func.call @isqrt_u64(%arg0) : (i64) -> i64
    %829 = arith.constant 1 : i32
    %830 = arith.extsi %829 : i32 to i64
    %831 = llvm.mlir.addressof @g_best_d : !llvm.ptr
    llvm.store %830, %831 : i64, !llvm.ptr
    %833 = arith.constant 0 : i32
    %834 = arith.constant 1 : i32
    %835 = arith.extsi %834 : i32 to i64
    func.call @best_dfs(%833, %835, %828, %706, %arg0) : (i32, i64, i64, i32, i64) -> ()
    %836 = llvm.mlir.addressof @g_best_d : !llvm.ptr
    %837 = llvm.load %836 : !llvm.ptr -> i64
    func.return %837 : i64
  }
  // Struct: ShapeNode
  // Fields:
  //   is_leaf: i32
  //   left: !llvm.ptr
  //   right: !llvm.ptr
  // Module static: leaf_node
  llvm.mlir.global internal @leaf_node() {addr_space = 0 : i32} : !llvm.ptr {
    %838 = llvm.mlir.zero : !llvm.ptr
    llvm.return %838 : !llvm.ptr
  }
  func.func @new_shape(%arg0: i32, %arg1: !llvm.ptr, %arg2: !llvm.ptr) -> !llvm.ptr {
    %840 = arith.constant 24 : i32
    %841 = arith.extsi %840 : i32 to i64
    %839 = func.call @malloc(%841) : (i64) -> !llvm.ptr
    %842 = arith.constant 0 : i32
    %843 = arith.extsi %842 : i32 to i64
    %844 = llvm.getelementptr %839[%843] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %845 = llvm.getelementptr %844[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    llvm.store %arg0, %845 : i32, !llvm.ptr
    %846 = arith.constant 0 : i32
    %847 = arith.extsi %846 : i32 to i64
    %848 = llvm.getelementptr %839[%847] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %849 = llvm.getelementptr %848[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    llvm.store %arg1, %849 : !llvm.ptr, !llvm.ptr
    %850 = arith.constant 0 : i32
    %851 = arith.extsi %850 : i32 to i64
    %852 = llvm.getelementptr %839[%851] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %853 = llvm.getelementptr %852[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    llvm.store %arg2, %853 : !llvm.ptr, !llvm.ptr
    func.return %839 : !llvm.ptr
  }
  func.func @shape_eq(%arg0: !llvm.ptr, %arg1: !llvm.ptr) -> i1 {
    %854 = llvm.icmp "eq" %arg0, %arg1 : !llvm.ptr
    cf.cond_br %854, ^bb153, ^bb154
    ^bb153:
      %855 = arith.constant 1 : i1
      func.return %855 : i1
    ^bb154:
      cf.br ^bb155
    ^bb155:
    %857 = arith.constant 0 : i32
    %858 = arith.extsi %857 : i32 to i64
    %859 = llvm.getelementptr %arg0[%858] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %856 = llvm.load %859 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %860 = arith.constant 0 : i32
    %861 = arith.extsi %860 : i32 to i64
    %862 = llvm.getelementptr %arg0[%861] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %863 = llvm.getelementptr %862[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %864 = llvm.load %863 : !llvm.ptr -> i32
    %866 = arith.constant 0 : i32
    %867 = arith.extsi %866 : i32 to i64
    %868 = llvm.getelementptr %arg1[%867] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %865 = llvm.load %868 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %869 = arith.constant 0 : i32
    %870 = arith.extsi %869 : i32 to i64
    %871 = llvm.getelementptr %arg1[%870] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %872 = llvm.getelementptr %871[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %873 = llvm.load %872 : !llvm.ptr -> i32
    %874 = arith.cmpi ne, %864, %873 : i32
    cf.cond_br %874, ^bb156, ^bb157
    ^bb156:
      %875 = arith.constant 0 : i1
      func.return %875 : i1
    ^bb157:
      cf.br ^bb158
    ^bb158:
    %877 = arith.constant 0 : i32
    %878 = arith.extsi %877 : i32 to i64
    %879 = llvm.getelementptr %arg0[%878] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %876 = llvm.load %879 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %880 = arith.constant 0 : i32
    %881 = arith.extsi %880 : i32 to i64
    %882 = llvm.getelementptr %arg0[%881] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %883 = llvm.getelementptr %882[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %884 = llvm.load %883 : !llvm.ptr -> i32
    %885 = arith.constant 0 : i32
    %886 = arith.cmpi ne, %884, %885 : i32
    cf.cond_br %886, ^bb159, ^bb160
    ^bb159:
      %887 = arith.constant 1 : i1
      func.return %887 : i1
    ^bb160:
      cf.br ^bb161
    ^bb161:
    %890 = arith.constant 0 : i32
    %891 = arith.extsi %890 : i32 to i64
    %892 = llvm.getelementptr %arg0[%891] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %889 = llvm.load %892 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %893 = arith.constant 0 : i32
    %894 = arith.extsi %893 : i32 to i64
    %895 = llvm.getelementptr %arg0[%894] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %896 = llvm.getelementptr %895[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %897 = llvm.load %896 : !llvm.ptr -> !llvm.ptr
    %899 = arith.constant 0 : i32
    %900 = arith.extsi %899 : i32 to i64
    %901 = llvm.getelementptr %arg1[%900] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %898 = llvm.load %901 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %902 = arith.constant 0 : i32
    %903 = arith.extsi %902 : i32 to i64
    %904 = llvm.getelementptr %arg1[%903] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %905 = llvm.getelementptr %904[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %906 = llvm.load %905 : !llvm.ptr -> !llvm.ptr
    %888 = func.call @shape_eq(%897, %906) : (!llvm.ptr, !llvm.ptr) -> i1
    %907 = scf.if %888 -> (i1) {
      %910 = arith.constant 0 : i32
      %911 = arith.extsi %910 : i32 to i64
      %912 = llvm.getelementptr %arg0[%911] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %909 = llvm.load %912 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %913 = arith.constant 0 : i32
      %914 = arith.extsi %913 : i32 to i64
      %915 = llvm.getelementptr %arg0[%914] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %916 = llvm.getelementptr %915[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %917 = llvm.load %916 : !llvm.ptr -> !llvm.ptr
      %919 = arith.constant 0 : i32
      %920 = arith.extsi %919 : i32 to i64
      %921 = llvm.getelementptr %arg1[%920] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %918 = llvm.load %921 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %922 = arith.constant 0 : i32
      %923 = arith.extsi %922 : i32 to i64
      %924 = llvm.getelementptr %arg1[%923] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %925 = llvm.getelementptr %924[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %926 = llvm.load %925 : !llvm.ptr -> !llvm.ptr
      %908 = func.call @shape_eq(%917, %926) : (!llvm.ptr, !llvm.ptr) -> i1
      scf.yield %908 : i1
    } else {
      %927 = arith.constant false
      scf.yield %927 : i1
    }
    func.return %907 : i1
  }
  // Struct: SCacheEntry
  // Fields:
  //   key: i64
  //   val: !llvm.ptr
  // Module static: scache
  llvm.mlir.global internal @scache() {addr_space = 0 : i32} : !llvm.ptr {
    %928 = llvm.mlir.zero : !llvm.ptr
    llvm.return %928 : !llvm.ptr
  }
  // Module static: scache_count
  llvm.mlir.global internal @scache_count(0 : i32) : i32
  func.func @get_shape(%arg0: i64) -> !llvm.ptr {
    %929 = arith.constant 0 : i32
    %930 = llvm.mlir.constant(1 : i64) : i64
    %931 = llvm.alloca %930 x i32 : (i64) -> !llvm.ptr
    llvm.store %929, %931 : i32, !llvm.ptr
    cf.br ^bb162
    ^bb162:
    %932 = llvm.load %931 : !llvm.ptr -> i32
    %933 = llvm.mlir.addressof @scache_count : !llvm.ptr
    %934 = llvm.load %933 : !llvm.ptr -> i32
    %935 = arith.cmpi slt, %932, %934 : i32
    cf.cond_br %935, ^bb163, ^bb164
    ^bb163:
      %937 = llvm.mlir.addressof @scache : !llvm.ptr
      %938 = llvm.load %937 : !llvm.ptr -> !llvm.ptr
      %939 = llvm.load %931 : !llvm.ptr -> i32
      %940 = arith.extsi %939 : i32 to i64
      %941 = llvm.getelementptr %938[%940] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
      %936 = llvm.load %941 : !llvm.ptr -> !llvm.struct<(i64, !llvm.ptr)>
      %942 = llvm.mlir.addressof @scache : !llvm.ptr
      %943 = llvm.load %942 : !llvm.ptr -> !llvm.ptr
      %944 = llvm.load %931 : !llvm.ptr -> i32
      %945 = arith.extsi %944 : i32 to i64
      %946 = llvm.getelementptr %943[%945] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
      %947 = llvm.getelementptr %946[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
      %948 = llvm.load %947 : !llvm.ptr -> i64
      %949 = arith.cmpi eq, %948, %arg0 : i64
      cf.cond_br %949, ^bb165, ^bb166
      ^bb165:
        %951 = llvm.mlir.addressof @scache : !llvm.ptr
        %952 = llvm.load %951 : !llvm.ptr -> !llvm.ptr
        %953 = llvm.load %931 : !llvm.ptr -> i32
        %954 = arith.extsi %953 : i32 to i64
        %955 = llvm.getelementptr %952[%954] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
        %950 = llvm.load %955 : !llvm.ptr -> !llvm.struct<(i64, !llvm.ptr)>
        %956 = llvm.mlir.addressof @scache : !llvm.ptr
        %957 = llvm.load %956 : !llvm.ptr -> !llvm.ptr
        %958 = llvm.load %931 : !llvm.ptr -> i32
        %959 = arith.extsi %958 : i32 to i64
        %960 = llvm.getelementptr %957[%959] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
        %961 = llvm.getelementptr %960[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
        %962 = llvm.load %961 : !llvm.ptr -> !llvm.ptr
        func.return %962 : !llvm.ptr
      ^bb166:
        cf.br ^bb167
      ^bb167:
      %963 = llvm.load %931 : !llvm.ptr -> i32
      %964 = arith.constant 1 : i32
      %965 = arith.addi %963, %964 : i32
      llvm.store %965, %931 : i32, !llvm.ptr
      cf.br ^bb162
    ^bb164:
    %966 = llvm.mlir.undef : !llvm.ptr
    %967 = func.call @is_prime_u64(%arg0) : (i64) -> i1
    cf.cond_br %967, ^bb168, ^bb169
    ^bb168:
      %968 = llvm.mlir.addressof @leaf_node : !llvm.ptr
      %969 = llvm.load %968 : !llvm.ptr -> !llvm.ptr
      cf.br ^bb170(%969 : !llvm.ptr)
    ^bb169:
      %970 = func.call @best_divisor_le_sqrt(%arg0) : (i64) -> i64
      %971 = llvm.mlir.constant(1 : i64) : i64
      %972 = llvm.alloca %971 x i64 : (i64) -> !llvm.ptr
      llvm.store %970, %972 : i64, !llvm.ptr
      %973 = arith.divui %arg0, %970 : i64
      %974 = llvm.mlir.constant(1 : i64) : i64
      %975 = llvm.alloca %974 x i64 : (i64) -> !llvm.ptr
      llvm.store %973, %975 : i64, !llvm.ptr
      %976 = llvm.load %972 : !llvm.ptr -> i64
      %977 = llvm.load %975 : !llvm.ptr -> i64
      %978 = arith.cmpi ugt, %976, %977 : i64
      cf.cond_br %978, ^bb171, ^bb172
      ^bb171:
        %979 = llvm.load %972 : !llvm.ptr -> i64
        %980 = llvm.load %975 : !llvm.ptr -> i64
        llvm.store %980, %972 : i64, !llvm.ptr
        llvm.store %979, %975 : i64, !llvm.ptr
        cf.br ^bb173
      ^bb172:
        cf.br ^bb173
      ^bb173:
      %982 = arith.constant 0 : i32
      %984 = llvm.load %972 : !llvm.ptr -> i64
      %983 = func.call @get_shape(%984) : (i64) -> !llvm.ptr
      %986 = llvm.load %975 : !llvm.ptr -> i64
      %985 = func.call @get_shape(%986) : (i64) -> !llvm.ptr
      %981 = func.call @new_shape(%982, %983, %985) : (i32, !llvm.ptr, !llvm.ptr) -> !llvm.ptr
      cf.br ^bb170(%981 : !llvm.ptr)
    ^bb170(%987: !llvm.ptr):
    %988 = llvm.mlir.addressof @scache_count : !llvm.ptr
    %989 = llvm.load %988 : !llvm.ptr -> i32
    %990 = arith.constant 8192 : i32
    %991 = arith.cmpi slt, %989, %990 : i32
    cf.cond_br %991, ^bb174, ^bb175
    ^bb174:
      %992 = llvm.mlir.addressof @scache : !llvm.ptr
      %993 = llvm.load %992 : !llvm.ptr -> !llvm.ptr
      %994 = llvm.mlir.addressof @scache_count : !llvm.ptr
      %995 = llvm.load %994 : !llvm.ptr -> i32
      %996 = arith.extsi %995 : i32 to i64
      %997 = llvm.getelementptr %993[%996] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
      %998 = llvm.getelementptr %997[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
      llvm.store %arg0, %998 : i64, !llvm.ptr
      %999 = llvm.mlir.addressof @scache : !llvm.ptr
      %1000 = llvm.load %999 : !llvm.ptr -> !llvm.ptr
      %1001 = llvm.mlir.addressof @scache_count : !llvm.ptr
      %1002 = llvm.load %1001 : !llvm.ptr -> i32
      %1003 = arith.extsi %1002 : i32 to i64
      %1004 = llvm.getelementptr %1000[%1003] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
      %1005 = llvm.getelementptr %1004[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, !llvm.ptr)>
      llvm.store %987, %1005 : !llvm.ptr, !llvm.ptr
      %1006 = llvm.mlir.addressof @scache_count : !llvm.ptr
      %1007 = llvm.load %1006 : !llvm.ptr -> i32
      %1008 = arith.constant 1 : i32
      %1009 = arith.addi %1007, %1008 : i32
      %1010 = llvm.mlir.addressof @scache_count : !llvm.ptr
      llvm.store %1009, %1010 : i32, !llvm.ptr
      cf.br ^bb176
    ^bb175:
      cf.br ^bb176
    ^bb176:
    func.return %987 : !llvm.ptr
  }
  func.func @count_leaves(%arg0: !llvm.ptr) -> i32 {
    %1012 = arith.constant 0 : i32
    %1013 = arith.extsi %1012 : i32 to i64
    %1014 = llvm.getelementptr %arg0[%1013] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1011 = llvm.load %1014 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1015 = arith.constant 0 : i32
    %1016 = arith.extsi %1015 : i32 to i64
    %1017 = llvm.getelementptr %arg0[%1016] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1018 = llvm.getelementptr %1017[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1019 = llvm.load %1018 : !llvm.ptr -> i32
    %1020 = arith.constant 0 : i32
    %1021 = arith.cmpi ne, %1019, %1020 : i32
    cf.cond_br %1021, ^bb177, ^bb178
    ^bb177:
      %1022 = arith.constant 1 : i32
      func.return %1022 : i32
    ^bb178:
      cf.br ^bb179
    ^bb179:
    %1025 = arith.constant 0 : i32
    %1026 = arith.extsi %1025 : i32 to i64
    %1027 = llvm.getelementptr %arg0[%1026] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1024 = llvm.load %1027 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1028 = arith.constant 0 : i32
    %1029 = arith.extsi %1028 : i32 to i64
    %1030 = llvm.getelementptr %arg0[%1029] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1031 = llvm.getelementptr %1030[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1032 = llvm.load %1031 : !llvm.ptr -> !llvm.ptr
    %1023 = func.call @count_leaves(%1032) : (!llvm.ptr) -> i32
    %1035 = arith.constant 0 : i32
    %1036 = arith.extsi %1035 : i32 to i64
    %1037 = llvm.getelementptr %arg0[%1036] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1034 = llvm.load %1037 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1038 = arith.constant 0 : i32
    %1039 = arith.extsi %1038 : i32 to i64
    %1040 = llvm.getelementptr %arg0[%1039] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1041 = llvm.getelementptr %1040[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1042 = llvm.load %1041 : !llvm.ptr -> !llvm.ptr
    %1033 = func.call @count_leaves(%1042) : (!llvm.ptr) -> i32
    %1043 = arith.addi %1023, %1033 : i32
    func.return %1043 : i32
  }
  func.func @shape_matches(%arg0: i64, %arg1: !llvm.ptr) -> i1 {
    %1045 = arith.constant 0 : i32
    %1046 = arith.extsi %1045 : i32 to i64
    %1047 = llvm.getelementptr %arg1[%1046] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1044 = llvm.load %1047 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1048 = arith.constant 0 : i32
    %1049 = arith.extsi %1048 : i32 to i64
    %1050 = llvm.getelementptr %arg1[%1049] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1051 = llvm.getelementptr %1050[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1052 = llvm.load %1051 : !llvm.ptr -> i32
    %1053 = arith.constant 0 : i32
    %1054 = arith.cmpi ne, %1052, %1053 : i32
    cf.cond_br %1054, ^bb180, ^bb181
    ^bb180:
      %1055 = func.call @is_prime_u64(%arg0) : (i64) -> i1
      func.return %1055 : i1
    ^bb181:
      cf.br ^bb182
    ^bb182:
    %1056 = func.call @is_prime_u64(%arg0) : (i64) -> i1
    cf.cond_br %1056, ^bb183, ^bb184
    ^bb183:
      %1057 = arith.constant 0 : i1
      func.return %1057 : i1
    ^bb184:
      cf.br ^bb185
    ^bb185:
    %1058 = func.call @best_divisor_le_sqrt(%arg0) : (i64) -> i64
    %1059 = llvm.mlir.constant(1 : i64) : i64
    %1060 = llvm.alloca %1059 x i64 : (i64) -> !llvm.ptr
    llvm.store %1058, %1060 : i64, !llvm.ptr
    %1061 = arith.divui %arg0, %1058 : i64
    %1062 = llvm.mlir.constant(1 : i64) : i64
    %1063 = llvm.alloca %1062 x i64 : (i64) -> !llvm.ptr
    llvm.store %1061, %1063 : i64, !llvm.ptr
    %1064 = llvm.load %1060 : !llvm.ptr -> i64
    %1065 = llvm.load %1063 : !llvm.ptr -> i64
    %1066 = arith.cmpi ugt, %1064, %1065 : i64
    cf.cond_br %1066, ^bb186, ^bb187
    ^bb186:
      %1067 = llvm.load %1060 : !llvm.ptr -> i64
      %1068 = llvm.load %1063 : !llvm.ptr -> i64
      llvm.store %1068, %1060 : i64, !llvm.ptr
      llvm.store %1067, %1063 : i64, !llvm.ptr
      cf.br ^bb188
    ^bb187:
      cf.br ^bb188
    ^bb188:
    %1071 = llvm.load %1060 : !llvm.ptr -> i64
    %1070 = func.call @get_shape(%1071) : (i64) -> !llvm.ptr
    %1073 = arith.constant 0 : i32
    %1074 = arith.extsi %1073 : i32 to i64
    %1075 = llvm.getelementptr %arg1[%1074] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1072 = llvm.load %1075 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1076 = arith.constant 0 : i32
    %1077 = arith.extsi %1076 : i32 to i64
    %1078 = llvm.getelementptr %arg1[%1077] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1079 = llvm.getelementptr %1078[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %1080 = llvm.load %1079 : !llvm.ptr -> !llvm.ptr
    %1069 = func.call @shape_eq(%1070, %1080) : (!llvm.ptr, !llvm.ptr) -> i1
    %1081 = scf.if %1069 -> (i1) {
      %1084 = llvm.load %1063 : !llvm.ptr -> i64
      %1083 = func.call @get_shape(%1084) : (i64) -> !llvm.ptr
      %1086 = arith.constant 0 : i32
      %1087 = arith.extsi %1086 : i32 to i64
      %1088 = llvm.getelementptr %arg1[%1087] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %1085 = llvm.load %1088 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %1089 = arith.constant 0 : i32
      %1090 = arith.extsi %1089 : i32 to i64
      %1091 = llvm.getelementptr %arg1[%1090] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %1092 = llvm.getelementptr %1091[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %1093 = llvm.load %1092 : !llvm.ptr -> !llvm.ptr
      %1082 = func.call @shape_eq(%1083, %1093) : (!llvm.ptr, !llvm.ptr) -> i1
      scf.yield %1082 : i1
    } else {
      %1094 = arith.constant false
      scf.yield %1094 : i1
    }
    func.return %1081 : i1
  }
  func.func @next_prime(%arg0: i64) -> i64 {
    %1095 = arith.constant 2 : i32
    %1097 = arith.extsi %1095 : i32 to i64
    %1096 = arith.cmpi ult, %arg0, %1097 : i64
    cf.cond_br %1096, ^bb189, ^bb190
    ^bb189:
      %1098 = arith.constant 2 : i32
      %1099 = arith.extsi %1098 : i32 to i64
      func.return %1099 : i64
    ^bb190:
      cf.br ^bb191
    ^bb191:
    %1100 = arith.constant 2 : i32
    %1102 = arith.extsi %1100 : i32 to i64
    %1101 = arith.cmpi eq, %arg0, %1102 : i64
    cf.cond_br %1101, ^bb192, ^bb193
    ^bb192:
      %1103 = arith.constant 3 : i32
      %1104 = arith.extsi %1103 : i32 to i64
      func.return %1104 : i64
    ^bb193:
      cf.br ^bb194
    ^bb194:
    %1105 = arith.constant 2 : i32
    %1107 = arith.extsi %1105 : i32 to i64
    %1106 = arith.addi %arg0, %1107 : i64
    %1108 = llvm.mlir.constant(1 : i64) : i64
    %1109 = llvm.alloca %1108 x i64 : (i64) -> !llvm.ptr
    llvm.store %1106, %1109 : i64, !llvm.ptr
    cf.br ^bb195
    ^bb195:
    %1111 = llvm.load %1109 : !llvm.ptr -> i64
    %1110 = func.call @is_prime_u64(%1111) : (i64) -> i1
    %1113 = arith.constant 1 : i1
    %1112 = arith.xori %1110, %1113 : i1
    cf.cond_br %1112, ^bb196, ^bb197
    ^bb196:
      %1115 = llvm.load %1109 : !llvm.ptr -> i64
      %1116 = arith.constant 2 : i32
      %1118 = arith.extsi %1116 : i32 to i64
      %1117 = arith.addi %1115, %1118 : i64
      llvm.store %1117, %1109 : i64, !llvm.ptr
      cf.br ^bb195
    ^bb197:
    %1119 = llvm.load %1109 : !llvm.ptr -> i64
    func.return %1119 : i64
  }
  // Struct: HeapEntry
  // Fields:
  //   val: i64
  //   data: i32
  // Struct: Seq
  // Fields:
  //   sh: !llvm.ptr
  //   maxval: i64
  //   next_prime_val: i64
  //   left_idx: i32
  //   right_idx: i32
  //   heap: !llvm.ptr
  //   heap_size: i32
  //   heap_cap: i32
  //   seen_keys: !llvm.ptr
  //   seen_count: i32
  //   seen_cap: i32
  //   values: !llvm.ptr
  //   val_count: i32
  //   val_cap: i32
  // Module static: seqs
  llvm.mlir.global internal @seqs() {addr_space = 0 : i32} : !llvm.ptr {
    %1120 = llvm.mlir.zero : !llvm.ptr
    llvm.return %1120 : !llvm.ptr
  }
  // Module static: seqs_count
  llvm.mlir.global internal @seqs_count(0 : i32) : i32
  func.func @find_seq(%arg0: !llvm.ptr) -> !llvm.ptr {
    %1121 = arith.constant 0 : i32
    %1122 = llvm.mlir.constant(1 : i64) : i64
    %1123 = llvm.alloca %1122 x i32 : (i64) -> !llvm.ptr
    llvm.store %1121, %1123 : i32, !llvm.ptr
    cf.br ^bb198
    ^bb198:
    %1124 = llvm.load %1123 : !llvm.ptr -> i32
    %1125 = llvm.mlir.addressof @seqs_count : !llvm.ptr
    %1126 = llvm.load %1125 : !llvm.ptr -> i32
    %1127 = arith.cmpi slt, %1124, %1126 : i32
    cf.cond_br %1127, ^bb199, ^bb200
    ^bb199:
      %1130 = llvm.mlir.addressof @seqs : !llvm.ptr
      %1131 = llvm.load %1130 : !llvm.ptr -> !llvm.ptr
      %1132 = llvm.load %1123 : !llvm.ptr -> i32
      %1133 = arith.extsi %1132 : i32 to i64
      %1134 = llvm.getelementptr %1131[%1133] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      %1129 = llvm.load %1134 : !llvm.ptr -> !llvm.ptr
      %1135 = arith.constant 0 : i32
      %1136 = arith.extsi %1135 : i32 to i64
      %1137 = llvm.getelementptr %1129[%1136] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1128 = llvm.load %1137 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1139 = llvm.mlir.addressof @seqs : !llvm.ptr
      %1140 = llvm.load %1139 : !llvm.ptr -> !llvm.ptr
      %1141 = llvm.load %1123 : !llvm.ptr -> i32
      %1142 = arith.extsi %1141 : i32 to i64
      %1143 = llvm.getelementptr %1140[%1142] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      %1138 = llvm.load %1143 : !llvm.ptr -> !llvm.ptr
      %1144 = arith.constant 0 : i32
      %1145 = arith.extsi %1144 : i32 to i64
      %1146 = llvm.getelementptr %1138[%1145] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1147 = llvm.getelementptr %1146[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1148 = llvm.load %1147 : !llvm.ptr -> !llvm.ptr
      %1149 = llvm.icmp "eq" %1148, %arg0 : !llvm.ptr
      cf.cond_br %1149, ^bb201, ^bb202
      ^bb201:
        %1151 = llvm.mlir.addressof @seqs : !llvm.ptr
        %1152 = llvm.load %1151 : !llvm.ptr -> !llvm.ptr
        %1153 = llvm.load %1123 : !llvm.ptr -> i32
        %1154 = arith.extsi %1153 : i32 to i64
        %1155 = llvm.getelementptr %1152[%1154] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
        %1150 = llvm.load %1155 : !llvm.ptr -> !llvm.ptr
        func.return %1150 : !llvm.ptr
      ^bb202:
        cf.br ^bb203
      ^bb203:
      %1156 = llvm.load %1123 : !llvm.ptr -> i32
      %1157 = arith.constant 1 : i32
      %1158 = arith.addi %1156, %1157 : i32
      llvm.store %1158, %1123 : i32, !llvm.ptr
      cf.br ^bb198
    ^bb200:
    %1159 = llvm.mlir.zero : !llvm.ptr
    func.return %1159 : !llvm.ptr
  }
  func.func @hpush(%arg0: !llvm.ptr, %arg1: i64, %arg2: i32) -> () {
    %1161 = arith.constant 0 : i32
    %1162 = arith.extsi %1161 : i32 to i64
    %1163 = llvm.getelementptr %arg0[%1162] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1160 = llvm.load %1163 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1164 = arith.constant 0 : i32
    %1165 = arith.extsi %1164 : i32 to i64
    %1166 = llvm.getelementptr %arg0[%1165] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1167 = llvm.getelementptr %1166[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1168 = llvm.load %1167 : !llvm.ptr -> i32
    %1170 = arith.constant 0 : i32
    %1171 = arith.extsi %1170 : i32 to i64
    %1172 = llvm.getelementptr %arg0[%1171] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1169 = llvm.load %1172 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1173 = arith.constant 0 : i32
    %1174 = arith.extsi %1173 : i32 to i64
    %1175 = llvm.getelementptr %arg0[%1174] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1176 = llvm.getelementptr %1175[0, 7] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1177 = llvm.load %1176 : !llvm.ptr -> i32
    %1178 = arith.cmpi sge, %1168, %1177 : i32
    cf.cond_br %1178, ^bb204, ^bb205
    ^bb204:
      %1180 = arith.constant 0 : i32
      %1181 = arith.extsi %1180 : i32 to i64
      %1182 = llvm.getelementptr %arg0[%1181] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1179 = llvm.load %1182 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1183 = arith.constant 0 : i32
      %1184 = arith.extsi %1183 : i32 to i64
      %1185 = llvm.getelementptr %arg0[%1184] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1186 = llvm.getelementptr %1185[0, 7] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1187 = llvm.load %1186 : !llvm.ptr -> i32
      %1188 = arith.constant 2 : i32
      %1189 = arith.muli %1187, %1188 : i32
      %1190 = arith.constant 0 : i32
      %1191 = arith.extsi %1190 : i32 to i64
      %1192 = llvm.getelementptr %arg0[%1191] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1193 = llvm.getelementptr %1192[0, 7] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %1189, %1193 : i32, !llvm.ptr
      %1196 = arith.constant 0 : i32
      %1197 = arith.extsi %1196 : i32 to i64
      %1198 = llvm.getelementptr %arg0[%1197] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1195 = llvm.load %1198 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1199 = arith.constant 0 : i32
      %1200 = arith.extsi %1199 : i32 to i64
      %1201 = llvm.getelementptr %arg0[%1200] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1202 = llvm.getelementptr %1201[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1203 = llvm.load %1202 : !llvm.ptr -> !llvm.ptr
      %1205 = arith.constant 0 : i32
      %1206 = arith.extsi %1205 : i32 to i64
      %1207 = llvm.getelementptr %arg0[%1206] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1204 = llvm.load %1207 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1208 = arith.constant 0 : i32
      %1209 = arith.extsi %1208 : i32 to i64
      %1210 = llvm.getelementptr %arg0[%1209] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1211 = llvm.getelementptr %1210[0, 7] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1212 = llvm.load %1211 : !llvm.ptr -> i32
      %1213 = arith.extsi %1212 : i32 to i64
      %1214 = arith.constant 16 : i32
      %1216 = arith.extsi %1214 : i32 to i64
      %1215 = arith.muli %1213, %1216 : i64
      %1194 = func.call @realloc(%1203, %1215) : (!llvm.ptr, i64) -> !llvm.ptr
      %1217 = arith.constant 0 : i32
      %1218 = arith.extsi %1217 : i32 to i64
      %1219 = llvm.getelementptr %arg0[%1218] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1220 = llvm.getelementptr %1219[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %1194, %1220 : !llvm.ptr, !llvm.ptr
      cf.br ^bb206
    ^bb205:
      cf.br ^bb206
    ^bb206:
    %1222 = arith.constant 0 : i32
    %1223 = arith.extsi %1222 : i32 to i64
    %1224 = llvm.getelementptr %arg0[%1223] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1221 = llvm.load %1224 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1225 = arith.constant 0 : i32
    %1226 = arith.extsi %1225 : i32 to i64
    %1227 = llvm.getelementptr %arg0[%1226] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1228 = llvm.getelementptr %1227[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1229 = llvm.load %1228 : !llvm.ptr -> i32
    %1231 = arith.constant 0 : i32
    %1232 = arith.extsi %1231 : i32 to i64
    %1233 = llvm.getelementptr %arg0[%1232] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1230 = llvm.load %1233 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1234 = arith.constant 0 : i32
    %1235 = arith.extsi %1234 : i32 to i64
    %1236 = llvm.getelementptr %arg0[%1235] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1237 = llvm.getelementptr %1236[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1238 = llvm.load %1237 : !llvm.ptr -> i32
    %1239 = arith.constant 1 : i32
    %1240 = arith.addi %1238, %1239 : i32
    %1241 = arith.constant 0 : i32
    %1242 = arith.extsi %1241 : i32 to i64
    %1243 = llvm.getelementptr %arg0[%1242] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1244 = llvm.getelementptr %1243[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    llvm.store %1240, %1244 : i32, !llvm.ptr
    %1246 = arith.constant 0 : i32
    %1247 = arith.extsi %1246 : i32 to i64
    %1248 = llvm.getelementptr %arg0[%1247] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1245 = llvm.load %1248 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1249 = arith.constant 0 : i32
    %1250 = arith.extsi %1249 : i32 to i64
    %1251 = llvm.getelementptr %arg0[%1250] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1252 = llvm.getelementptr %1251[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1253 = llvm.load %1252 : !llvm.ptr -> !llvm.ptr
    %1254 = arith.extsi %1229 : i32 to i64
    %1255 = llvm.getelementptr %1253[%1254] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %1256 = llvm.getelementptr %1255[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    llvm.store %arg1, %1256 : i64, !llvm.ptr
    %1258 = arith.constant 0 : i32
    %1259 = arith.extsi %1258 : i32 to i64
    %1260 = llvm.getelementptr %arg0[%1259] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1257 = llvm.load %1260 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1261 = arith.constant 0 : i32
    %1262 = arith.extsi %1261 : i32 to i64
    %1263 = llvm.getelementptr %arg0[%1262] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1264 = llvm.getelementptr %1263[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1265 = llvm.load %1264 : !llvm.ptr -> !llvm.ptr
    %1266 = arith.extsi %1229 : i32 to i64
    %1267 = llvm.getelementptr %1265[%1266] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %1268 = llvm.getelementptr %1267[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    llvm.store %arg2, %1268 : i32, !llvm.ptr
    %1269 = llvm.mlir.constant(1 : i64) : i64
    %1270 = llvm.alloca %1269 x i32 : (i64) -> !llvm.ptr
    llvm.store %1229, %1270 : i32, !llvm.ptr
    cf.br ^bb207
    ^bb207:
    %1271 = llvm.load %1270 : !llvm.ptr -> i32
    %1272 = arith.constant 0 : i32
    %1273 = arith.cmpi sgt, %1271, %1272 : i32
    cf.cond_br %1273, ^bb208, ^bb209
    ^bb208:
      %1274 = llvm.load %1270 : !llvm.ptr -> i32
      %1275 = arith.constant 1 : i32
      %1276 = arith.subi %1274, %1275 : i32
      %1277 = arith.constant 2 : i32
      %1278 = arith.divsi %1276, %1277 : i32
      %1281 = arith.constant 0 : i32
      %1282 = arith.extsi %1281 : i32 to i64
      %1283 = llvm.getelementptr %arg0[%1282] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1280 = llvm.load %1283 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1284 = arith.constant 0 : i32
      %1285 = arith.extsi %1284 : i32 to i64
      %1286 = llvm.getelementptr %arg0[%1285] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1287 = llvm.getelementptr %1286[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1288 = llvm.load %1287 : !llvm.ptr -> !llvm.ptr
      %1289 = arith.extsi %1278 : i32 to i64
      %1290 = llvm.getelementptr %1288[%1289] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %1279 = llvm.load %1290 : !llvm.ptr -> !llvm.struct<(i64, i32)>
      %1292 = arith.constant 0 : i32
      %1293 = arith.extsi %1292 : i32 to i64
      %1294 = llvm.getelementptr %arg0[%1293] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1291 = llvm.load %1294 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1295 = arith.constant 0 : i32
      %1296 = arith.extsi %1295 : i32 to i64
      %1297 = llvm.getelementptr %arg0[%1296] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1298 = llvm.getelementptr %1297[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1299 = llvm.load %1298 : !llvm.ptr -> !llvm.ptr
      %1300 = arith.extsi %1278 : i32 to i64
      %1301 = llvm.getelementptr %1299[%1300] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %1302 = llvm.getelementptr %1301[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %1303 = llvm.load %1302 : !llvm.ptr -> i64
      %1306 = arith.constant 0 : i32
      %1307 = arith.extsi %1306 : i32 to i64
      %1308 = llvm.getelementptr %arg0[%1307] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1305 = llvm.load %1308 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1309 = arith.constant 0 : i32
      %1310 = arith.extsi %1309 : i32 to i64
      %1311 = llvm.getelementptr %arg0[%1310] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1312 = llvm.getelementptr %1311[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1313 = llvm.load %1312 : !llvm.ptr -> !llvm.ptr
      %1314 = llvm.load %1270 : !llvm.ptr -> i32
      %1315 = arith.extsi %1314 : i32 to i64
      %1316 = llvm.getelementptr %1313[%1315] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %1304 = llvm.load %1316 : !llvm.ptr -> !llvm.struct<(i64, i32)>
      %1318 = arith.constant 0 : i32
      %1319 = arith.extsi %1318 : i32 to i64
      %1320 = llvm.getelementptr %arg0[%1319] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1317 = llvm.load %1320 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1321 = arith.constant 0 : i32
      %1322 = arith.extsi %1321 : i32 to i64
      %1323 = llvm.getelementptr %arg0[%1322] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1324 = llvm.getelementptr %1323[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1325 = llvm.load %1324 : !llvm.ptr -> !llvm.ptr
      %1326 = llvm.load %1270 : !llvm.ptr -> i32
      %1327 = arith.extsi %1326 : i32 to i64
      %1328 = llvm.getelementptr %1325[%1327] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %1329 = llvm.getelementptr %1328[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %1330 = llvm.load %1329 : !llvm.ptr -> i64
      %1331 = arith.cmpi ule, %1303, %1330 : i64
      cf.cond_br %1331, ^bb210, ^bb211
      ^bb210:
        cf.br ^bb209
      ^bb211:
        cf.br ^bb212
      ^bb212:
      %1334 = arith.constant 0 : i32
      %1335 = arith.extsi %1334 : i32 to i64
      %1336 = llvm.getelementptr %arg0[%1335] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1333 = llvm.load %1336 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1337 = arith.constant 0 : i32
      %1338 = arith.extsi %1337 : i32 to i64
      %1339 = llvm.getelementptr %arg0[%1338] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1340 = llvm.getelementptr %1339[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1341 = llvm.load %1340 : !llvm.ptr -> !llvm.ptr
      %1342 = arith.extsi %1278 : i32 to i64
      %1343 = llvm.getelementptr %1341[%1342] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %1332 = llvm.load %1343 : !llvm.ptr -> !llvm.struct<(i64, i32)>
      %1344 = llvm.mlir.constant(1 : i64) : i64
      %1345 = llvm.alloca %1344 x !llvm.struct<(i64, i32)> : (i64) -> !llvm.ptr
      llvm.store %1332, %1345 : !llvm.struct<(i64, i32)>, !llvm.ptr
      %1348 = arith.constant 0 : i32
      %1349 = arith.extsi %1348 : i32 to i64
      %1350 = llvm.getelementptr %arg0[%1349] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1347 = llvm.load %1350 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1351 = arith.constant 0 : i32
      %1352 = arith.extsi %1351 : i32 to i64
      %1353 = llvm.getelementptr %arg0[%1352] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1354 = llvm.getelementptr %1353[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1355 = llvm.load %1354 : !llvm.ptr -> !llvm.ptr
      %1356 = llvm.load %1270 : !llvm.ptr -> i32
      %1357 = arith.extsi %1356 : i32 to i64
      %1358 = llvm.getelementptr %1355[%1357] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %1346 = llvm.load %1358 : !llvm.ptr -> !llvm.struct<(i64, i32)>
      %1360 = arith.constant 0 : i32
      %1361 = arith.extsi %1360 : i32 to i64
      %1362 = llvm.getelementptr %arg0[%1361] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1359 = llvm.load %1362 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1363 = arith.constant 0 : i32
      %1364 = arith.extsi %1363 : i32 to i64
      %1365 = llvm.getelementptr %arg0[%1364] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1366 = llvm.getelementptr %1365[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1367 = llvm.load %1366 : !llvm.ptr -> !llvm.ptr
      %1368 = arith.extsi %1278 : i32 to i64
      %1369 = llvm.getelementptr %1367[%1368] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      llvm.store %1346, %1369 : !llvm.struct<(i64, i32)>, !llvm.ptr
      %1370 = llvm.load %1345 : !llvm.ptr -> !llvm.struct<(i64, i32)>
      %1372 = arith.constant 0 : i32
      %1373 = arith.extsi %1372 : i32 to i64
      %1374 = llvm.getelementptr %arg0[%1373] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1371 = llvm.load %1374 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1375 = arith.constant 0 : i32
      %1376 = arith.extsi %1375 : i32 to i64
      %1377 = llvm.getelementptr %arg0[%1376] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1378 = llvm.getelementptr %1377[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1379 = llvm.load %1378 : !llvm.ptr -> !llvm.ptr
      %1380 = llvm.load %1270 : !llvm.ptr -> i32
      %1381 = arith.extsi %1380 : i32 to i64
      %1382 = llvm.getelementptr %1379[%1381] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      llvm.store %1370, %1382 : !llvm.struct<(i64, i32)>, !llvm.ptr
      llvm.store %1278, %1270 : i32, !llvm.ptr
      cf.br ^bb207
    ^bb209:
    func.return
  }
  func.func @hpop(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) -> () {
    %1385 = arith.constant 0 : i32
    %1386 = arith.extsi %1385 : i32 to i64
    %1387 = llvm.getelementptr %arg0[%1386] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1384 = llvm.load %1387 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1388 = arith.constant 0 : i32
    %1389 = arith.extsi %1388 : i32 to i64
    %1390 = llvm.getelementptr %arg0[%1389] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1391 = llvm.getelementptr %1390[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1392 = llvm.load %1391 : !llvm.ptr -> !llvm.ptr
    %1393 = arith.constant 0 : i32
    %1394 = arith.extsi %1393 : i32 to i64
    %1395 = llvm.getelementptr %1392[%1394] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %1383 = llvm.load %1395 : !llvm.ptr -> !llvm.struct<(i64, i32)>
    %1397 = arith.constant 0 : i32
    %1398 = arith.extsi %1397 : i32 to i64
    %1399 = llvm.getelementptr %arg0[%1398] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1396 = llvm.load %1399 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1400 = arith.constant 0 : i32
    %1401 = arith.extsi %1400 : i32 to i64
    %1402 = llvm.getelementptr %arg0[%1401] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1403 = llvm.getelementptr %1402[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1404 = llvm.load %1403 : !llvm.ptr -> !llvm.ptr
    %1405 = arith.constant 0 : i32
    %1406 = arith.extsi %1405 : i32 to i64
    %1407 = llvm.getelementptr %1404[%1406] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %1408 = llvm.getelementptr %1407[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %1409 = llvm.load %1408 : !llvm.ptr -> i64
    %1410 = arith.constant 0 : i32
    %1411 = arith.extsi %1410 : i32 to i64
    %1412 = llvm.getelementptr %arg1[%1411] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %1409, %1412 : i64, !llvm.ptr
    %1415 = arith.constant 0 : i32
    %1416 = arith.extsi %1415 : i32 to i64
    %1417 = llvm.getelementptr %arg0[%1416] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1414 = llvm.load %1417 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1418 = arith.constant 0 : i32
    %1419 = arith.extsi %1418 : i32 to i64
    %1420 = llvm.getelementptr %arg0[%1419] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1421 = llvm.getelementptr %1420[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1422 = llvm.load %1421 : !llvm.ptr -> !llvm.ptr
    %1423 = arith.constant 0 : i32
    %1424 = arith.extsi %1423 : i32 to i64
    %1425 = llvm.getelementptr %1422[%1424] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %1413 = llvm.load %1425 : !llvm.ptr -> !llvm.struct<(i64, i32)>
    %1427 = arith.constant 0 : i32
    %1428 = arith.extsi %1427 : i32 to i64
    %1429 = llvm.getelementptr %arg0[%1428] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1426 = llvm.load %1429 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1430 = arith.constant 0 : i32
    %1431 = arith.extsi %1430 : i32 to i64
    %1432 = llvm.getelementptr %arg0[%1431] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1433 = llvm.getelementptr %1432[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1434 = llvm.load %1433 : !llvm.ptr -> !llvm.ptr
    %1435 = arith.constant 0 : i32
    %1436 = arith.extsi %1435 : i32 to i64
    %1437 = llvm.getelementptr %1434[%1436] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %1438 = llvm.getelementptr %1437[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
    %1439 = llvm.load %1438 : !llvm.ptr -> i32
    %1440 = arith.constant 0 : i32
    %1441 = arith.extsi %1440 : i32 to i64
    %1442 = llvm.getelementptr %arg2[%1441] : (!llvm.ptr, i64) -> !llvm.ptr, i32
    llvm.store %1439, %1442 : i32, !llvm.ptr
    %1444 = arith.constant 0 : i32
    %1445 = arith.extsi %1444 : i32 to i64
    %1446 = llvm.getelementptr %arg0[%1445] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1443 = llvm.load %1446 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1447 = arith.constant 0 : i32
    %1448 = arith.extsi %1447 : i32 to i64
    %1449 = llvm.getelementptr %arg0[%1448] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1450 = llvm.getelementptr %1449[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1451 = llvm.load %1450 : !llvm.ptr -> i32
    %1452 = arith.constant 1 : i32
    %1453 = arith.subi %1451, %1452 : i32
    %1454 = arith.constant 0 : i32
    %1455 = arith.extsi %1454 : i32 to i64
    %1456 = llvm.getelementptr %arg0[%1455] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1457 = llvm.getelementptr %1456[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    llvm.store %1453, %1457 : i32, !llvm.ptr
    %1459 = arith.constant 0 : i32
    %1460 = arith.extsi %1459 : i32 to i64
    %1461 = llvm.getelementptr %arg0[%1460] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1458 = llvm.load %1461 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1462 = arith.constant 0 : i32
    %1463 = arith.extsi %1462 : i32 to i64
    %1464 = llvm.getelementptr %arg0[%1463] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1465 = llvm.getelementptr %1464[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1466 = llvm.load %1465 : !llvm.ptr -> i32
    %1467 = arith.constant 0 : i32
    %1468 = arith.cmpi sgt, %1466, %1467 : i32
    cf.cond_br %1468, ^bb213, ^bb214
    ^bb213:
      %1471 = arith.constant 0 : i32
      %1472 = arith.extsi %1471 : i32 to i64
      %1473 = llvm.getelementptr %arg0[%1472] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1470 = llvm.load %1473 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1474 = arith.constant 0 : i32
      %1475 = arith.extsi %1474 : i32 to i64
      %1476 = llvm.getelementptr %arg0[%1475] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1477 = llvm.getelementptr %1476[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1478 = llvm.load %1477 : !llvm.ptr -> !llvm.ptr
      %1480 = arith.constant 0 : i32
      %1481 = arith.extsi %1480 : i32 to i64
      %1482 = llvm.getelementptr %arg0[%1481] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1479 = llvm.load %1482 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1483 = arith.constant 0 : i32
      %1484 = arith.extsi %1483 : i32 to i64
      %1485 = llvm.getelementptr %arg0[%1484] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1486 = llvm.getelementptr %1485[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1487 = llvm.load %1486 : !llvm.ptr -> i32
      %1488 = arith.extsi %1487 : i32 to i64
      %1489 = llvm.getelementptr %1478[%1488] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      %1469 = llvm.load %1489 : !llvm.ptr -> !llvm.struct<(i64, i32)>
      %1491 = arith.constant 0 : i32
      %1492 = arith.extsi %1491 : i32 to i64
      %1493 = llvm.getelementptr %arg0[%1492] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1490 = llvm.load %1493 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1494 = arith.constant 0 : i32
      %1495 = arith.extsi %1494 : i32 to i64
      %1496 = llvm.getelementptr %arg0[%1495] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1497 = llvm.getelementptr %1496[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1498 = llvm.load %1497 : !llvm.ptr -> !llvm.ptr
      %1499 = arith.constant 0 : i32
      %1500 = arith.extsi %1499 : i32 to i64
      %1501 = llvm.getelementptr %1498[%1500] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
      llvm.store %1469, %1501 : !llvm.struct<(i64, i32)>, !llvm.ptr
      %1502 = arith.constant 0 : i32
      %1503 = llvm.mlir.constant(1 : i64) : i64
      %1504 = llvm.alloca %1503 x i32 : (i64) -> !llvm.ptr
      llvm.store %1502, %1504 : i32, !llvm.ptr
      %1505 = arith.constant 1 : i1
      %1506 = llvm.mlir.constant(1 : i64) : i64
      %1507 = llvm.alloca %1506 x i1 : (i64) -> !llvm.ptr
      llvm.store %1505, %1507 : i1, !llvm.ptr
      cf.br ^bb216
      ^bb216:
      %1508 = llvm.load %1507 : !llvm.ptr -> i1
      cf.cond_br %1508, ^bb217, ^bb218
      ^bb217:
        %1509 = arith.constant 2 : i32
        %1510 = llvm.load %1504 : !llvm.ptr -> i32
        %1511 = arith.muli %1509, %1510 : i32
        %1512 = arith.constant 1 : i32
        %1513 = arith.addi %1511, %1512 : i32
        %1514 = arith.constant 2 : i32
        %1515 = llvm.load %1504 : !llvm.ptr -> i32
        %1516 = arith.muli %1514, %1515 : i32
        %1517 = arith.constant 2 : i32
        %1518 = arith.addi %1516, %1517 : i32
        %1519 = llvm.load %1504 : !llvm.ptr -> i32
        %1520 = llvm.mlir.constant(1 : i64) : i64
        %1521 = llvm.alloca %1520 x i32 : (i64) -> !llvm.ptr
        llvm.store %1519, %1521 : i32, !llvm.ptr
        %1523 = arith.constant 0 : i32
        %1524 = arith.extsi %1523 : i32 to i64
        %1525 = llvm.getelementptr %arg0[%1524] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1522 = llvm.load %1525 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1526 = arith.constant 0 : i32
        %1527 = arith.extsi %1526 : i32 to i64
        %1528 = llvm.getelementptr %arg0[%1527] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1529 = llvm.getelementptr %1528[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1530 = llvm.load %1529 : !llvm.ptr -> i32
        %1531 = arith.cmpi slt, %1513, %1530 : i32
        %1532 = scf.if %1531 -> (i1) {
          %1535 = arith.constant 0 : i32
          %1536 = arith.extsi %1535 : i32 to i64
          %1537 = llvm.getelementptr %arg0[%1536] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1534 = llvm.load %1537 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1538 = arith.constant 0 : i32
          %1539 = arith.extsi %1538 : i32 to i64
          %1540 = llvm.getelementptr %arg0[%1539] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1541 = llvm.getelementptr %1540[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1542 = llvm.load %1541 : !llvm.ptr -> !llvm.ptr
          %1543 = arith.extsi %1513 : i32 to i64
          %1544 = llvm.getelementptr %1542[%1543] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1533 = llvm.load %1544 : !llvm.ptr -> !llvm.struct<(i64, i32)>
          %1546 = arith.constant 0 : i32
          %1547 = arith.extsi %1546 : i32 to i64
          %1548 = llvm.getelementptr %arg0[%1547] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1545 = llvm.load %1548 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1549 = arith.constant 0 : i32
          %1550 = arith.extsi %1549 : i32 to i64
          %1551 = llvm.getelementptr %arg0[%1550] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1552 = llvm.getelementptr %1551[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1553 = llvm.load %1552 : !llvm.ptr -> !llvm.ptr
          %1554 = arith.extsi %1513 : i32 to i64
          %1555 = llvm.getelementptr %1553[%1554] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1556 = llvm.getelementptr %1555[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1557 = llvm.load %1556 : !llvm.ptr -> i64
          %1560 = arith.constant 0 : i32
          %1561 = arith.extsi %1560 : i32 to i64
          %1562 = llvm.getelementptr %arg0[%1561] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1559 = llvm.load %1562 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1563 = arith.constant 0 : i32
          %1564 = arith.extsi %1563 : i32 to i64
          %1565 = llvm.getelementptr %arg0[%1564] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1566 = llvm.getelementptr %1565[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1567 = llvm.load %1566 : !llvm.ptr -> !llvm.ptr
          %1568 = llvm.load %1521 : !llvm.ptr -> i32
          %1569 = arith.extsi %1568 : i32 to i64
          %1570 = llvm.getelementptr %1567[%1569] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1558 = llvm.load %1570 : !llvm.ptr -> !llvm.struct<(i64, i32)>
          %1572 = arith.constant 0 : i32
          %1573 = arith.extsi %1572 : i32 to i64
          %1574 = llvm.getelementptr %arg0[%1573] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1571 = llvm.load %1574 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1575 = arith.constant 0 : i32
          %1576 = arith.extsi %1575 : i32 to i64
          %1577 = llvm.getelementptr %arg0[%1576] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1578 = llvm.getelementptr %1577[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1579 = llvm.load %1578 : !llvm.ptr -> !llvm.ptr
          %1580 = llvm.load %1521 : !llvm.ptr -> i32
          %1581 = arith.extsi %1580 : i32 to i64
          %1582 = llvm.getelementptr %1579[%1581] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1583 = llvm.getelementptr %1582[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1584 = llvm.load %1583 : !llvm.ptr -> i64
          %1585 = arith.cmpi ult, %1557, %1584 : i64
          scf.yield %1585 : i1
        } else {
          %1586 = arith.constant false
          scf.yield %1586 : i1
        }
        cf.cond_br %1532, ^bb219, ^bb220
        ^bb219:
          llvm.store %1513, %1521 : i32, !llvm.ptr
          cf.br ^bb221
        ^bb220:
          cf.br ^bb221
        ^bb221:
        %1588 = arith.constant 0 : i32
        %1589 = arith.extsi %1588 : i32 to i64
        %1590 = llvm.getelementptr %arg0[%1589] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1587 = llvm.load %1590 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1591 = arith.constant 0 : i32
        %1592 = arith.extsi %1591 : i32 to i64
        %1593 = llvm.getelementptr %arg0[%1592] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1594 = llvm.getelementptr %1593[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1595 = llvm.load %1594 : !llvm.ptr -> i32
        %1596 = arith.cmpi slt, %1518, %1595 : i32
        %1597 = scf.if %1596 -> (i1) {
          %1600 = arith.constant 0 : i32
          %1601 = arith.extsi %1600 : i32 to i64
          %1602 = llvm.getelementptr %arg0[%1601] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1599 = llvm.load %1602 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1603 = arith.constant 0 : i32
          %1604 = arith.extsi %1603 : i32 to i64
          %1605 = llvm.getelementptr %arg0[%1604] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1606 = llvm.getelementptr %1605[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1607 = llvm.load %1606 : !llvm.ptr -> !llvm.ptr
          %1608 = arith.extsi %1518 : i32 to i64
          %1609 = llvm.getelementptr %1607[%1608] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1598 = llvm.load %1609 : !llvm.ptr -> !llvm.struct<(i64, i32)>
          %1611 = arith.constant 0 : i32
          %1612 = arith.extsi %1611 : i32 to i64
          %1613 = llvm.getelementptr %arg0[%1612] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1610 = llvm.load %1613 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1614 = arith.constant 0 : i32
          %1615 = arith.extsi %1614 : i32 to i64
          %1616 = llvm.getelementptr %arg0[%1615] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1617 = llvm.getelementptr %1616[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1618 = llvm.load %1617 : !llvm.ptr -> !llvm.ptr
          %1619 = arith.extsi %1518 : i32 to i64
          %1620 = llvm.getelementptr %1618[%1619] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1621 = llvm.getelementptr %1620[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1622 = llvm.load %1621 : !llvm.ptr -> i64
          %1625 = arith.constant 0 : i32
          %1626 = arith.extsi %1625 : i32 to i64
          %1627 = llvm.getelementptr %arg0[%1626] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1624 = llvm.load %1627 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1628 = arith.constant 0 : i32
          %1629 = arith.extsi %1628 : i32 to i64
          %1630 = llvm.getelementptr %arg0[%1629] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1631 = llvm.getelementptr %1630[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1632 = llvm.load %1631 : !llvm.ptr -> !llvm.ptr
          %1633 = llvm.load %1521 : !llvm.ptr -> i32
          %1634 = arith.extsi %1633 : i32 to i64
          %1635 = llvm.getelementptr %1632[%1634] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1623 = llvm.load %1635 : !llvm.ptr -> !llvm.struct<(i64, i32)>
          %1637 = arith.constant 0 : i32
          %1638 = arith.extsi %1637 : i32 to i64
          %1639 = llvm.getelementptr %arg0[%1638] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1636 = llvm.load %1639 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1640 = arith.constant 0 : i32
          %1641 = arith.extsi %1640 : i32 to i64
          %1642 = llvm.getelementptr %arg0[%1641] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1643 = llvm.getelementptr %1642[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1644 = llvm.load %1643 : !llvm.ptr -> !llvm.ptr
          %1645 = llvm.load %1521 : !llvm.ptr -> i32
          %1646 = arith.extsi %1645 : i32 to i64
          %1647 = llvm.getelementptr %1644[%1646] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1648 = llvm.getelementptr %1647[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1649 = llvm.load %1648 : !llvm.ptr -> i64
          %1650 = arith.cmpi ult, %1622, %1649 : i64
          scf.yield %1650 : i1
        } else {
          %1651 = arith.constant false
          scf.yield %1651 : i1
        }
        cf.cond_br %1597, ^bb222, ^bb223
        ^bb222:
          llvm.store %1518, %1521 : i32, !llvm.ptr
          cf.br ^bb224
        ^bb223:
          cf.br ^bb224
        ^bb224:
        %1652 = llvm.load %1521 : !llvm.ptr -> i32
        %1653 = llvm.load %1504 : !llvm.ptr -> i32
        %1654 = arith.cmpi eq, %1652, %1653 : i32
        cf.cond_br %1654, ^bb225, ^bb226
        ^bb225:
          %1655 = arith.constant 0 : i1
          llvm.store %1655, %1507 : i1, !llvm.ptr
          cf.br ^bb227
        ^bb226:
          %1658 = arith.constant 0 : i32
          %1659 = arith.extsi %1658 : i32 to i64
          %1660 = llvm.getelementptr %arg0[%1659] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1657 = llvm.load %1660 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1661 = arith.constant 0 : i32
          %1662 = arith.extsi %1661 : i32 to i64
          %1663 = llvm.getelementptr %arg0[%1662] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1664 = llvm.getelementptr %1663[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1665 = llvm.load %1664 : !llvm.ptr -> !llvm.ptr
          %1666 = llvm.load %1504 : !llvm.ptr -> i32
          %1667 = arith.extsi %1666 : i32 to i64
          %1668 = llvm.getelementptr %1665[%1667] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1656 = llvm.load %1668 : !llvm.ptr -> !llvm.struct<(i64, i32)>
          %1669 = llvm.mlir.constant(1 : i64) : i64
          %1670 = llvm.alloca %1669 x !llvm.struct<(i64, i32)> : (i64) -> !llvm.ptr
          llvm.store %1656, %1670 : !llvm.struct<(i64, i32)>, !llvm.ptr
          %1673 = arith.constant 0 : i32
          %1674 = arith.extsi %1673 : i32 to i64
          %1675 = llvm.getelementptr %arg0[%1674] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1672 = llvm.load %1675 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1676 = arith.constant 0 : i32
          %1677 = arith.extsi %1676 : i32 to i64
          %1678 = llvm.getelementptr %arg0[%1677] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1679 = llvm.getelementptr %1678[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1680 = llvm.load %1679 : !llvm.ptr -> !llvm.ptr
          %1681 = llvm.load %1521 : !llvm.ptr -> i32
          %1682 = arith.extsi %1681 : i32 to i64
          %1683 = llvm.getelementptr %1680[%1682] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          %1671 = llvm.load %1683 : !llvm.ptr -> !llvm.struct<(i64, i32)>
          %1685 = arith.constant 0 : i32
          %1686 = arith.extsi %1685 : i32 to i64
          %1687 = llvm.getelementptr %arg0[%1686] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1684 = llvm.load %1687 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1688 = arith.constant 0 : i32
          %1689 = arith.extsi %1688 : i32 to i64
          %1690 = llvm.getelementptr %arg0[%1689] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1691 = llvm.getelementptr %1690[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1692 = llvm.load %1691 : !llvm.ptr -> !llvm.ptr
          %1693 = llvm.load %1504 : !llvm.ptr -> i32
          %1694 = arith.extsi %1693 : i32 to i64
          %1695 = llvm.getelementptr %1692[%1694] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          llvm.store %1671, %1695 : !llvm.struct<(i64, i32)>, !llvm.ptr
          %1696 = llvm.load %1670 : !llvm.ptr -> !llvm.struct<(i64, i32)>
          %1698 = arith.constant 0 : i32
          %1699 = arith.extsi %1698 : i32 to i64
          %1700 = llvm.getelementptr %arg0[%1699] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1697 = llvm.load %1700 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1701 = arith.constant 0 : i32
          %1702 = arith.extsi %1701 : i32 to i64
          %1703 = llvm.getelementptr %arg0[%1702] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1704 = llvm.getelementptr %1703[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1705 = llvm.load %1704 : !llvm.ptr -> !llvm.ptr
          %1706 = llvm.load %1521 : !llvm.ptr -> i32
          %1707 = arith.extsi %1706 : i32 to i64
          %1708 = llvm.getelementptr %1705[%1707] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i64, i32)>
          llvm.store %1696, %1708 : !llvm.struct<(i64, i32)>, !llvm.ptr
          %1709 = llvm.load %1521 : !llvm.ptr -> i32
          llvm.store %1709, %1504 : i32, !llvm.ptr
          cf.br ^bb227
        ^bb227:
        cf.br ^bb216
      ^bb218:
      cf.br ^bb215
    ^bb214:
      cf.br ^bb215
    ^bb215:
    func.return
  }
  func.func @seen_contains(%arg0: !llvm.ptr, %arg1: i32, %arg2: i32) -> i1 {
    %1710 = arith.extsi %arg1 : i32 to i64
    %1711 = arith.constant 1000000 : i32
    %1713 = arith.extsi %1711 : i32 to i64
    %1712 = arith.muli %1710, %1713 : i64
    %1714 = arith.extsi %arg2 : i32 to i64
    %1715 = arith.addi %1712, %1714 : i64
    %1716 = arith.constant 1 : i32
    %1718 = arith.extsi %1716 : i32 to i64
    %1717 = arith.addi %1715, %1718 : i64
    %1720 = arith.constant 0 : i32
    %1721 = arith.extsi %1720 : i32 to i64
    %1722 = llvm.getelementptr %arg0[%1721] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1719 = llvm.load %1722 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1723 = arith.constant 0 : i32
    %1724 = arith.extsi %1723 : i32 to i64
    %1725 = llvm.getelementptr %arg0[%1724] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1726 = llvm.getelementptr %1725[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1727 = llvm.load %1726 : !llvm.ptr -> i32
    %1728 = arith.extsi %1727 : i32 to i64
    %1729 = arith.constant 1 : i32
    %1731 = arith.extsi %1729 : i32 to i64
    %1730 = arith.subi %1728, %1731 : i64
    %1732 = arith.constant 16 : i32
    %1734 = arith.extsi %1732 : i32 to i64
    %1733 = arith.shrsi %1715, %1734 : i64
    %1735 = arith.xori %1715, %1733 : i64
    %1736 = arith.andi %1735, %1730 : i64
    %1737 = llvm.mlir.constant(1 : i64) : i64
    %1738 = llvm.alloca %1737 x i64 : (i64) -> !llvm.ptr
    llvm.store %1736, %1738 : i64, !llvm.ptr
    cf.br ^bb228
    ^bb228:
    %1739 = arith.constant 1 : i1
    cf.cond_br %1739, ^bb229, ^bb230
    ^bb229:
      %1742 = arith.constant 0 : i32
      %1743 = arith.extsi %1742 : i32 to i64
      %1744 = llvm.getelementptr %arg0[%1743] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1741 = llvm.load %1744 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1745 = arith.constant 0 : i32
      %1746 = arith.extsi %1745 : i32 to i64
      %1747 = llvm.getelementptr %arg0[%1746] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1748 = llvm.getelementptr %1747[0, 8] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1749 = llvm.load %1748 : !llvm.ptr -> !llvm.ptr
      %1750 = llvm.load %1738 : !llvm.ptr -> i64
      %1751 = llvm.getelementptr %1749[%1750] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %1740 = llvm.load %1751 : !llvm.ptr -> i64
      %1752 = arith.constant 0 : i32
      %1754 = arith.extsi %1752 : i32 to i64
      %1753 = arith.cmpi eq, %1740, %1754 : i64
      cf.cond_br %1753, ^bb231, ^bb232
      ^bb231:
        %1755 = arith.constant 0 : i1
        func.return %1755 : i1
      ^bb232:
        cf.br ^bb233
      ^bb233:
      %1756 = arith.cmpi eq, %1740, %1717 : i64
      cf.cond_br %1756, ^bb234, ^bb235
      ^bb234:
        %1757 = arith.constant 1 : i1
        func.return %1757 : i1
      ^bb235:
        cf.br ^bb236
      ^bb236:
      %1758 = llvm.load %1738 : !llvm.ptr -> i64
      %1759 = arith.constant 1 : i32
      %1761 = arith.extsi %1759 : i32 to i64
      %1760 = arith.addi %1758, %1761 : i64
      %1762 = arith.andi %1760, %1730 : i64
      llvm.store %1762, %1738 : i64, !llvm.ptr
      cf.br ^bb228
    ^bb230:
    %1763 = arith.constant 0 : i1
    func.return %1763 : i1
  }
  func.func @seen_add(%arg0: !llvm.ptr, %arg1: i32, %arg2: i32) -> () {
    %1764 = arith.extsi %arg1 : i32 to i64
    %1765 = arith.constant 1000000 : i32
    %1767 = arith.extsi %1765 : i32 to i64
    %1766 = arith.muli %1764, %1767 : i64
    %1768 = arith.extsi %arg2 : i32 to i64
    %1769 = arith.addi %1766, %1768 : i64
    %1770 = arith.constant 1 : i32
    %1772 = arith.extsi %1770 : i32 to i64
    %1771 = arith.addi %1769, %1772 : i64
    %1774 = arith.constant 0 : i32
    %1775 = arith.extsi %1774 : i32 to i64
    %1776 = llvm.getelementptr %arg0[%1775] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1773 = llvm.load %1776 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1777 = arith.constant 0 : i32
    %1778 = arith.extsi %1777 : i32 to i64
    %1779 = llvm.getelementptr %arg0[%1778] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1780 = llvm.getelementptr %1779[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %1781 = llvm.load %1780 : !llvm.ptr -> i32
    %1782 = arith.extsi %1781 : i32 to i64
    %1783 = arith.constant 1 : i32
    %1785 = arith.extsi %1783 : i32 to i64
    %1784 = arith.subi %1782, %1785 : i64
    %1786 = arith.constant 16 : i32
    %1788 = arith.extsi %1786 : i32 to i64
    %1787 = arith.shrsi %1769, %1788 : i64
    %1789 = arith.xori %1769, %1787 : i64
    %1790 = arith.andi %1789, %1784 : i64
    %1791 = llvm.mlir.constant(1 : i64) : i64
    %1792 = llvm.alloca %1791 x i64 : (i64) -> !llvm.ptr
    llvm.store %1790, %1792 : i64, !llvm.ptr
    cf.br ^bb237
    ^bb237:
    %1793 = arith.constant 1 : i1
    cf.cond_br %1793, ^bb238, ^bb239
    ^bb238:
      %1796 = arith.constant 0 : i32
      %1797 = arith.extsi %1796 : i32 to i64
      %1798 = llvm.getelementptr %arg0[%1797] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1795 = llvm.load %1798 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1799 = arith.constant 0 : i32
      %1800 = arith.extsi %1799 : i32 to i64
      %1801 = llvm.getelementptr %arg0[%1800] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1802 = llvm.getelementptr %1801[0, 8] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %1803 = llvm.load %1802 : !llvm.ptr -> !llvm.ptr
      %1804 = llvm.load %1792 : !llvm.ptr -> i64
      %1805 = llvm.getelementptr %1803[%1804] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %1794 = llvm.load %1805 : !llvm.ptr -> i64
      %1806 = arith.constant 0 : i32
      %1808 = arith.extsi %1806 : i32 to i64
      %1807 = arith.cmpi eq, %1794, %1808 : i64
      cf.cond_br %1807, ^bb240, ^bb241
      ^bb240:
        %1810 = arith.constant 0 : i32
        %1811 = arith.extsi %1810 : i32 to i64
        %1812 = llvm.getelementptr %arg0[%1811] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1809 = llvm.load %1812 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1813 = arith.constant 0 : i32
        %1814 = arith.extsi %1813 : i32 to i64
        %1815 = llvm.getelementptr %arg0[%1814] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1816 = llvm.getelementptr %1815[0, 8] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1817 = llvm.load %1816 : !llvm.ptr -> !llvm.ptr
        %1818 = llvm.load %1792 : !llvm.ptr -> i64
        %1819 = llvm.getelementptr %1817[%1818] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        llvm.store %1771, %1819 : i64, !llvm.ptr
        %1821 = arith.constant 0 : i32
        %1822 = arith.extsi %1821 : i32 to i64
        %1823 = llvm.getelementptr %arg0[%1822] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1820 = llvm.load %1823 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1824 = arith.constant 0 : i32
        %1825 = arith.extsi %1824 : i32 to i64
        %1826 = llvm.getelementptr %arg0[%1825] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1827 = llvm.getelementptr %1826[0, 9] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1828 = llvm.load %1827 : !llvm.ptr -> i32
        %1829 = arith.constant 1 : i32
        %1830 = arith.addi %1828, %1829 : i32
        %1831 = arith.constant 0 : i32
        %1832 = arith.extsi %1831 : i32 to i64
        %1833 = llvm.getelementptr %arg0[%1832] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1834 = llvm.getelementptr %1833[0, 9] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        llvm.store %1830, %1834 : i32, !llvm.ptr
        %1836 = arith.constant 0 : i32
        %1837 = arith.extsi %1836 : i32 to i64
        %1838 = llvm.getelementptr %arg0[%1837] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1835 = llvm.load %1838 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1839 = arith.constant 0 : i32
        %1840 = arith.extsi %1839 : i32 to i64
        %1841 = llvm.getelementptr %arg0[%1840] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1842 = llvm.getelementptr %1841[0, 9] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1843 = llvm.load %1842 : !llvm.ptr -> i32
        %1844 = arith.constant 2 : i32
        %1845 = arith.muli %1843, %1844 : i32
        %1847 = arith.constant 0 : i32
        %1848 = arith.extsi %1847 : i32 to i64
        %1849 = llvm.getelementptr %arg0[%1848] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1846 = llvm.load %1849 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1850 = arith.constant 0 : i32
        %1851 = arith.extsi %1850 : i32 to i64
        %1852 = llvm.getelementptr %arg0[%1851] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1853 = llvm.getelementptr %1852[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %1854 = llvm.load %1853 : !llvm.ptr -> i32
        %1855 = arith.cmpi sge, %1845, %1854 : i32
        cf.cond_br %1855, ^bb243, ^bb244
        ^bb243:
          %1857 = arith.constant 0 : i32
          %1858 = arith.extsi %1857 : i32 to i64
          %1859 = llvm.getelementptr %arg0[%1858] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1856 = llvm.load %1859 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1860 = arith.constant 0 : i32
          %1861 = arith.extsi %1860 : i32 to i64
          %1862 = llvm.getelementptr %arg0[%1861] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1863 = llvm.getelementptr %1862[0, 8] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1864 = llvm.load %1863 : !llvm.ptr -> !llvm.ptr
          %1866 = arith.constant 0 : i32
          %1867 = arith.extsi %1866 : i32 to i64
          %1868 = llvm.getelementptr %arg0[%1867] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1865 = llvm.load %1868 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1869 = arith.constant 0 : i32
          %1870 = arith.extsi %1869 : i32 to i64
          %1871 = llvm.getelementptr %arg0[%1870] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1872 = llvm.getelementptr %1871[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1873 = llvm.load %1872 : !llvm.ptr -> i32
          %1875 = arith.constant 0 : i32
          %1876 = arith.extsi %1875 : i32 to i64
          %1877 = llvm.getelementptr %arg0[%1876] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1874 = llvm.load %1877 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1878 = arith.constant 0 : i32
          %1879 = arith.extsi %1878 : i32 to i64
          %1880 = llvm.getelementptr %arg0[%1879] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1881 = llvm.getelementptr %1880[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1882 = llvm.load %1881 : !llvm.ptr -> i32
          %1883 = arith.constant 2 : i32
          %1884 = arith.muli %1882, %1883 : i32
          %1885 = arith.constant 0 : i32
          %1886 = arith.extsi %1885 : i32 to i64
          %1887 = llvm.getelementptr %arg0[%1886] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1888 = llvm.getelementptr %1887[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          llvm.store %1884, %1888 : i32, !llvm.ptr
          %1891 = arith.constant 0 : i32
          %1892 = arith.extsi %1891 : i32 to i64
          %1893 = llvm.getelementptr %arg0[%1892] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1890 = llvm.load %1893 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1894 = arith.constant 0 : i32
          %1895 = arith.extsi %1894 : i32 to i64
          %1896 = llvm.getelementptr %arg0[%1895] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1897 = llvm.getelementptr %1896[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1898 = llvm.load %1897 : !llvm.ptr -> i32
          %1899 = arith.extsi %1898 : i32 to i64
          %1900 = arith.constant 8 : i32
          %1901 = arith.extsi %1900 : i32 to i64
          %1889 = func.call @calloc(%1899, %1901) : (i64, i64) -> !llvm.ptr
          %1902 = arith.constant 0 : i32
          %1903 = arith.extsi %1902 : i32 to i64
          %1904 = llvm.getelementptr %arg0[%1903] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1905 = llvm.getelementptr %1904[0, 8] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          llvm.store %1889, %1905 : !llvm.ptr, !llvm.ptr
          %1906 = arith.constant 0 : i32
          %1907 = arith.constant 0 : i32
          %1908 = arith.extsi %1907 : i32 to i64
          %1909 = llvm.getelementptr %arg0[%1908] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1910 = llvm.getelementptr %1909[0, 9] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          llvm.store %1906, %1910 : i32, !llvm.ptr
          %1912 = arith.constant 0 : i32
          %1913 = arith.extsi %1912 : i32 to i64
          %1914 = llvm.getelementptr %arg0[%1913] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1911 = llvm.load %1914 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1915 = arith.constant 0 : i32
          %1916 = arith.extsi %1915 : i32 to i64
          %1917 = llvm.getelementptr %arg0[%1916] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1918 = llvm.getelementptr %1917[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %1919 = llvm.load %1918 : !llvm.ptr -> i32
          %1920 = arith.extsi %1919 : i32 to i64
          %1921 = arith.constant 1 : i32
          %1923 = arith.extsi %1921 : i32 to i64
          %1922 = arith.subi %1920, %1923 : i64
          %1924 = arith.constant 0 : i32
          %1925 = llvm.mlir.constant(1 : i64) : i64
          %1926 = llvm.alloca %1925 x i32 : (i64) -> !llvm.ptr
          llvm.store %1924, %1926 : i32, !llvm.ptr
          cf.br ^bb246
          ^bb246:
          %1927 = llvm.load %1926 : !llvm.ptr -> i32
          %1928 = arith.cmpi slt, %1927, %1873 : i32
          cf.cond_br %1928, ^bb247, ^bb248
          ^bb247:
            %1930 = llvm.load %1926 : !llvm.ptr -> i32
            %1931 = arith.extsi %1930 : i32 to i64
            %1932 = llvm.getelementptr %1864[%1931] : (!llvm.ptr, i64) -> !llvm.ptr, i64
            %1929 = llvm.load %1932 : !llvm.ptr -> i64
            %1933 = arith.constant 0 : i32
            %1935 = arith.extsi %1933 : i32 to i64
            %1934 = arith.cmpi ne, %1929, %1935 : i64
            cf.cond_br %1934, ^bb249, ^bb250
            ^bb249:
              %1936 = arith.constant 1 : i32
              %1938 = arith.extsi %1936 : i32 to i64
              %1937 = arith.subi %1929, %1938 : i64
              %1939 = arith.constant 16 : i32
              %1941 = arith.extsi %1939 : i32 to i64
              %1940 = arith.shrsi %1937, %1941 : i64
              %1942 = arith.xori %1937, %1940 : i64
              %1943 = arith.andi %1942, %1922 : i64
              %1944 = llvm.mlir.constant(1 : i64) : i64
              %1945 = llvm.alloca %1944 x i64 : (i64) -> !llvm.ptr
              llvm.store %1943, %1945 : i64, !llvm.ptr
              cf.br ^bb252
              ^bb252:
              %1948 = arith.constant 0 : i32
              %1949 = arith.extsi %1948 : i32 to i64
              %1950 = llvm.getelementptr %arg0[%1949] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1947 = llvm.load %1950 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1951 = arith.constant 0 : i32
              %1952 = arith.extsi %1951 : i32 to i64
              %1953 = llvm.getelementptr %arg0[%1952] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1954 = llvm.getelementptr %1953[0, 8] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1955 = llvm.load %1954 : !llvm.ptr -> !llvm.ptr
              %1956 = llvm.load %1945 : !llvm.ptr -> i64
              %1957 = llvm.getelementptr %1955[%1956] : (!llvm.ptr, i64) -> !llvm.ptr, i64
              %1946 = llvm.load %1957 : !llvm.ptr -> i64
              %1958 = arith.constant 0 : i32
              %1960 = arith.extsi %1958 : i32 to i64
              %1959 = arith.cmpi ne, %1946, %1960 : i64
              cf.cond_br %1959, ^bb253, ^bb254
              ^bb253:
                %1961 = llvm.load %1945 : !llvm.ptr -> i64
                %1962 = arith.constant 1 : i32
                %1964 = arith.extsi %1962 : i32 to i64
                %1963 = arith.addi %1961, %1964 : i64
                %1965 = arith.andi %1963, %1922 : i64
                llvm.store %1965, %1945 : i64, !llvm.ptr
                cf.br ^bb252
              ^bb254:
              %1967 = arith.constant 0 : i32
              %1968 = arith.extsi %1967 : i32 to i64
              %1969 = llvm.getelementptr %arg0[%1968] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1966 = llvm.load %1969 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1970 = arith.constant 0 : i32
              %1971 = arith.extsi %1970 : i32 to i64
              %1972 = llvm.getelementptr %arg0[%1971] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1973 = llvm.getelementptr %1972[0, 8] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1974 = llvm.load %1973 : !llvm.ptr -> !llvm.ptr
              %1975 = llvm.load %1945 : !llvm.ptr -> i64
              %1976 = llvm.getelementptr %1974[%1975] : (!llvm.ptr, i64) -> !llvm.ptr, i64
              llvm.store %1929, %1976 : i64, !llvm.ptr
              %1978 = arith.constant 0 : i32
              %1979 = arith.extsi %1978 : i32 to i64
              %1980 = llvm.getelementptr %arg0[%1979] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1977 = llvm.load %1980 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1981 = arith.constant 0 : i32
              %1982 = arith.extsi %1981 : i32 to i64
              %1983 = llvm.getelementptr %arg0[%1982] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1984 = llvm.getelementptr %1983[0, 9] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1985 = llvm.load %1984 : !llvm.ptr -> i32
              %1986 = arith.constant 1 : i32
              %1987 = arith.addi %1985, %1986 : i32
              %1988 = arith.constant 0 : i32
              %1989 = arith.extsi %1988 : i32 to i64
              %1990 = llvm.getelementptr %arg0[%1989] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              %1991 = llvm.getelementptr %1990[0, 9] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
              llvm.store %1987, %1991 : i32, !llvm.ptr
              cf.br ^bb251
            ^bb250:
              cf.br ^bb251
            ^bb251:
            %1992 = llvm.load %1926 : !llvm.ptr -> i32
            %1993 = arith.constant 1 : i32
            %1994 = arith.addi %1992, %1993 : i32
            llvm.store %1994, %1926 : i32, !llvm.ptr
            cf.br ^bb246
          ^bb248:
          func.call @free(%1864) : (!llvm.ptr) -> ()
          cf.br ^bb245
        ^bb244:
          cf.br ^bb245
        ^bb245:
        func.return
      ^bb241:
        cf.br ^bb242
      ^bb242:
      %1996 = arith.cmpi eq, %1794, %1771 : i64
      cf.cond_br %1996, ^bb255, ^bb256
      ^bb255:
        func.return
      ^bb256:
        cf.br ^bb257
      ^bb257:
      %1997 = llvm.load %1792 : !llvm.ptr -> i64
      %1998 = arith.constant 1 : i32
      %2000 = arith.extsi %1998 : i32 to i64
      %1999 = arith.addi %1997, %2000 : i64
      %2001 = arith.andi %1999, %1784 : i64
      llvm.store %2001, %1792 : i64, !llvm.ptr
      cf.br ^bb237
    ^bb239:
    func.return
  }
  func.func @get_value(%arg0: !llvm.ptr, %arg1: i32) -> i64 {
  }
  func.func @ensure_right_ge(%arg0: !llvm.ptr, %arg1: i64) -> i32 {
    %2005 = arith.constant 0 : i32
    %2006 = arith.extsi %2005 : i32 to i64
    %2007 = llvm.getelementptr %arg0[%2006] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2004 = llvm.load %2007 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2008 = arith.constant 0 : i32
    %2009 = arith.extsi %2008 : i32 to i64
    %2010 = llvm.getelementptr %arg0[%2009] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2011 = llvm.getelementptr %2010[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2012 = llvm.load %2011 : !llvm.ptr -> !llvm.ptr
    %2013 = arith.constant 0 : i32
    %2014 = arith.extsi %2013 : i32 to i64
    %2015 = llvm.getelementptr %2012[%2014] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2003 = llvm.load %2015 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2017 = arith.constant 0 : i32
    %2018 = arith.extsi %2017 : i32 to i64
    %2019 = llvm.getelementptr %arg0[%2018] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2016 = llvm.load %2019 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2020 = arith.constant 0 : i32
    %2021 = arith.extsi %2020 : i32 to i64
    %2022 = llvm.getelementptr %arg0[%2021] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2023 = llvm.getelementptr %2022[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2024 = llvm.load %2023 : !llvm.ptr -> !llvm.ptr
    %2025 = arith.constant 0 : i32
    %2026 = arith.extsi %2025 : i32 to i64
    %2027 = llvm.getelementptr %2024[%2026] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2028 = llvm.getelementptr %2027[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2029 = llvm.load %2028 : !llvm.ptr -> !llvm.ptr
    %2002 = func.call @find_seq(%2029) : (!llvm.ptr) -> !llvm.ptr
    %2030 = llvm.mlir.zero : !llvm.ptr
    %2031 = llvm.icmp "eq" %2002, %2030 : !llvm.ptr
    cf.cond_br %2031, ^bb258, ^bb259
    ^bb258:
      %2032 = arith.constant 1 : i32
      %2034 = arith.constant 0 : i32
      %2033 = arith.subi %2034, %2032 : i32
      func.return %2033 : i32
    ^bb259:
      cf.br ^bb260
    ^bb260:
    %2036 = arith.constant 0 : i32
    %2037 = arith.extsi %2036 : i32 to i64
    %2038 = llvm.getelementptr %2002[%2037] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2035 = llvm.load %2038 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2039 = arith.constant 0 : i32
    %2040 = arith.extsi %2039 : i32 to i64
    %2041 = llvm.getelementptr %2002[%2040] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2042 = llvm.getelementptr %2041[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2043 = llvm.load %2042 : !llvm.ptr -> i32
    %2044 = arith.constant 0 : i32
    %2045 = arith.cmpi eq, %2043, %2044 : i32
    cf.cond_br %2045, ^bb261, ^bb262
    ^bb261:
      %2049 = arith.constant 0 : i32
      %2050 = arith.extsi %2049 : i32 to i64
      %2051 = llvm.getelementptr %arg0[%2050] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2048 = llvm.load %2051 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2052 = arith.constant 0 : i32
      %2053 = arith.extsi %2052 : i32 to i64
      %2054 = llvm.getelementptr %arg0[%2053] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2055 = llvm.getelementptr %2054[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2056 = llvm.load %2055 : !llvm.ptr -> !llvm.ptr
      %2057 = arith.constant 0 : i32
      %2058 = arith.extsi %2057 : i32 to i64
      %2059 = llvm.getelementptr %2056[%2058] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2047 = llvm.load %2059 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2061 = arith.constant 0 : i32
      %2062 = arith.extsi %2061 : i32 to i64
      %2063 = llvm.getelementptr %arg0[%2062] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2060 = llvm.load %2063 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2064 = arith.constant 0 : i32
      %2065 = arith.extsi %2064 : i32 to i64
      %2066 = llvm.getelementptr %arg0[%2065] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2067 = llvm.getelementptr %2066[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2068 = llvm.load %2067 : !llvm.ptr -> !llvm.ptr
      %2069 = arith.constant 0 : i32
      %2070 = arith.extsi %2069 : i32 to i64
      %2071 = llvm.getelementptr %2068[%2070] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2072 = llvm.getelementptr %2071[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2073 = llvm.load %2072 : !llvm.ptr -> !llvm.ptr
      %2074 = arith.constant 0 : i32
      %2046 = func.call @get_value(%2073, %2074) : (!llvm.ptr, i32) -> i64
      %2075 = arith.constant 0 : i32
      %2077 = arith.extsi %2075 : i32 to i64
      %2076 = arith.cmpi eq, %2046, %2077 : i64
      %2078 = scf.if %2076 -> (i1) {
        %2079 = arith.constant true
        scf.yield %2079 : i1
      } else {
        %2081 = arith.constant 0 : i32
        %2082 = arith.extsi %2081 : i32 to i64
        %2083 = llvm.getelementptr %arg0[%2082] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2080 = llvm.load %2083 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2084 = arith.constant 0 : i32
        %2085 = arith.extsi %2084 : i32 to i64
        %2086 = llvm.getelementptr %arg0[%2085] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2087 = llvm.getelementptr %2086[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2088 = llvm.load %2087 : !llvm.ptr -> i64
        %2089 = arith.cmpi ugt, %2046, %2088 : i64
        scf.yield %2089 : i1
      }
      cf.cond_br %2078, ^bb264, ^bb265
      ^bb264:
        %2090 = arith.constant 1 : i32
        %2092 = arith.constant 0 : i32
        %2091 = arith.subi %2092, %2090 : i32
        func.return %2091 : i32
      ^bb265:
        cf.br ^bb266
      ^bb266:
      cf.br ^bb263
    ^bb262:
      cf.br ^bb263
    ^bb263:
    cf.br ^bb267
    ^bb267:
    %2095 = arith.constant 0 : i32
    %2096 = arith.extsi %2095 : i32 to i64
    %2097 = llvm.getelementptr %2002[%2096] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2094 = llvm.load %2097 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2098 = arith.constant 0 : i32
    %2099 = arith.extsi %2098 : i32 to i64
    %2100 = llvm.getelementptr %2002[%2099] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2101 = llvm.getelementptr %2100[0, 11] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2102 = llvm.load %2101 : !llvm.ptr -> !llvm.ptr
    %2104 = arith.constant 0 : i32
    %2105 = arith.extsi %2104 : i32 to i64
    %2106 = llvm.getelementptr %2002[%2105] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2103 = llvm.load %2106 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2107 = arith.constant 0 : i32
    %2108 = arith.extsi %2107 : i32 to i64
    %2109 = llvm.getelementptr %2002[%2108] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2110 = llvm.getelementptr %2109[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2111 = llvm.load %2110 : !llvm.ptr -> i32
    %2112 = arith.constant 1 : i32
    %2113 = arith.subi %2111, %2112 : i32
    %2114 = arith.extsi %2113 : i32 to i64
    %2115 = llvm.getelementptr %2102[%2114] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    %2093 = llvm.load %2115 : !llvm.ptr -> i64
    %2116 = arith.cmpi ult, %2093, %arg1 : i64
    cf.cond_br %2116, ^bb268, ^bb269
    ^bb268:
      %2120 = arith.constant 0 : i32
      %2121 = arith.extsi %2120 : i32 to i64
      %2122 = llvm.getelementptr %arg0[%2121] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2119 = llvm.load %2122 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2123 = arith.constant 0 : i32
      %2124 = arith.extsi %2123 : i32 to i64
      %2125 = llvm.getelementptr %arg0[%2124] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2126 = llvm.getelementptr %2125[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2127 = llvm.load %2126 : !llvm.ptr -> !llvm.ptr
      %2128 = arith.constant 0 : i32
      %2129 = arith.extsi %2128 : i32 to i64
      %2130 = llvm.getelementptr %2127[%2129] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2118 = llvm.load %2130 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2132 = arith.constant 0 : i32
      %2133 = arith.extsi %2132 : i32 to i64
      %2134 = llvm.getelementptr %arg0[%2133] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2131 = llvm.load %2134 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2135 = arith.constant 0 : i32
      %2136 = arith.extsi %2135 : i32 to i64
      %2137 = llvm.getelementptr %arg0[%2136] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2138 = llvm.getelementptr %2137[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2139 = llvm.load %2138 : !llvm.ptr -> !llvm.ptr
      %2140 = arith.constant 0 : i32
      %2141 = arith.extsi %2140 : i32 to i64
      %2142 = llvm.getelementptr %2139[%2141] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2143 = llvm.getelementptr %2142[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2144 = llvm.load %2143 : !llvm.ptr -> !llvm.ptr
      %2146 = arith.constant 0 : i32
      %2147 = arith.extsi %2146 : i32 to i64
      %2148 = llvm.getelementptr %2002[%2147] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2145 = llvm.load %2148 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2149 = arith.constant 0 : i32
      %2150 = arith.extsi %2149 : i32 to i64
      %2151 = llvm.getelementptr %2002[%2150] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2152 = llvm.getelementptr %2151[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2153 = llvm.load %2152 : !llvm.ptr -> i32
      %2117 = func.call @get_value(%2144, %2153) : (!llvm.ptr, i32) -> i64
      %2154 = arith.constant 0 : i32
      %2156 = arith.extsi %2154 : i32 to i64
      %2155 = arith.cmpi eq, %2117, %2156 : i64
      %2157 = scf.if %2155 -> (i1) {
        %2158 = arith.constant true
        scf.yield %2158 : i1
      } else {
        %2160 = arith.constant 0 : i32
        %2161 = arith.extsi %2160 : i32 to i64
        %2162 = llvm.getelementptr %arg0[%2161] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2159 = llvm.load %2162 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2163 = arith.constant 0 : i32
        %2164 = arith.extsi %2163 : i32 to i64
        %2165 = llvm.getelementptr %arg0[%2164] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2166 = llvm.getelementptr %2165[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2167 = llvm.load %2166 : !llvm.ptr -> i64
        %2168 = arith.cmpi ugt, %2117, %2167 : i64
        scf.yield %2168 : i1
      }
      cf.cond_br %2157, ^bb270, ^bb271
      ^bb270:
        cf.br ^bb269
      ^bb271:
        cf.br ^bb272
      ^bb272:
      cf.br ^bb267
    ^bb269:
    %2171 = arith.constant 0 : i32
    %2172 = arith.extsi %2171 : i32 to i64
    %2173 = llvm.getelementptr %2002[%2172] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2170 = llvm.load %2173 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2174 = arith.constant 0 : i32
    %2175 = arith.extsi %2174 : i32 to i64
    %2176 = llvm.getelementptr %2002[%2175] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2177 = llvm.getelementptr %2176[0, 11] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2178 = llvm.load %2177 : !llvm.ptr -> !llvm.ptr
    %2180 = arith.constant 0 : i32
    %2181 = arith.extsi %2180 : i32 to i64
    %2182 = llvm.getelementptr %2002[%2181] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2179 = llvm.load %2182 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2183 = arith.constant 0 : i32
    %2184 = arith.extsi %2183 : i32 to i64
    %2185 = llvm.getelementptr %2002[%2184] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2186 = llvm.getelementptr %2185[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2187 = llvm.load %2186 : !llvm.ptr -> i32
    %2188 = arith.constant 1 : i32
    %2189 = arith.subi %2187, %2188 : i32
    %2190 = arith.extsi %2189 : i32 to i64
    %2191 = llvm.getelementptr %2178[%2190] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    %2169 = llvm.load %2191 : !llvm.ptr -> i64
    %2192 = arith.cmpi ult, %2169, %arg1 : i64
    cf.cond_br %2192, ^bb273, ^bb274
    ^bb273:
      %2193 = arith.constant 1 : i32
      %2195 = arith.constant 0 : i32
      %2194 = arith.subi %2195, %2193 : i32
      func.return %2194 : i32
    ^bb274:
      cf.br ^bb275
    ^bb275:
    %2196 = arith.constant 0 : i32
    %2197 = llvm.mlir.constant(1 : i64) : i64
    %2198 = llvm.alloca %2197 x i32 : (i64) -> !llvm.ptr
    llvm.store %2196, %2198 : i32, !llvm.ptr
    %2200 = arith.constant 0 : i32
    %2201 = arith.extsi %2200 : i32 to i64
    %2202 = llvm.getelementptr %2002[%2201] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2199 = llvm.load %2202 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2203 = arith.constant 0 : i32
    %2204 = arith.extsi %2203 : i32 to i64
    %2205 = llvm.getelementptr %2002[%2204] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2206 = llvm.getelementptr %2205[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2207 = llvm.load %2206 : !llvm.ptr -> i32
    %2208 = arith.constant 1 : i32
    %2209 = arith.subi %2207, %2208 : i32
    %2210 = llvm.mlir.constant(1 : i64) : i64
    %2211 = llvm.alloca %2210 x i32 : (i64) -> !llvm.ptr
    llvm.store %2209, %2211 : i32, !llvm.ptr
    cf.br ^bb276
    ^bb276:
    %2212 = llvm.load %2198 : !llvm.ptr -> i32
    %2213 = llvm.load %2211 : !llvm.ptr -> i32
    %2214 = arith.cmpi slt, %2212, %2213 : i32
    cf.cond_br %2214, ^bb277, ^bb278
    ^bb277:
      %2215 = llvm.load %2198 : !llvm.ptr -> i32
      %2216 = llvm.load %2211 : !llvm.ptr -> i32
      %2217 = arith.addi %2215, %2216 : i32
      %2218 = arith.constant 2 : i32
      %2219 = arith.divsi %2217, %2218 : i32
      %2222 = arith.constant 0 : i32
      %2223 = arith.extsi %2222 : i32 to i64
      %2224 = llvm.getelementptr %2002[%2223] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2221 = llvm.load %2224 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2225 = arith.constant 0 : i32
      %2226 = arith.extsi %2225 : i32 to i64
      %2227 = llvm.getelementptr %2002[%2226] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2228 = llvm.getelementptr %2227[0, 11] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2229 = llvm.load %2228 : !llvm.ptr -> !llvm.ptr
      %2230 = arith.extsi %2219 : i32 to i64
      %2231 = llvm.getelementptr %2229[%2230] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %2220 = llvm.load %2231 : !llvm.ptr -> i64
      %2232 = arith.cmpi ult, %2220, %arg1 : i64
      cf.cond_br %2232, ^bb279, ^bb280
      ^bb279:
        %2233 = arith.constant 1 : i32
        %2234 = arith.addi %2219, %2233 : i32
        llvm.store %2234, %2198 : i32, !llvm.ptr
        cf.br ^bb281
      ^bb280:
        llvm.store %2219, %2211 : i32, !llvm.ptr
        cf.br ^bb281
      ^bb281:
      cf.br ^bb276
    ^bb278:
    %2235 = llvm.load %2198 : !llvm.ptr -> i32
    func.return %2235 : i32
  }
  func.func @try_push(%arg0: !llvm.ptr, %arg1: i32, %arg2: i32) -> () {
    %2236 = func.call @seen_contains(%arg0, %arg1, %arg2) : (!llvm.ptr, i32, i32) -> i1
    cf.cond_br %2236, ^bb282, ^bb283
    ^bb282:
      func.return
    ^bb283:
      cf.br ^bb284
    ^bb284:
    %2240 = arith.constant 0 : i32
    %2241 = arith.extsi %2240 : i32 to i64
    %2242 = llvm.getelementptr %arg0[%2241] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2239 = llvm.load %2242 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2243 = arith.constant 0 : i32
    %2244 = arith.extsi %2243 : i32 to i64
    %2245 = llvm.getelementptr %arg0[%2244] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2246 = llvm.getelementptr %2245[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2247 = llvm.load %2246 : !llvm.ptr -> !llvm.ptr
    %2248 = arith.constant 0 : i32
    %2249 = arith.extsi %2248 : i32 to i64
    %2250 = llvm.getelementptr %2247[%2249] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2238 = llvm.load %2250 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2252 = arith.constant 0 : i32
    %2253 = arith.extsi %2252 : i32 to i64
    %2254 = llvm.getelementptr %arg0[%2253] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2251 = llvm.load %2254 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2255 = arith.constant 0 : i32
    %2256 = arith.extsi %2255 : i32 to i64
    %2257 = llvm.getelementptr %arg0[%2256] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2258 = llvm.getelementptr %2257[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2259 = llvm.load %2258 : !llvm.ptr -> !llvm.ptr
    %2260 = arith.constant 0 : i32
    %2261 = arith.extsi %2260 : i32 to i64
    %2262 = llvm.getelementptr %2259[%2261] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2263 = llvm.getelementptr %2262[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2264 = llvm.load %2263 : !llvm.ptr -> !llvm.ptr
    %2237 = func.call @get_value(%2264, %arg1) : (!llvm.ptr, i32) -> i64
    %2268 = arith.constant 0 : i32
    %2269 = arith.extsi %2268 : i32 to i64
    %2270 = llvm.getelementptr %arg0[%2269] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2267 = llvm.load %2270 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2271 = arith.constant 0 : i32
    %2272 = arith.extsi %2271 : i32 to i64
    %2273 = llvm.getelementptr %arg0[%2272] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2274 = llvm.getelementptr %2273[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2275 = llvm.load %2274 : !llvm.ptr -> !llvm.ptr
    %2276 = arith.constant 0 : i32
    %2277 = arith.extsi %2276 : i32 to i64
    %2278 = llvm.getelementptr %2275[%2277] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2266 = llvm.load %2278 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2280 = arith.constant 0 : i32
    %2281 = arith.extsi %2280 : i32 to i64
    %2282 = llvm.getelementptr %arg0[%2281] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2279 = llvm.load %2282 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2283 = arith.constant 0 : i32
    %2284 = arith.extsi %2283 : i32 to i64
    %2285 = llvm.getelementptr %arg0[%2284] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2286 = llvm.getelementptr %2285[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2287 = llvm.load %2286 : !llvm.ptr -> !llvm.ptr
    %2288 = arith.constant 0 : i32
    %2289 = arith.extsi %2288 : i32 to i64
    %2290 = llvm.getelementptr %2287[%2289] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2291 = llvm.getelementptr %2290[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2292 = llvm.load %2291 : !llvm.ptr -> !llvm.ptr
    %2265 = func.call @get_value(%2292, %arg2) : (!llvm.ptr, i32) -> i64
    %2293 = arith.constant 0 : i32
    %2295 = arith.extsi %2293 : i32 to i64
    %2294 = arith.cmpi eq, %2237, %2295 : i64
    %2296 = scf.if %2294 -> (i1) {
      %2297 = arith.constant true
      scf.yield %2297 : i1
    } else {
      %2298 = arith.constant 0 : i32
      %2300 = arith.extsi %2298 : i32 to i64
      %2299 = arith.cmpi eq, %2265, %2300 : i64
      scf.yield %2299 : i1
    }
    cf.cond_br %2296, ^bb285, ^bb286
    ^bb285:
      func.return
    ^bb286:
      cf.br ^bb287
    ^bb287:
    %2301 = arith.cmpi ugt, %2237, %2265 : i64
    cf.cond_br %2301, ^bb288, ^bb289
    ^bb288:
      func.return
    ^bb289:
      cf.br ^bb290
    ^bb290:
    %2302 = arith.muli %2237, %2265 : i64
    %2304 = arith.constant 0 : i32
    %2305 = arith.extsi %2304 : i32 to i64
    %2306 = llvm.getelementptr %arg0[%2305] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2303 = llvm.load %2306 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2307 = arith.constant 0 : i32
    %2308 = arith.extsi %2307 : i32 to i64
    %2309 = llvm.getelementptr %arg0[%2308] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2310 = llvm.getelementptr %2309[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2311 = llvm.load %2310 : !llvm.ptr -> i64
    %2312 = arith.cmpi ugt, %2302, %2311 : i64
    cf.cond_br %2312, ^bb291, ^bb292
    ^bb291:
      func.return
    ^bb292:
      cf.br ^bb293
    ^bb293:
    func.call @seen_add(%arg0, %arg1, %arg2) : (!llvm.ptr, i32, i32) -> ()
    %2315 = arith.constant 1000000 : i32
    %2316 = arith.muli %arg1, %2315 : i32
    %2317 = arith.addi %2316, %arg2 : i32
    func.call @hpush(%arg0, %2302, %2317) : (!llvm.ptr, i64, i32) -> ()
    func.return
  }
  func.func @next_candidate(%arg0: !llvm.ptr) -> i64 {
    %2319 = arith.constant 0 : i32
    %2320 = arith.extsi %2319 : i32 to i64
    %2321 = llvm.getelementptr %arg0[%2320] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2318 = llvm.load %2321 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2322 = arith.constant 0 : i32
    %2323 = arith.extsi %2322 : i32 to i64
    %2324 = llvm.getelementptr %arg0[%2323] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2325 = llvm.getelementptr %2324[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2326 = llvm.load %2325 : !llvm.ptr -> i32
    %2327 = arith.constant 0 : i32
    %2328 = arith.cmpi eq, %2326, %2327 : i32
    %2329 = scf.if %2328 -> (i1) {
      %2331 = arith.constant 0 : i32
      %2332 = arith.extsi %2331 : i32 to i64
      %2333 = llvm.getelementptr %arg0[%2332] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2330 = llvm.load %2333 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2334 = arith.constant 0 : i32
      %2335 = arith.extsi %2334 : i32 to i64
      %2336 = llvm.getelementptr %arg0[%2335] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2337 = llvm.getelementptr %2336[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2338 = llvm.load %2337 : !llvm.ptr -> i32
      %2339 = arith.constant 0 : i32
      %2340 = arith.cmpi eq, %2338, %2339 : i32
      scf.yield %2340 : i1
    } else {
      %2341 = arith.constant false
      scf.yield %2341 : i1
    }
    cf.cond_br %2329, ^bb294, ^bb295
    ^bb294:
      %2345 = arith.constant 0 : i32
      %2346 = arith.extsi %2345 : i32 to i64
      %2347 = llvm.getelementptr %arg0[%2346] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2344 = llvm.load %2347 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2348 = arith.constant 0 : i32
      %2349 = arith.extsi %2348 : i32 to i64
      %2350 = llvm.getelementptr %arg0[%2349] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2351 = llvm.getelementptr %2350[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2352 = llvm.load %2351 : !llvm.ptr -> !llvm.ptr
      %2353 = arith.constant 0 : i32
      %2354 = arith.extsi %2353 : i32 to i64
      %2355 = llvm.getelementptr %2352[%2354] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2343 = llvm.load %2355 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2357 = arith.constant 0 : i32
      %2358 = arith.extsi %2357 : i32 to i64
      %2359 = llvm.getelementptr %arg0[%2358] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2356 = llvm.load %2359 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2360 = arith.constant 0 : i32
      %2361 = arith.extsi %2360 : i32 to i64
      %2362 = llvm.getelementptr %arg0[%2361] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2363 = llvm.getelementptr %2362[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2364 = llvm.load %2363 : !llvm.ptr -> !llvm.ptr
      %2365 = arith.constant 0 : i32
      %2366 = arith.extsi %2365 : i32 to i64
      %2367 = llvm.getelementptr %2364[%2366] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2368 = llvm.getelementptr %2367[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2369 = llvm.load %2368 : !llvm.ptr -> !llvm.ptr
      %2370 = arith.constant 0 : i32
      %2342 = func.call @get_value(%2369, %2370) : (!llvm.ptr, i32) -> i64
      %2371 = arith.constant 0 : i32
      %2373 = arith.extsi %2371 : i32 to i64
      %2372 = arith.cmpi eq, %2342, %2373 : i64
      cf.cond_br %2372, ^bb297, ^bb298
      ^bb297:
        %2374 = arith.constant 0 : i32
        %2375 = arith.extsi %2374 : i32 to i64
        func.return %2375 : i64
      ^bb298:
        cf.br ^bb299
      ^bb299:
      %2376 = func.call @ensure_right_ge(%arg0, %2342) : (!llvm.ptr, i64) -> i32
      %2377 = arith.constant 0 : i32
      %2378 = arith.cmpi sge, %2376, %2377 : i32
      cf.cond_br %2378, ^bb300, ^bb301
      ^bb300:
        %2380 = arith.constant 0 : i32
        func.call @try_push(%arg0, %2380, %2376) : (!llvm.ptr, i32, i32) -> ()
        cf.br ^bb302
      ^bb301:
        cf.br ^bb302
      ^bb302:
      %2381 = arith.constant 1 : i32
      %2382 = arith.constant 0 : i32
      %2383 = arith.extsi %2382 : i32 to i64
      %2384 = llvm.getelementptr %arg0[%2383] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2385 = llvm.getelementptr %2384[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %2381, %2385 : i32, !llvm.ptr
      cf.br ^bb296
    ^bb295:
      cf.br ^bb296
    ^bb296:
    %2386 = llvm.mlir.addressof @g_val_ptr : !llvm.ptr
    %2387 = llvm.load %2386 : !llvm.ptr -> !llvm.ptr
    %2388 = llvm.mlir.addressof @g_data_ptr : !llvm.ptr
    %2389 = llvm.load %2388 : !llvm.ptr -> !llvm.ptr
    cf.br ^bb303
    ^bb303:
    %2390 = arith.constant 1 : i1
    cf.cond_br %2390, ^bb304, ^bb305
    ^bb304:
      %2392 = arith.constant 0 : i32
      %2393 = arith.extsi %2392 : i32 to i64
      %2394 = llvm.getelementptr %arg0[%2393] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2391 = llvm.load %2394 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2395 = arith.constant 0 : i32
      %2396 = arith.extsi %2395 : i32 to i64
      %2397 = llvm.getelementptr %arg0[%2396] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2398 = llvm.getelementptr %2397[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2399 = llvm.load %2398 : !llvm.ptr -> i32
      %2400 = arith.constant 0 : i32
      %2401 = arith.cmpi eq, %2399, %2400 : i32
      cf.cond_br %2401, ^bb306, ^bb307
      ^bb306:
        %2405 = arith.constant 0 : i32
        %2406 = arith.extsi %2405 : i32 to i64
        %2407 = llvm.getelementptr %arg0[%2406] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2404 = llvm.load %2407 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2408 = arith.constant 0 : i32
        %2409 = arith.extsi %2408 : i32 to i64
        %2410 = llvm.getelementptr %arg0[%2409] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2411 = llvm.getelementptr %2410[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2412 = llvm.load %2411 : !llvm.ptr -> !llvm.ptr
        %2413 = arith.constant 0 : i32
        %2414 = arith.extsi %2413 : i32 to i64
        %2415 = llvm.getelementptr %2412[%2414] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
        %2403 = llvm.load %2415 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
        %2417 = arith.constant 0 : i32
        %2418 = arith.extsi %2417 : i32 to i64
        %2419 = llvm.getelementptr %arg0[%2418] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2416 = llvm.load %2419 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2420 = arith.constant 0 : i32
        %2421 = arith.extsi %2420 : i32 to i64
        %2422 = llvm.getelementptr %arg0[%2421] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2423 = llvm.getelementptr %2422[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2424 = llvm.load %2423 : !llvm.ptr -> !llvm.ptr
        %2425 = arith.constant 0 : i32
        %2426 = arith.extsi %2425 : i32 to i64
        %2427 = llvm.getelementptr %2424[%2426] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
        %2428 = llvm.getelementptr %2427[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
        %2429 = llvm.load %2428 : !llvm.ptr -> !llvm.ptr
        %2431 = arith.constant 0 : i32
        %2432 = arith.extsi %2431 : i32 to i64
        %2433 = llvm.getelementptr %arg0[%2432] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2430 = llvm.load %2433 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2434 = arith.constant 0 : i32
        %2435 = arith.extsi %2434 : i32 to i64
        %2436 = llvm.getelementptr %arg0[%2435] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2437 = llvm.getelementptr %2436[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2438 = llvm.load %2437 : !llvm.ptr -> i32
        %2402 = func.call @get_value(%2429, %2438) : (!llvm.ptr, i32) -> i64
        %2439 = arith.constant 0 : i32
        %2441 = arith.extsi %2439 : i32 to i64
        %2440 = arith.cmpi eq, %2402, %2441 : i64
        cf.cond_br %2440, ^bb309, ^bb310
        ^bb309:
          %2442 = arith.constant 0 : i32
          %2443 = arith.extsi %2442 : i32 to i64
          func.return %2443 : i64
        ^bb310:
          cf.br ^bb311
        ^bb311:
        %2444 = arith.muli %2402, %2402 : i64
        %2446 = arith.constant 0 : i32
        %2447 = arith.extsi %2446 : i32 to i64
        %2448 = llvm.getelementptr %arg0[%2447] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2445 = llvm.load %2448 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2449 = arith.constant 0 : i32
        %2450 = arith.extsi %2449 : i32 to i64
        %2451 = llvm.getelementptr %arg0[%2450] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2452 = llvm.getelementptr %2451[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2453 = llvm.load %2452 : !llvm.ptr -> i64
        %2454 = arith.cmpi ugt, %2444, %2453 : i64
        cf.cond_br %2454, ^bb312, ^bb313
        ^bb312:
          %2455 = arith.constant 0 : i32
          %2456 = arith.extsi %2455 : i32 to i64
          func.return %2456 : i64
        ^bb313:
          cf.br ^bb314
        ^bb314:
        %2457 = func.call @ensure_right_ge(%arg0, %2402) : (!llvm.ptr, i64) -> i32
        %2458 = arith.constant 0 : i32
        %2459 = arith.cmpi slt, %2457, %2458 : i32
        cf.cond_br %2459, ^bb315, ^bb316
        ^bb315:
          %2460 = arith.constant 0 : i32
          %2461 = arith.extsi %2460 : i32 to i64
          func.return %2461 : i64
        ^bb316:
          cf.br ^bb317
        ^bb317:
        %2464 = arith.constant 0 : i32
        %2465 = arith.extsi %2464 : i32 to i64
        %2466 = llvm.getelementptr %arg0[%2465] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2463 = llvm.load %2466 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2467 = arith.constant 0 : i32
        %2468 = arith.extsi %2467 : i32 to i64
        %2469 = llvm.getelementptr %arg0[%2468] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2470 = llvm.getelementptr %2469[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2471 = llvm.load %2470 : !llvm.ptr -> i32
        func.call @try_push(%arg0, %2471, %2457) : (!llvm.ptr, i32, i32) -> ()
        %2473 = arith.constant 0 : i32
        %2474 = arith.extsi %2473 : i32 to i64
        %2475 = llvm.getelementptr %arg0[%2474] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2472 = llvm.load %2475 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2476 = arith.constant 0 : i32
        %2477 = arith.extsi %2476 : i32 to i64
        %2478 = llvm.getelementptr %arg0[%2477] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2479 = llvm.getelementptr %2478[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2480 = llvm.load %2479 : !llvm.ptr -> i32
        %2481 = arith.constant 1 : i32
        %2482 = arith.addi %2480, %2481 : i32
        %2483 = arith.constant 0 : i32
        %2484 = arith.extsi %2483 : i32 to i64
        %2485 = llvm.getelementptr %arg0[%2484] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2486 = llvm.getelementptr %2485[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        llvm.store %2482, %2486 : i32, !llvm.ptr
        cf.br ^bb303
      ^bb307:
        cf.br ^bb308
      ^bb308:
      func.call @hpop(%arg0, %2387, %2389) : (!llvm.ptr, !llvm.ptr, !llvm.ptr) -> ()
      %2489 = arith.constant 0 : i32
      %2490 = arith.extsi %2489 : i32 to i64
      %2491 = llvm.getelementptr %2387[%2490] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %2488 = llvm.load %2491 : !llvm.ptr -> i64
      %2493 = arith.constant 0 : i32
      %2494 = arith.extsi %2493 : i32 to i64
      %2495 = llvm.getelementptr %2389[%2494] : (!llvm.ptr, i64) -> !llvm.ptr, i32
      %2492 = llvm.load %2495 : !llvm.ptr -> i32
      %2496 = arith.constant 1000000 : i32
      %2497 = arith.divsi %2492, %2496 : i32
      %2498 = arith.constant 1000000 : i32
      %2499 = arith.remsi %2492, %2498 : i32
      cf.br ^bb318
      ^bb318:
      %2500 = arith.constant 1 : i1
      cf.cond_br %2500, ^bb319, ^bb320
      ^bb319:
        %2504 = arith.constant 0 : i32
        %2505 = arith.extsi %2504 : i32 to i64
        %2506 = llvm.getelementptr %arg0[%2505] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2503 = llvm.load %2506 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2507 = arith.constant 0 : i32
        %2508 = arith.extsi %2507 : i32 to i64
        %2509 = llvm.getelementptr %arg0[%2508] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2510 = llvm.getelementptr %2509[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2511 = llvm.load %2510 : !llvm.ptr -> !llvm.ptr
        %2512 = arith.constant 0 : i32
        %2513 = arith.extsi %2512 : i32 to i64
        %2514 = llvm.getelementptr %2511[%2513] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
        %2502 = llvm.load %2514 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
        %2516 = arith.constant 0 : i32
        %2517 = arith.extsi %2516 : i32 to i64
        %2518 = llvm.getelementptr %arg0[%2517] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2515 = llvm.load %2518 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2519 = arith.constant 0 : i32
        %2520 = arith.extsi %2519 : i32 to i64
        %2521 = llvm.getelementptr %arg0[%2520] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2522 = llvm.getelementptr %2521[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2523 = llvm.load %2522 : !llvm.ptr -> !llvm.ptr
        %2524 = arith.constant 0 : i32
        %2525 = arith.extsi %2524 : i32 to i64
        %2526 = llvm.getelementptr %2523[%2525] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
        %2527 = llvm.getelementptr %2526[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
        %2528 = llvm.load %2527 : !llvm.ptr -> !llvm.ptr
        %2530 = arith.constant 0 : i32
        %2531 = arith.extsi %2530 : i32 to i64
        %2532 = llvm.getelementptr %arg0[%2531] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2529 = llvm.load %2532 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2533 = arith.constant 0 : i32
        %2534 = arith.extsi %2533 : i32 to i64
        %2535 = llvm.getelementptr %arg0[%2534] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2536 = llvm.getelementptr %2535[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2537 = llvm.load %2536 : !llvm.ptr -> i32
        %2501 = func.call @get_value(%2528, %2537) : (!llvm.ptr, i32) -> i64
        %2538 = arith.constant 0 : i32
        %2540 = arith.extsi %2538 : i32 to i64
        %2539 = arith.cmpi eq, %2501, %2540 : i64
        cf.cond_br %2539, ^bb321, ^bb322
        ^bb321:
          cf.br ^bb320
        ^bb322:
          cf.br ^bb323
        ^bb323:
        %2541 = arith.muli %2501, %2501 : i64
        %2542 = arith.cmpi ugt, %2541, %2488 : i64
        %2543 = scf.if %2542 -> (i1) {
          %2545 = arith.constant 0 : i32
          %2546 = arith.extsi %2545 : i32 to i64
          %2547 = llvm.getelementptr %arg0[%2546] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %2544 = llvm.load %2547 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %2548 = arith.constant 0 : i32
          %2549 = arith.extsi %2548 : i32 to i64
          %2550 = llvm.getelementptr %arg0[%2549] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %2551 = llvm.getelementptr %2550[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %2552 = llvm.load %2551 : !llvm.ptr -> i32
          %2553 = arith.constant 0 : i32
          %2554 = arith.cmpi sgt, %2552, %2553 : i32
          scf.yield %2554 : i1
        } else {
          %2555 = arith.constant false
          scf.yield %2555 : i1
        }
        cf.cond_br %2543, ^bb324, ^bb325
        ^bb324:
          cf.br ^bb320
        ^bb325:
          cf.br ^bb326
        ^bb326:
        %2556 = func.call @ensure_right_ge(%arg0, %2501) : (!llvm.ptr, i64) -> i32
        %2557 = arith.constant 0 : i32
        %2558 = arith.cmpi sge, %2556, %2557 : i32
        cf.cond_br %2558, ^bb327, ^bb328
        ^bb327:
          %2561 = arith.constant 0 : i32
          %2562 = arith.extsi %2561 : i32 to i64
          %2563 = llvm.getelementptr %arg0[%2562] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %2560 = llvm.load %2563 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %2564 = arith.constant 0 : i32
          %2565 = arith.extsi %2564 : i32 to i64
          %2566 = llvm.getelementptr %arg0[%2565] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %2567 = llvm.getelementptr %2566[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
          %2568 = llvm.load %2567 : !llvm.ptr -> i32
          func.call @try_push(%arg0, %2568, %2556) : (!llvm.ptr, i32, i32) -> ()
          cf.br ^bb329
        ^bb328:
          cf.br ^bb329
        ^bb329:
        %2570 = arith.constant 0 : i32
        %2571 = arith.extsi %2570 : i32 to i64
        %2572 = llvm.getelementptr %arg0[%2571] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2569 = llvm.load %2572 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2573 = arith.constant 0 : i32
        %2574 = arith.extsi %2573 : i32 to i64
        %2575 = llvm.getelementptr %arg0[%2574] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2576 = llvm.getelementptr %2575[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2577 = llvm.load %2576 : !llvm.ptr -> i32
        %2578 = arith.constant 1 : i32
        %2579 = arith.addi %2577, %2578 : i32
        %2580 = arith.constant 0 : i32
        %2581 = arith.extsi %2580 : i32 to i64
        %2582 = llvm.getelementptr %arg0[%2581] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2583 = llvm.getelementptr %2582[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        llvm.store %2579, %2583 : i32, !llvm.ptr
        cf.br ^bb318
      ^bb320:
      %2585 = arith.constant 1 : i32
      %2586 = arith.addi %2499, %2585 : i32
      func.call @try_push(%arg0, %2497, %2586) : (!llvm.ptr, i32, i32) -> ()
      func.return %2488 : i64
    ^bb305:
    %2587 = arith.constant 0 : i32
    %2588 = arith.extsi %2587 : i32 to i64
    func.return %2588 : i64
  }
  func.func @next_value(%arg0: !llvm.ptr) -> i64 {
    %2591 = arith.constant 0 : i32
    %2592 = arith.extsi %2591 : i32 to i64
    %2593 = llvm.getelementptr %arg0[%2592] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2590 = llvm.load %2593 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2594 = arith.constant 0 : i32
    %2595 = arith.extsi %2594 : i32 to i64
    %2596 = llvm.getelementptr %arg0[%2595] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2597 = llvm.getelementptr %2596[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2598 = llvm.load %2597 : !llvm.ptr -> !llvm.ptr
    %2599 = arith.constant 0 : i32
    %2600 = arith.extsi %2599 : i32 to i64
    %2601 = llvm.getelementptr %2598[%2600] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2589 = llvm.load %2601 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2603 = arith.constant 0 : i32
    %2604 = arith.extsi %2603 : i32 to i64
    %2605 = llvm.getelementptr %arg0[%2604] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2602 = llvm.load %2605 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2606 = arith.constant 0 : i32
    %2607 = arith.extsi %2606 : i32 to i64
    %2608 = llvm.getelementptr %arg0[%2607] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2609 = llvm.getelementptr %2608[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2610 = llvm.load %2609 : !llvm.ptr -> !llvm.ptr
    %2611 = arith.constant 0 : i32
    %2612 = arith.extsi %2611 : i32 to i64
    %2613 = llvm.getelementptr %2610[%2612] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2614 = llvm.getelementptr %2613[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2615 = llvm.load %2614 : !llvm.ptr -> i32
    %2616 = arith.constant 0 : i32
    %2617 = arith.cmpi ne, %2615, %2616 : i32
    cf.cond_br %2617, ^bb330, ^bb331
    ^bb330:
      %2619 = arith.constant 0 : i32
      %2620 = arith.extsi %2619 : i32 to i64
      %2621 = llvm.getelementptr %arg0[%2620] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2618 = llvm.load %2621 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2622 = arith.constant 0 : i32
      %2623 = arith.extsi %2622 : i32 to i64
      %2624 = llvm.getelementptr %arg0[%2623] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2625 = llvm.getelementptr %2624[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2626 = llvm.load %2625 : !llvm.ptr -> i64
      %2628 = arith.constant 0 : i32
      %2629 = arith.extsi %2628 : i32 to i64
      %2630 = llvm.getelementptr %arg0[%2629] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2627 = llvm.load %2630 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2631 = arith.constant 0 : i32
      %2632 = arith.extsi %2631 : i32 to i64
      %2633 = llvm.getelementptr %arg0[%2632] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2634 = llvm.getelementptr %2633[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2635 = llvm.load %2634 : !llvm.ptr -> i64
      %2636 = arith.cmpi ugt, %2626, %2635 : i64
      cf.cond_br %2636, ^bb333, ^bb334
      ^bb333:
        %2637 = arith.constant 0 : i32
        %2638 = arith.extsi %2637 : i32 to i64
        func.return %2638 : i64
      ^bb334:
        cf.br ^bb335
      ^bb335:
      %2639 = func.call @next_prime(%2626) : (i64) -> i64
      %2640 = arith.constant 0 : i32
      %2641 = arith.extsi %2640 : i32 to i64
      %2642 = llvm.getelementptr %arg0[%2641] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2643 = llvm.getelementptr %2642[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %2639, %2643 : i64, !llvm.ptr
      func.return %2626 : i64
    ^bb331:
      cf.br ^bb332
    ^bb332:
    %2645 = arith.constant 0 : i32
    %2646 = arith.extsi %2645 : i32 to i64
    %2647 = llvm.getelementptr %arg0[%2646] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2644 = llvm.load %2647 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2648 = arith.constant 0 : i32
    %2649 = arith.extsi %2648 : i32 to i64
    %2650 = llvm.getelementptr %arg0[%2649] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2651 = llvm.getelementptr %2650[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2652 = llvm.load %2651 : !llvm.ptr -> i32
    %2653 = arith.constant 0 : i32
    %2654 = arith.cmpi sgt, %2652, %2653 : i32
    %2655 = scf.if %2654 -> (i64) {
      %2658 = arith.constant 0 : i32
      %2659 = arith.extsi %2658 : i32 to i64
      %2660 = llvm.getelementptr %arg0[%2659] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2657 = llvm.load %2660 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2661 = arith.constant 0 : i32
      %2662 = arith.extsi %2661 : i32 to i64
      %2663 = llvm.getelementptr %arg0[%2662] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2664 = llvm.getelementptr %2663[0, 11] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2665 = llvm.load %2664 : !llvm.ptr -> !llvm.ptr
      %2667 = arith.constant 0 : i32
      %2668 = arith.extsi %2667 : i32 to i64
      %2669 = llvm.getelementptr %arg0[%2668] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2666 = llvm.load %2669 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2670 = arith.constant 0 : i32
      %2671 = arith.extsi %2670 : i32 to i64
      %2672 = llvm.getelementptr %arg0[%2671] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2673 = llvm.getelementptr %2672[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2674 = llvm.load %2673 : !llvm.ptr -> i32
      %2675 = arith.constant 1 : i32
      %2676 = arith.subi %2674, %2675 : i32
      %2677 = arith.extsi %2676 : i32 to i64
      %2678 = llvm.getelementptr %2665[%2677] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %2656 = llvm.load %2678 : !llvm.ptr -> i64
      scf.yield %2656 : i64
    } else {
      %2679 = arith.constant 0 : i32
      scf.yield %2679 : i32
    }
    cf.br ^bb336
    ^bb336:
    %2680 = arith.constant 1 : i1
    cf.cond_br %2680, ^bb337, ^bb338
    ^bb337:
      %2681 = func.call @next_candidate(%arg0) : (!llvm.ptr) -> i64
      %2682 = arith.constant 0 : i32
      %2684 = arith.extsi %2682 : i32 to i64
      %2683 = arith.cmpi eq, %2681, %2684 : i64
      cf.cond_br %2683, ^bb339, ^bb340
      ^bb339:
        %2685 = arith.constant 0 : i32
        %2686 = arith.extsi %2685 : i32 to i64
        func.return %2686 : i64
      ^bb340:
        cf.br ^bb341
      ^bb341:
      %2687 = arith.constant 0 : i32
      %2689 = arith.extsi %2687 : i32 to i64
      %2688 = arith.cmpi ne, %2655, %2689 : i64
      %2690 = scf.if %2688 -> (i1) {
        %2691 = arith.cmpi eq, %2681, %2655 : i64
        scf.yield %2691 : i1
      } else {
        %2692 = arith.constant false
        scf.yield %2692 : i1
      }
      cf.cond_br %2690, ^bb342, ^bb343
      ^bb342:
        cf.br ^bb336
      ^bb343:
        cf.br ^bb344
      ^bb344:
      %2695 = arith.constant 0 : i32
      %2696 = arith.extsi %2695 : i32 to i64
      %2697 = llvm.getelementptr %arg0[%2696] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2694 = llvm.load %2697 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2698 = arith.constant 0 : i32
      %2699 = arith.extsi %2698 : i32 to i64
      %2700 = llvm.getelementptr %arg0[%2699] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2701 = llvm.getelementptr %2700[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2702 = llvm.load %2701 : !llvm.ptr -> !llvm.ptr
      %2693 = func.call @shape_matches(%2681, %2702) : (i64, !llvm.ptr) -> i1
      cf.cond_br %2693, ^bb345, ^bb346
      ^bb345:
        func.return %2681 : i64
      ^bb346:
        cf.br ^bb347
      ^bb347:
      cf.br ^bb336
    ^bb338:
    %2703 = arith.constant 0 : i32
    %2704 = arith.extsi %2703 : i32 to i64
    func.return %2704 : i64
  }
  func.func @get_value(%arg0: !llvm.ptr, %arg1: i32) -> i64 {
    %2705 = func.call @find_seq(%arg0) : (!llvm.ptr) -> !llvm.ptr
    %2706 = llvm.mlir.zero : !llvm.ptr
    %2707 = llvm.icmp "eq" %2705, %2706 : !llvm.ptr
    cf.cond_br %2707, ^bb348, ^bb349
    ^bb348:
      %2708 = arith.constant 0 : i32
      %2709 = arith.extsi %2708 : i32 to i64
      func.return %2709 : i64
    ^bb349:
      cf.br ^bb350
    ^bb350:
    cf.br ^bb351
    ^bb351:
    %2711 = arith.constant 0 : i32
    %2712 = arith.extsi %2711 : i32 to i64
    %2713 = llvm.getelementptr %2705[%2712] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2710 = llvm.load %2713 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2714 = arith.constant 0 : i32
    %2715 = arith.extsi %2714 : i32 to i64
    %2716 = llvm.getelementptr %2705[%2715] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2717 = llvm.getelementptr %2716[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2718 = llvm.load %2717 : !llvm.ptr -> i32
    %2719 = arith.cmpi sle, %2718, %arg1 : i32
    cf.cond_br %2719, ^bb352, ^bb353
    ^bb352:
      %2720 = func.call @next_value(%2705) : (!llvm.ptr) -> i64
      %2721 = arith.constant 0 : i32
      %2723 = arith.extsi %2721 : i32 to i64
      %2722 = arith.cmpi eq, %2720, %2723 : i64
      cf.cond_br %2722, ^bb354, ^bb355
      ^bb354:
        %2724 = arith.constant 0 : i32
        %2725 = arith.extsi %2724 : i32 to i64
        func.return %2725 : i64
      ^bb355:
        cf.br ^bb356
      ^bb356:
      %2727 = arith.constant 0 : i32
      %2728 = arith.extsi %2727 : i32 to i64
      %2729 = llvm.getelementptr %2705[%2728] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2726 = llvm.load %2729 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2730 = arith.constant 0 : i32
      %2731 = arith.extsi %2730 : i32 to i64
      %2732 = llvm.getelementptr %2705[%2731] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2733 = llvm.getelementptr %2732[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2734 = llvm.load %2733 : !llvm.ptr -> i32
      %2736 = arith.constant 0 : i32
      %2737 = arith.extsi %2736 : i32 to i64
      %2738 = llvm.getelementptr %2705[%2737] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2735 = llvm.load %2738 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2739 = arith.constant 0 : i32
      %2740 = arith.extsi %2739 : i32 to i64
      %2741 = llvm.getelementptr %2705[%2740] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2742 = llvm.getelementptr %2741[0, 13] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2743 = llvm.load %2742 : !llvm.ptr -> i32
      %2744 = arith.cmpi sge, %2734, %2743 : i32
      cf.cond_br %2744, ^bb357, ^bb358
      ^bb357:
        %2746 = arith.constant 0 : i32
        %2747 = arith.extsi %2746 : i32 to i64
        %2748 = llvm.getelementptr %2705[%2747] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2745 = llvm.load %2748 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2749 = arith.constant 0 : i32
        %2750 = arith.extsi %2749 : i32 to i64
        %2751 = llvm.getelementptr %2705[%2750] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2752 = llvm.getelementptr %2751[0, 13] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2753 = llvm.load %2752 : !llvm.ptr -> i32
        %2754 = arith.constant 2 : i32
        %2755 = arith.muli %2753, %2754 : i32
        %2756 = arith.constant 0 : i32
        %2757 = arith.extsi %2756 : i32 to i64
        %2758 = llvm.getelementptr %2705[%2757] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2759 = llvm.getelementptr %2758[0, 13] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        llvm.store %2755, %2759 : i32, !llvm.ptr
        %2762 = arith.constant 0 : i32
        %2763 = arith.extsi %2762 : i32 to i64
        %2764 = llvm.getelementptr %2705[%2763] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2761 = llvm.load %2764 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2765 = arith.constant 0 : i32
        %2766 = arith.extsi %2765 : i32 to i64
        %2767 = llvm.getelementptr %2705[%2766] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2768 = llvm.getelementptr %2767[0, 11] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2769 = llvm.load %2768 : !llvm.ptr -> !llvm.ptr
        %2771 = arith.constant 0 : i32
        %2772 = arith.extsi %2771 : i32 to i64
        %2773 = llvm.getelementptr %2705[%2772] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2770 = llvm.load %2773 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2774 = arith.constant 0 : i32
        %2775 = arith.extsi %2774 : i32 to i64
        %2776 = llvm.getelementptr %2705[%2775] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2777 = llvm.getelementptr %2776[0, 13] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2778 = llvm.load %2777 : !llvm.ptr -> i32
        %2779 = arith.extsi %2778 : i32 to i64
        %2780 = arith.constant 8 : i32
        %2782 = arith.extsi %2780 : i32 to i64
        %2781 = arith.muli %2779, %2782 : i64
        %2760 = func.call @realloc(%2769, %2781) : (!llvm.ptr, i64) -> !llvm.ptr
        %2783 = arith.constant 0 : i32
        %2784 = arith.extsi %2783 : i32 to i64
        %2785 = llvm.getelementptr %2705[%2784] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        %2786 = llvm.getelementptr %2785[0, 11] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
        llvm.store %2760, %2786 : !llvm.ptr, !llvm.ptr
        cf.br ^bb359
      ^bb358:
        cf.br ^bb359
      ^bb359:
      %2788 = arith.constant 0 : i32
      %2789 = arith.extsi %2788 : i32 to i64
      %2790 = llvm.getelementptr %2705[%2789] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2787 = llvm.load %2790 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2791 = arith.constant 0 : i32
      %2792 = arith.extsi %2791 : i32 to i64
      %2793 = llvm.getelementptr %2705[%2792] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2794 = llvm.getelementptr %2793[0, 11] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2795 = llvm.load %2794 : !llvm.ptr -> !llvm.ptr
      %2797 = arith.constant 0 : i32
      %2798 = arith.extsi %2797 : i32 to i64
      %2799 = llvm.getelementptr %2705[%2798] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2796 = llvm.load %2799 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2800 = arith.constant 0 : i32
      %2801 = arith.extsi %2800 : i32 to i64
      %2802 = llvm.getelementptr %2705[%2801] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2803 = llvm.getelementptr %2802[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2804 = llvm.load %2803 : !llvm.ptr -> i32
      %2805 = arith.extsi %2804 : i32 to i64
      %2806 = llvm.getelementptr %2795[%2805] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %2720, %2806 : i64, !llvm.ptr
      %2808 = arith.constant 0 : i32
      %2809 = arith.extsi %2808 : i32 to i64
      %2810 = llvm.getelementptr %2705[%2809] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2807 = llvm.load %2810 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2811 = arith.constant 0 : i32
      %2812 = arith.extsi %2811 : i32 to i64
      %2813 = llvm.getelementptr %2705[%2812] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2814 = llvm.getelementptr %2813[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2815 = llvm.load %2814 : !llvm.ptr -> i32
      %2816 = arith.constant 1 : i32
      %2817 = arith.addi %2815, %2816 : i32
      %2818 = arith.constant 0 : i32
      %2819 = arith.extsi %2818 : i32 to i64
      %2820 = llvm.getelementptr %2705[%2819] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %2821 = llvm.getelementptr %2820[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %2817, %2821 : i32, !llvm.ptr
      cf.br ^bb351
    ^bb353:
    %2824 = arith.constant 0 : i32
    %2825 = arith.extsi %2824 : i32 to i64
    %2826 = llvm.getelementptr %2705[%2825] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2823 = llvm.load %2826 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2827 = arith.constant 0 : i32
    %2828 = arith.extsi %2827 : i32 to i64
    %2829 = llvm.getelementptr %2705[%2828] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2830 = llvm.getelementptr %2829[0, 11] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
    %2831 = llvm.load %2830 : !llvm.ptr -> !llvm.ptr
    %2832 = arith.extsi %arg1 : i32 to i64
    %2833 = llvm.getelementptr %2831[%2832] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    %2822 = llvm.load %2833 : !llvm.ptr -> i64
    func.return %2822 : i64
  }
  // Module static: all_shapes_arr
  llvm.mlir.global internal @all_shapes_arr() {addr_space = 0 : i32} : !llvm.ptr {
    %2834 = llvm.mlir.zero : !llvm.ptr
    llvm.return %2834 : !llvm.ptr
  }
  // Module static: all_shapes_arr_count
  llvm.mlir.global internal @all_shapes_arr_count(0 : i32) : i32
  // Module static: all_shapes_arr_cap
  llvm.mlir.global internal @all_shapes_arr_cap(0 : i32) : i32
  func.func @collect_shape(%arg0: !llvm.ptr) -> () {
    %2835 = arith.constant 0 : i32
    %2836 = llvm.mlir.constant(1 : i64) : i64
    %2837 = llvm.alloca %2836 x i32 : (i64) -> !llvm.ptr
    llvm.store %2835, %2837 : i32, !llvm.ptr
    cf.br ^bb360
    ^bb360:
    %2838 = llvm.load %2837 : !llvm.ptr -> i32
    %2839 = llvm.mlir.addressof @all_shapes_arr_count : !llvm.ptr
    %2840 = llvm.load %2839 : !llvm.ptr -> i32
    %2841 = arith.cmpi slt, %2838, %2840 : i32
    cf.cond_br %2841, ^bb361, ^bb362
    ^bb361:
      %2843 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
      %2844 = llvm.load %2843 : !llvm.ptr -> !llvm.ptr
      %2845 = llvm.load %2837 : !llvm.ptr -> i32
      %2846 = arith.extsi %2845 : i32 to i64
      %2847 = llvm.getelementptr %2844[%2846] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      %2842 = llvm.load %2847 : !llvm.ptr -> !llvm.ptr
      %2848 = llvm.icmp "eq" %2842, %arg0 : !llvm.ptr
      cf.cond_br %2848, ^bb363, ^bb364
      ^bb363:
        func.return
      ^bb364:
        cf.br ^bb365
      ^bb365:
      %2849 = llvm.load %2837 : !llvm.ptr -> i32
      %2850 = arith.constant 1 : i32
      %2851 = arith.addi %2849, %2850 : i32
      llvm.store %2851, %2837 : i32, !llvm.ptr
      cf.br ^bb360
    ^bb362:
    %2852 = llvm.mlir.addressof @all_shapes_arr_count : !llvm.ptr
    %2853 = llvm.load %2852 : !llvm.ptr -> i32
    %2854 = llvm.mlir.addressof @all_shapes_arr_cap : !llvm.ptr
    %2855 = llvm.load %2854 : !llvm.ptr -> i32
    %2856 = arith.cmpi sge, %2853, %2855 : i32
    cf.cond_br %2856, ^bb366, ^bb367
    ^bb366:
      %2857 = llvm.mlir.addressof @all_shapes_arr_cap : !llvm.ptr
      %2858 = llvm.load %2857 : !llvm.ptr -> i32
      %2859 = arith.constant 0 : i32
      %2860 = arith.cmpi eq, %2858, %2859 : i32
      cf.cond_br %2860, ^bb369, ^bb370
      ^bb369:
        %2861 = arith.constant 64 : i32
        %2862 = llvm.mlir.addressof @all_shapes_arr_cap : !llvm.ptr
        llvm.store %2861, %2862 : i32, !llvm.ptr
        cf.br ^bb371
      ^bb370:
        %2863 = llvm.mlir.addressof @all_shapes_arr_cap : !llvm.ptr
        %2864 = llvm.load %2863 : !llvm.ptr -> i32
        %2865 = arith.constant 2 : i32
        %2866 = arith.muli %2864, %2865 : i32
        %2867 = llvm.mlir.addressof @all_shapes_arr_cap : !llvm.ptr
        llvm.store %2866, %2867 : i32, !llvm.ptr
        cf.br ^bb371
      ^bb371:
      %2869 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
      %2870 = llvm.load %2869 : !llvm.ptr -> !llvm.ptr
      %2871 = llvm.mlir.addressof @all_shapes_arr_cap : !llvm.ptr
      %2872 = llvm.load %2871 : !llvm.ptr -> i32
      %2873 = arith.extsi %2872 : i32 to i64
      %2874 = arith.constant 8 : i32
      %2876 = arith.extsi %2874 : i32 to i64
      %2875 = arith.muli %2873, %2876 : i64
      %2868 = func.call @realloc(%2870, %2875) : (!llvm.ptr, i64) -> !llvm.ptr
      %2877 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
      llvm.store %2868, %2877 : !llvm.ptr, !llvm.ptr
      cf.br ^bb368
    ^bb367:
      cf.br ^bb368
    ^bb368:
    %2878 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
    %2879 = llvm.load %2878 : !llvm.ptr -> !llvm.ptr
    %2880 = llvm.mlir.addressof @all_shapes_arr_count : !llvm.ptr
    %2881 = llvm.load %2880 : !llvm.ptr -> i32
    %2882 = arith.extsi %2881 : i32 to i64
    %2883 = llvm.getelementptr %2879[%2882] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
    llvm.store %arg0, %2883 : !llvm.ptr, !llvm.ptr
    %2884 = llvm.mlir.addressof @all_shapes_arr_count : !llvm.ptr
    %2885 = llvm.load %2884 : !llvm.ptr -> i32
    %2886 = arith.constant 1 : i32
    %2887 = arith.addi %2885, %2886 : i32
    %2888 = llvm.mlir.addressof @all_shapes_arr_count : !llvm.ptr
    llvm.store %2887, %2888 : i32, !llvm.ptr
    %2890 = arith.constant 0 : i32
    %2891 = arith.extsi %2890 : i32 to i64
    %2892 = llvm.getelementptr %arg0[%2891] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2889 = llvm.load %2892 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2893 = arith.constant 0 : i32
    %2894 = arith.extsi %2893 : i32 to i64
    %2895 = llvm.getelementptr %arg0[%2894] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2896 = llvm.getelementptr %2895[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
    %2897 = llvm.load %2896 : !llvm.ptr -> i32
    %2898 = arith.constant 0 : i32
    %2899 = arith.cmpi eq, %2897, %2898 : i32
    cf.cond_br %2899, ^bb372, ^bb373
    ^bb372:
      %2902 = arith.constant 0 : i32
      %2903 = arith.extsi %2902 : i32 to i64
      %2904 = llvm.getelementptr %arg0[%2903] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2901 = llvm.load %2904 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2905 = arith.constant 0 : i32
      %2906 = arith.extsi %2905 : i32 to i64
      %2907 = llvm.getelementptr %arg0[%2906] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2908 = llvm.getelementptr %2907[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2909 = llvm.load %2908 : !llvm.ptr -> !llvm.ptr
      func.call @collect_shape(%2909) : (!llvm.ptr) -> ()
      %2912 = arith.constant 0 : i32
      %2913 = arith.extsi %2912 : i32 to i64
      %2914 = llvm.getelementptr %arg0[%2913] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2911 = llvm.load %2914 : !llvm.ptr -> !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2915 = arith.constant 0 : i32
      %2916 = arith.extsi %2915 : i32 to i64
      %2917 = llvm.getelementptr %arg0[%2916] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2918 = llvm.getelementptr %2917[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(i32, !llvm.ptr, !llvm.ptr)>
      %2919 = llvm.load %2918 : !llvm.ptr -> !llvm.ptr
      func.call @collect_shape(%2919) : (!llvm.ptr) -> ()
      cf.br ^bb374
    ^bb373:
      cf.br ^bb374
    ^bb374:
    func.return
  }
  func.func @double_factorial(%arg0: i32) -> i64 {
    %2920 = arith.constant 1 : i32
    %2921 = arith.extsi %2920 : i32 to i64
    %2922 = llvm.mlir.constant(1 : i64) : i64
    %2923 = llvm.alloca %2922 x i64 : (i64) -> !llvm.ptr
    llvm.store %2921, %2923 : i64, !llvm.ptr
    %2924 = llvm.mlir.constant(1 : i64) : i64
    %2925 = llvm.alloca %2924 x i32 : (i64) -> !llvm.ptr
    llvm.store %arg0, %2925 : i32, !llvm.ptr
    cf.br ^bb375
    ^bb375:
    %2926 = llvm.load %2925 : !llvm.ptr -> i32
    %2927 = arith.constant 1 : i32
    %2928 = arith.cmpi sgt, %2926, %2927 : i32
    cf.cond_br %2928, ^bb376, ^bb377
    ^bb376:
      %2929 = llvm.load %2923 : !llvm.ptr -> i64
      %2930 = llvm.load %2925 : !llvm.ptr -> i32
      %2931 = arith.extsi %2930 : i32 to i64
      %2932 = arith.muli %2929, %2931 : i64
      llvm.store %2932, %2923 : i64, !llvm.ptr
      %2933 = llvm.load %2925 : !llvm.ptr -> i32
      %2934 = arith.constant 2 : i32
      %2935 = arith.subi %2933, %2934 : i32
      llvm.store %2935, %2925 : i32, !llvm.ptr
      cf.br ^bb375
    ^bb377:
    %2936 = llvm.load %2923 : !llvm.ptr -> i64
    func.return %2936 : i64
  }
  func.func @main() -> i32 {
    %2938 = arith.constant 1 : i32
    %2939 = llvm.mlir.zero : !llvm.ptr
    %2940 = llvm.mlir.zero : !llvm.ptr
    %2937 = func.call @new_shape(%2938, %2939, %2940) : (i32, !llvm.ptr, !llvm.ptr) -> !llvm.ptr
    %2941 = llvm.mlir.addressof @leaf_node : !llvm.ptr
    llvm.store %2937, %2941 : !llvm.ptr, !llvm.ptr
    %2943 = arith.constant 12 : i32
    %2944 = arith.constant 8 : i32
    %2945 = arith.extsi %2943 : i32 to i64
    %2946 = arith.extsi %2944 : i32 to i64
    %2942 = func.call @calloc(%2945, %2946) : (i64, i64) -> !llvm.ptr
    %2947 = llvm.mlir.addressof @g_sp : !llvm.ptr
    llvm.store %2942, %2947 : !llvm.ptr, !llvm.ptr
    %2948 = arith.constant 2 : i32
    %2949 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %2950 = llvm.load %2949 : !llvm.ptr -> !llvm.ptr
    %2951 = arith.constant 0 : i32
    %2952 = arith.extsi %2948 : i32 to i64
    %2953 = arith.extsi %2951 : i32 to i64
    %2954 = llvm.getelementptr %2950[%2953] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %2952, %2954 : i64, !llvm.ptr
    %2955 = arith.constant 3 : i32
    %2956 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %2957 = llvm.load %2956 : !llvm.ptr -> !llvm.ptr
    %2958 = arith.constant 1 : i32
    %2959 = arith.extsi %2955 : i32 to i64
    %2960 = arith.extsi %2958 : i32 to i64
    %2961 = llvm.getelementptr %2957[%2960] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %2959, %2961 : i64, !llvm.ptr
    %2962 = arith.constant 5 : i32
    %2963 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %2964 = llvm.load %2963 : !llvm.ptr -> !llvm.ptr
    %2965 = arith.constant 2 : i32
    %2966 = arith.extsi %2962 : i32 to i64
    %2967 = arith.extsi %2965 : i32 to i64
    %2968 = llvm.getelementptr %2964[%2967] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %2966, %2968 : i64, !llvm.ptr
    %2969 = arith.constant 7 : i32
    %2970 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %2971 = llvm.load %2970 : !llvm.ptr -> !llvm.ptr
    %2972 = arith.constant 3 : i32
    %2973 = arith.extsi %2969 : i32 to i64
    %2974 = arith.extsi %2972 : i32 to i64
    %2975 = llvm.getelementptr %2971[%2974] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %2973, %2975 : i64, !llvm.ptr
    %2976 = arith.constant 11 : i32
    %2977 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %2978 = llvm.load %2977 : !llvm.ptr -> !llvm.ptr
    %2979 = arith.constant 4 : i32
    %2980 = arith.extsi %2976 : i32 to i64
    %2981 = arith.extsi %2979 : i32 to i64
    %2982 = llvm.getelementptr %2978[%2981] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %2980, %2982 : i64, !llvm.ptr
    %2983 = arith.constant 13 : i32
    %2984 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %2985 = llvm.load %2984 : !llvm.ptr -> !llvm.ptr
    %2986 = arith.constant 5 : i32
    %2987 = arith.extsi %2983 : i32 to i64
    %2988 = arith.extsi %2986 : i32 to i64
    %2989 = llvm.getelementptr %2985[%2988] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %2987, %2989 : i64, !llvm.ptr
    %2990 = arith.constant 17 : i32
    %2991 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %2992 = llvm.load %2991 : !llvm.ptr -> !llvm.ptr
    %2993 = arith.constant 6 : i32
    %2994 = arith.extsi %2990 : i32 to i64
    %2995 = arith.extsi %2993 : i32 to i64
    %2996 = llvm.getelementptr %2992[%2995] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %2994, %2996 : i64, !llvm.ptr
    %2997 = arith.constant 19 : i32
    %2998 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %2999 = llvm.load %2998 : !llvm.ptr -> !llvm.ptr
    %3000 = arith.constant 7 : i32
    %3001 = arith.extsi %2997 : i32 to i64
    %3002 = arith.extsi %3000 : i32 to i64
    %3003 = llvm.getelementptr %2999[%3002] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3001, %3003 : i64, !llvm.ptr
    %3004 = arith.constant 23 : i32
    %3005 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %3006 = llvm.load %3005 : !llvm.ptr -> !llvm.ptr
    %3007 = arith.constant 8 : i32
    %3008 = arith.extsi %3004 : i32 to i64
    %3009 = arith.extsi %3007 : i32 to i64
    %3010 = llvm.getelementptr %3006[%3009] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3008, %3010 : i64, !llvm.ptr
    %3011 = arith.constant 29 : i32
    %3012 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %3013 = llvm.load %3012 : !llvm.ptr -> !llvm.ptr
    %3014 = arith.constant 9 : i32
    %3015 = arith.extsi %3011 : i32 to i64
    %3016 = arith.extsi %3014 : i32 to i64
    %3017 = llvm.getelementptr %3013[%3016] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3015, %3017 : i64, !llvm.ptr
    %3018 = arith.constant 31 : i32
    %3019 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %3020 = llvm.load %3019 : !llvm.ptr -> !llvm.ptr
    %3021 = arith.constant 10 : i32
    %3022 = arith.extsi %3018 : i32 to i64
    %3023 = arith.extsi %3021 : i32 to i64
    %3024 = llvm.getelementptr %3020[%3023] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3022, %3024 : i64, !llvm.ptr
    %3025 = arith.constant 37 : i32
    %3026 = llvm.mlir.addressof @g_sp : !llvm.ptr
    %3027 = llvm.load %3026 : !llvm.ptr -> !llvm.ptr
    %3028 = arith.constant 11 : i32
    %3029 = arith.extsi %3025 : i32 to i64
    %3030 = arith.extsi %3028 : i32 to i64
    %3031 = llvm.getelementptr %3027[%3030] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3029, %3031 : i64, !llvm.ptr
    %3033 = arith.constant 7 : i32
    %3034 = arith.constant 8 : i32
    %3035 = arith.extsi %3033 : i32 to i64
    %3036 = arith.extsi %3034 : i32 to i64
    %3032 = func.call @calloc(%3035, %3036) : (i64, i64) -> !llvm.ptr
    %3037 = llvm.mlir.addressof @g_bases : !llvm.ptr
    llvm.store %3032, %3037 : !llvm.ptr, !llvm.ptr
    %3038 = arith.constant 2 : i32
    %3039 = llvm.mlir.addressof @g_bases : !llvm.ptr
    %3040 = llvm.load %3039 : !llvm.ptr -> !llvm.ptr
    %3041 = arith.constant 0 : i32
    %3042 = arith.extsi %3038 : i32 to i64
    %3043 = arith.extsi %3041 : i32 to i64
    %3044 = llvm.getelementptr %3040[%3043] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3042, %3044 : i64, !llvm.ptr
    %3045 = arith.constant 325 : i32
    %3046 = llvm.mlir.addressof @g_bases : !llvm.ptr
    %3047 = llvm.load %3046 : !llvm.ptr -> !llvm.ptr
    %3048 = arith.constant 1 : i32
    %3049 = arith.extsi %3045 : i32 to i64
    %3050 = arith.extsi %3048 : i32 to i64
    %3051 = llvm.getelementptr %3047[%3050] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3049, %3051 : i64, !llvm.ptr
    %3052 = arith.constant 9375 : i32
    %3053 = llvm.mlir.addressof @g_bases : !llvm.ptr
    %3054 = llvm.load %3053 : !llvm.ptr -> !llvm.ptr
    %3055 = arith.constant 2 : i32
    %3056 = arith.extsi %3052 : i32 to i64
    %3057 = arith.extsi %3055 : i32 to i64
    %3058 = llvm.getelementptr %3054[%3057] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3056, %3058 : i64, !llvm.ptr
    %3059 = arith.constant 28178 : i32
    %3060 = llvm.mlir.addressof @g_bases : !llvm.ptr
    %3061 = llvm.load %3060 : !llvm.ptr -> !llvm.ptr
    %3062 = arith.constant 3 : i32
    %3063 = arith.extsi %3059 : i32 to i64
    %3064 = arith.extsi %3062 : i32 to i64
    %3065 = llvm.getelementptr %3061[%3064] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3063, %3065 : i64, !llvm.ptr
    %3066 = arith.constant 450775 : i32
    %3067 = llvm.mlir.addressof @g_bases : !llvm.ptr
    %3068 = llvm.load %3067 : !llvm.ptr -> !llvm.ptr
    %3069 = arith.constant 4 : i32
    %3070 = arith.extsi %3066 : i32 to i64
    %3071 = arith.extsi %3069 : i32 to i64
    %3072 = llvm.getelementptr %3068[%3071] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3070, %3072 : i64, !llvm.ptr
    %3073 = arith.constant 9780504 : i32
    %3074 = llvm.mlir.addressof @g_bases : !llvm.ptr
    %3075 = llvm.load %3074 : !llvm.ptr -> !llvm.ptr
    %3076 = arith.constant 5 : i32
    %3077 = arith.extsi %3073 : i32 to i64
    %3078 = arith.extsi %3076 : i32 to i64
    %3079 = llvm.getelementptr %3075[%3078] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3077, %3079 : i64, !llvm.ptr
    %3080 = arith.constant 1795265022 : i32
    %3081 = llvm.mlir.addressof @g_bases : !llvm.ptr
    %3082 = llvm.load %3081 : !llvm.ptr -> !llvm.ptr
    %3083 = arith.constant 6 : i32
    %3084 = arith.extsi %3080 : i32 to i64
    %3085 = arith.extsi %3083 : i32 to i64
    %3086 = llvm.getelementptr %3082[%3085] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3084, %3086 : i64, !llvm.ptr
    %3088 = arith.constant 9 : i32
    %3089 = arith.constant 8 : i32
    %3090 = arith.extsi %3088 : i32 to i64
    %3091 = arith.extsi %3089 : i32 to i64
    %3087 = func.call @calloc(%3090, %3091) : (i64, i64) -> !llvm.ptr
    %3092 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    llvm.store %3087, %3092 : !llvm.ptr, !llvm.ptr
    %3093 = arith.constant 1 : i32
    %3094 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    %3095 = llvm.load %3094 : !llvm.ptr -> !llvm.ptr
    %3096 = arith.constant 0 : i32
    %3097 = arith.extsi %3093 : i32 to i64
    %3098 = arith.extsi %3096 : i32 to i64
    %3099 = llvm.getelementptr %3095[%3098] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3097, %3099 : i64, !llvm.ptr
    %3100 = arith.constant 3 : i32
    %3101 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    %3102 = llvm.load %3101 : !llvm.ptr -> !llvm.ptr
    %3103 = arith.constant 1 : i32
    %3104 = arith.extsi %3100 : i32 to i64
    %3105 = arith.extsi %3103 : i32 to i64
    %3106 = llvm.getelementptr %3102[%3105] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3104, %3106 : i64, !llvm.ptr
    %3107 = arith.constant 5 : i32
    %3108 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    %3109 = llvm.load %3108 : !llvm.ptr -> !llvm.ptr
    %3110 = arith.constant 2 : i32
    %3111 = arith.extsi %3107 : i32 to i64
    %3112 = arith.extsi %3110 : i32 to i64
    %3113 = llvm.getelementptr %3109[%3112] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3111, %3113 : i64, !llvm.ptr
    %3114 = arith.constant 7 : i32
    %3115 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    %3116 = llvm.load %3115 : !llvm.ptr -> !llvm.ptr
    %3117 = arith.constant 3 : i32
    %3118 = arith.extsi %3114 : i32 to i64
    %3119 = arith.extsi %3117 : i32 to i64
    %3120 = llvm.getelementptr %3116[%3119] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3118, %3120 : i64, !llvm.ptr
    %3121 = arith.constant 11 : i32
    %3122 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    %3123 = llvm.load %3122 : !llvm.ptr -> !llvm.ptr
    %3124 = arith.constant 4 : i32
    %3125 = arith.extsi %3121 : i32 to i64
    %3126 = arith.extsi %3124 : i32 to i64
    %3127 = llvm.getelementptr %3123[%3126] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3125, %3127 : i64, !llvm.ptr
    %3128 = arith.constant 13 : i32
    %3129 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    %3130 = llvm.load %3129 : !llvm.ptr -> !llvm.ptr
    %3131 = arith.constant 5 : i32
    %3132 = arith.extsi %3128 : i32 to i64
    %3133 = arith.extsi %3131 : i32 to i64
    %3134 = llvm.getelementptr %3130[%3133] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3132, %3134 : i64, !llvm.ptr
    %3135 = arith.constant 17 : i32
    %3136 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    %3137 = llvm.load %3136 : !llvm.ptr -> !llvm.ptr
    %3138 = arith.constant 6 : i32
    %3139 = arith.extsi %3135 : i32 to i64
    %3140 = arith.extsi %3138 : i32 to i64
    %3141 = llvm.getelementptr %3137[%3140] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3139, %3141 : i64, !llvm.ptr
    %3142 = arith.constant 19 : i32
    %3143 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    %3144 = llvm.load %3143 : !llvm.ptr -> !llvm.ptr
    %3145 = arith.constant 7 : i32
    %3146 = arith.extsi %3142 : i32 to i64
    %3147 = arith.extsi %3145 : i32 to i64
    %3148 = llvm.getelementptr %3144[%3147] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3146, %3148 : i64, !llvm.ptr
    %3149 = arith.constant 23 : i32
    %3150 = llvm.mlir.addressof @g_cvals : !llvm.ptr
    %3151 = llvm.load %3150 : !llvm.ptr -> !llvm.ptr
    %3152 = arith.constant 8 : i32
    %3153 = arith.extsi %3149 : i32 to i64
    %3154 = arith.extsi %3152 : i32 to i64
    %3155 = llvm.getelementptr %3151[%3154] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %3153, %3155 : i64, !llvm.ptr
    %3157 = arith.constant 20 : i32
    %3158 = arith.constant 16 : i32
    %3159 = arith.extsi %3157 : i32 to i64
    %3160 = arith.extsi %3158 : i32 to i64
    %3156 = func.call @calloc(%3159, %3160) : (i64, i64) -> !llvm.ptr
    %3161 = llvm.mlir.addressof @g_fac : !llvm.ptr
    llvm.store %3156, %3161 : !llvm.ptr, !llvm.ptr
    %3163 = arith.constant 64 : i32
    %3164 = arith.constant 8 : i32
    %3165 = arith.extsi %3163 : i32 to i64
    %3166 = arith.extsi %3164 : i32 to i64
    %3162 = func.call @calloc(%3165, %3166) : (i64, i64) -> !llvm.ptr
    %3167 = llvm.mlir.addressof @g_fstack : !llvm.ptr
    llvm.store %3162, %3167 : !llvm.ptr, !llvm.ptr
    %3169 = arith.constant 1 : i32
    %3170 = arith.constant 8 : i32
    %3171 = arith.extsi %3169 : i32 to i64
    %3172 = arith.extsi %3170 : i32 to i64
    %3168 = func.call @calloc(%3171, %3172) : (i64, i64) -> !llvm.ptr
    %3173 = llvm.mlir.addressof @g_val_ptr : !llvm.ptr
    llvm.store %3168, %3173 : !llvm.ptr, !llvm.ptr
    %3175 = arith.constant 1 : i32
    %3176 = arith.constant 4 : i32
    %3177 = arith.extsi %3175 : i32 to i64
    %3178 = arith.extsi %3176 : i32 to i64
    %3174 = func.call @calloc(%3177, %3178) : (i64, i64) -> !llvm.ptr
    %3179 = llvm.mlir.addressof @g_data_ptr : !llvm.ptr
    llvm.store %3174, %3179 : !llvm.ptr, !llvm.ptr
    %3180 = arith.constant 31 : i32
    %3181 = func.call @double_factorial(%3180) : (i32) -> i64
    %3183 = arith.constant 8192 : i32
    %3184 = arith.constant 16 : i32
    %3185 = arith.extsi %3183 : i32 to i64
    %3186 = arith.extsi %3184 : i32 to i64
    %3182 = func.call @calloc(%3185, %3186) : (i64, i64) -> !llvm.ptr
    %3187 = llvm.mlir.addressof @scache : !llvm.ptr
    llvm.store %3182, %3187 : !llvm.ptr, !llvm.ptr
    %3188 = arith.constant 0 : i32
    %3189 = llvm.mlir.addressof @scache_count : !llvm.ptr
    llvm.store %3188, %3189 : i32, !llvm.ptr
    %3191 = arith.constant 32 : i32
    %3192 = arith.constant 8 : i32
    %3193 = arith.extsi %3191 : i32 to i64
    %3194 = arith.extsi %3192 : i32 to i64
    %3190 = func.call @calloc(%3193, %3194) : (i64, i64) -> !llvm.ptr
    %3195 = arith.constant 2 : i32
    %3196 = llvm.mlir.constant(1 : i64) : i64
    %3197 = llvm.alloca %3196 x i32 : (i64) -> !llvm.ptr
    llvm.store %3195, %3197 : i32, !llvm.ptr
    cf.br ^bb378
    ^bb378:
    %3198 = llvm.load %3197 : !llvm.ptr -> i32
    %3199 = arith.cmpi sle, %3198, %3180 : i32
    cf.cond_br %3199, ^bb379, ^bb380
    ^bb379:
      %3202 = llvm.load %3197 : !llvm.ptr -> i32
      %3201 = func.call @double_factorial(%3202) : (i32) -> i64
      %3200 = func.call @get_shape(%3201) : (i64) -> !llvm.ptr
      %3203 = llvm.load %3197 : !llvm.ptr -> i32
      %3204 = arith.extsi %3203 : i32 to i64
      %3205 = llvm.getelementptr %3190[%3204] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      llvm.store %3200, %3205 : !llvm.ptr, !llvm.ptr
      %3206 = llvm.load %3197 : !llvm.ptr -> i32
      %3207 = arith.constant 1 : i32
      %3208 = arith.addi %3206, %3207 : i32
      llvm.store %3208, %3197 : i32, !llvm.ptr
      cf.br ^bb378
    ^bb380:
    %3209 = llvm.mlir.zero : !llvm.ptr
    %3210 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
    llvm.store %3209, %3210 : !llvm.ptr, !llvm.ptr
    %3211 = arith.constant 0 : i32
    %3212 = llvm.mlir.addressof @all_shapes_arr_count : !llvm.ptr
    llvm.store %3211, %3212 : i32, !llvm.ptr
    %3213 = arith.constant 0 : i32
    %3214 = llvm.mlir.addressof @all_shapes_arr_cap : !llvm.ptr
    llvm.store %3213, %3214 : i32, !llvm.ptr
    %3215 = arith.constant 2 : i32
    llvm.store %3215, %3197 : i32, !llvm.ptr
    cf.br ^bb381
    ^bb381:
    %3216 = llvm.load %3197 : !llvm.ptr -> i32
    %3217 = arith.cmpi sle, %3216, %3180 : i32
    cf.cond_br %3217, ^bb382, ^bb383
    ^bb382:
      %3220 = llvm.load %3197 : !llvm.ptr -> i32
      %3221 = arith.extsi %3220 : i32 to i64
      %3222 = llvm.getelementptr %3190[%3221] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      %3219 = llvm.load %3222 : !llvm.ptr -> !llvm.ptr
      func.call @collect_shape(%3219) : (!llvm.ptr) -> ()
      %3223 = llvm.load %3197 : !llvm.ptr -> i32
      %3224 = arith.constant 1 : i32
      %3225 = arith.addi %3223, %3224 : i32
      llvm.store %3225, %3197 : i32, !llvm.ptr
      cf.br ^bb381
    ^bb383:
    %3226 = arith.constant 1 : i32
    %3227 = llvm.mlir.constant(1 : i64) : i64
    %3228 = llvm.alloca %3227 x i32 : (i64) -> !llvm.ptr
    llvm.store %3226, %3228 : i32, !llvm.ptr
    cf.br ^bb384
    ^bb384:
    %3229 = llvm.load %3228 : !llvm.ptr -> i32
    %3230 = llvm.mlir.addressof @all_shapes_arr_count : !llvm.ptr
    %3231 = llvm.load %3230 : !llvm.ptr -> i32
    %3232 = arith.cmpi slt, %3229, %3231 : i32
    cf.cond_br %3232, ^bb385, ^bb386
    ^bb385:
      %3234 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
      %3235 = llvm.load %3234 : !llvm.ptr -> !llvm.ptr
      %3236 = llvm.load %3228 : !llvm.ptr -> i32
      %3237 = arith.extsi %3236 : i32 to i64
      %3238 = llvm.getelementptr %3235[%3237] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      %3233 = llvm.load %3238 : !llvm.ptr -> !llvm.ptr
      %3239 = llvm.load %3228 : !llvm.ptr -> i32
      %3240 = arith.constant 1 : i32
      %3241 = arith.subi %3239, %3240 : i32
      %3242 = llvm.mlir.constant(1 : i64) : i64
      %3243 = llvm.alloca %3242 x i32 : (i64) -> !llvm.ptr
      llvm.store %3241, %3243 : i32, !llvm.ptr
      cf.br ^bb387
      ^bb387:
      %3244 = llvm.load %3243 : !llvm.ptr -> i32
      %3245 = arith.constant 0 : i32
      %3246 = arith.cmpi sge, %3244, %3245 : i32
      %3247 = scf.if %3246 -> (i1) {
        %3250 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
        %3251 = llvm.load %3250 : !llvm.ptr -> !llvm.ptr
        %3252 = llvm.load %3243 : !llvm.ptr -> i32
        %3253 = arith.extsi %3252 : i32 to i64
        %3254 = llvm.getelementptr %3251[%3253] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
        %3249 = llvm.load %3254 : !llvm.ptr -> !llvm.ptr
        %3248 = func.call @count_leaves(%3249) : (!llvm.ptr) -> i32
        %3255 = func.call @count_leaves(%3233) : (!llvm.ptr) -> i32
        %3256 = arith.cmpi sgt, %3248, %3255 : i32
        scf.yield %3256 : i1
      } else {
        %3257 = arith.constant false
        scf.yield %3257 : i1
      }
      cf.cond_br %3247, ^bb388, ^bb389
      ^bb388:
        %3259 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
        %3260 = llvm.load %3259 : !llvm.ptr -> !llvm.ptr
        %3261 = llvm.load %3243 : !llvm.ptr -> i32
        %3262 = arith.extsi %3261 : i32 to i64
        %3263 = llvm.getelementptr %3260[%3262] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
        %3258 = llvm.load %3263 : !llvm.ptr -> !llvm.ptr
        %3264 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
        %3265 = llvm.load %3264 : !llvm.ptr -> !llvm.ptr
        %3266 = llvm.load %3243 : !llvm.ptr -> i32
        %3267 = arith.constant 1 : i32
        %3268 = arith.addi %3266, %3267 : i32
        %3269 = arith.extsi %3268 : i32 to i64
        %3270 = llvm.getelementptr %3265[%3269] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
        llvm.store %3258, %3270 : !llvm.ptr, !llvm.ptr
        %3271 = llvm.load %3243 : !llvm.ptr -> i32
        %3272 = arith.constant 1 : i32
        %3273 = arith.subi %3271, %3272 : i32
        llvm.store %3273, %3243 : i32, !llvm.ptr
        cf.br ^bb387
      ^bb389:
      %3274 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
      %3275 = llvm.load %3274 : !llvm.ptr -> !llvm.ptr
      %3276 = llvm.load %3243 : !llvm.ptr -> i32
      %3277 = arith.constant 1 : i32
      %3278 = arith.addi %3276, %3277 : i32
      %3279 = arith.extsi %3278 : i32 to i64
      %3280 = llvm.getelementptr %3275[%3279] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      llvm.store %3233, %3280 : !llvm.ptr, !llvm.ptr
      %3281 = llvm.load %3228 : !llvm.ptr -> i32
      %3282 = arith.constant 1 : i32
      %3283 = arith.addi %3281, %3282 : i32
      llvm.store %3283, %3228 : i32, !llvm.ptr
      cf.br ^bb384
    ^bb386:
    %3285 = llvm.mlir.addressof @all_shapes_arr_count : !llvm.ptr
    %3286 = llvm.load %3285 : !llvm.ptr -> i32
    %3287 = arith.extsi %3286 : i32 to i64
    %3288 = arith.constant 8 : i32
    %3290 = arith.extsi %3288 : i32 to i64
    %3289 = arith.muli %3287, %3290 : i64
    %3284 = func.call @malloc(%3289) : (i64) -> !llvm.ptr
    %3291 = llvm.mlir.addressof @seqs : !llvm.ptr
    llvm.store %3284, %3291 : !llvm.ptr, !llvm.ptr
    %3292 = arith.constant 0 : i32
    %3293 = llvm.mlir.addressof @seqs_count : !llvm.ptr
    llvm.store %3292, %3293 : i32, !llvm.ptr
    %3294 = arith.constant 0 : i32
    llvm.store %3294, %3228 : i32, !llvm.ptr
    cf.br ^bb390
    ^bb390:
    %3295 = llvm.load %3228 : !llvm.ptr -> i32
    %3296 = llvm.mlir.addressof @all_shapes_arr_count : !llvm.ptr
    %3297 = llvm.load %3296 : !llvm.ptr -> i32
    %3298 = arith.cmpi slt, %3295, %3297 : i32
    cf.cond_br %3298, ^bb391, ^bb392
    ^bb391:
      %3300 = arith.constant 1 : i32
      %3301 = arith.constant 80 : i32
      %3302 = arith.extsi %3300 : i32 to i64
      %3303 = arith.extsi %3301 : i32 to i64
      %3299 = func.call @calloc(%3302, %3303) : (i64, i64) -> !llvm.ptr
      %3305 = llvm.mlir.addressof @all_shapes_arr : !llvm.ptr
      %3306 = llvm.load %3305 : !llvm.ptr -> !llvm.ptr
      %3307 = llvm.load %3228 : !llvm.ptr -> i32
      %3308 = arith.extsi %3307 : i32 to i64
      %3309 = llvm.getelementptr %3306[%3308] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      %3304 = llvm.load %3309 : !llvm.ptr -> !llvm.ptr
      %3310 = arith.constant 0 : i32
      %3311 = arith.extsi %3310 : i32 to i64
      %3312 = llvm.getelementptr %3299[%3311] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3313 = llvm.getelementptr %3312[0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3304, %3313 : !llvm.ptr, !llvm.ptr
      %3314 = arith.constant 0 : i32
      %3315 = arith.extsi %3314 : i32 to i64
      %3316 = llvm.getelementptr %3299[%3315] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3317 = llvm.getelementptr %3316[0, 1] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3181, %3317 : i64, !llvm.ptr
      %3318 = arith.constant 2 : i32
      %3319 = arith.constant 0 : i32
      %3320 = arith.extsi %3319 : i32 to i64
      %3321 = llvm.getelementptr %3299[%3320] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3322 = arith.extsi %3318 : i32 to i64
      %3323 = llvm.getelementptr %3321[0, 2] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3322, %3323 : i64, !llvm.ptr
      %3324 = arith.constant 0 : i32
      %3325 = arith.constant 0 : i32
      %3326 = arith.extsi %3325 : i32 to i64
      %3327 = llvm.getelementptr %3299[%3326] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3328 = llvm.getelementptr %3327[0, 3] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3324, %3328 : i32, !llvm.ptr
      %3329 = arith.constant 4096 : i32
      %3330 = arith.constant 0 : i32
      %3331 = arith.extsi %3330 : i32 to i64
      %3332 = llvm.getelementptr %3299[%3331] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3333 = llvm.getelementptr %3332[0, 7] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3329, %3333 : i32, !llvm.ptr
      %3336 = arith.constant 0 : i32
      %3337 = arith.extsi %3336 : i32 to i64
      %3338 = llvm.getelementptr %3299[%3337] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3335 = llvm.load %3338 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3339 = arith.constant 0 : i32
      %3340 = arith.extsi %3339 : i32 to i64
      %3341 = llvm.getelementptr %3299[%3340] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3342 = llvm.getelementptr %3341[0, 7] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3343 = llvm.load %3342 : !llvm.ptr -> i32
      %3344 = arith.extsi %3343 : i32 to i64
      %3345 = arith.constant 16 : i32
      %3347 = arith.extsi %3345 : i32 to i64
      %3346 = arith.muli %3344, %3347 : i64
      %3334 = func.call @malloc(%3346) : (i64) -> !llvm.ptr
      %3348 = arith.constant 0 : i32
      %3349 = arith.extsi %3348 : i32 to i64
      %3350 = llvm.getelementptr %3299[%3349] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3351 = llvm.getelementptr %3350[0, 5] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3334, %3351 : !llvm.ptr, !llvm.ptr
      %3352 = arith.constant 0 : i32
      %3353 = arith.constant 0 : i32
      %3354 = arith.extsi %3353 : i32 to i64
      %3355 = llvm.getelementptr %3299[%3354] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3356 = llvm.getelementptr %3355[0, 6] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3352, %3356 : i32, !llvm.ptr
      %3357 = arith.constant 256 : i32
      %3358 = arith.constant 0 : i32
      %3359 = arith.extsi %3358 : i32 to i64
      %3360 = llvm.getelementptr %3299[%3359] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3361 = llvm.getelementptr %3360[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3357, %3361 : i32, !llvm.ptr
      %3364 = arith.constant 0 : i32
      %3365 = arith.extsi %3364 : i32 to i64
      %3366 = llvm.getelementptr %3299[%3365] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3363 = llvm.load %3366 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3367 = arith.constant 0 : i32
      %3368 = arith.extsi %3367 : i32 to i64
      %3369 = llvm.getelementptr %3299[%3368] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3370 = llvm.getelementptr %3369[0, 10] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3371 = llvm.load %3370 : !llvm.ptr -> i32
      %3372 = arith.extsi %3371 : i32 to i64
      %3373 = arith.constant 8 : i32
      %3374 = arith.extsi %3373 : i32 to i64
      %3362 = func.call @calloc(%3372, %3374) : (i64, i64) -> !llvm.ptr
      %3375 = arith.constant 0 : i32
      %3376 = arith.extsi %3375 : i32 to i64
      %3377 = llvm.getelementptr %3299[%3376] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3378 = llvm.getelementptr %3377[0, 8] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3362, %3378 : !llvm.ptr, !llvm.ptr
      %3379 = arith.constant 0 : i32
      %3380 = arith.constant 0 : i32
      %3381 = arith.extsi %3380 : i32 to i64
      %3382 = llvm.getelementptr %3299[%3381] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3383 = llvm.getelementptr %3382[0, 9] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3379, %3383 : i32, !llvm.ptr
      %3384 = arith.constant 256 : i32
      %3385 = arith.constant 0 : i32
      %3386 = arith.extsi %3385 : i32 to i64
      %3387 = llvm.getelementptr %3299[%3386] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3388 = llvm.getelementptr %3387[0, 13] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3384, %3388 : i32, !llvm.ptr
      %3391 = arith.constant 0 : i32
      %3392 = arith.extsi %3391 : i32 to i64
      %3393 = llvm.getelementptr %3299[%3392] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3390 = llvm.load %3393 : !llvm.ptr -> !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3394 = arith.constant 0 : i32
      %3395 = arith.extsi %3394 : i32 to i64
      %3396 = llvm.getelementptr %3299[%3395] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3397 = llvm.getelementptr %3396[0, 13] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3398 = llvm.load %3397 : !llvm.ptr -> i32
      %3399 = arith.extsi %3398 : i32 to i64
      %3400 = arith.constant 8 : i32
      %3402 = arith.extsi %3400 : i32 to i64
      %3401 = arith.muli %3399, %3402 : i64
      %3389 = func.call @malloc(%3401) : (i64) -> !llvm.ptr
      %3403 = arith.constant 0 : i32
      %3404 = arith.extsi %3403 : i32 to i64
      %3405 = llvm.getelementptr %3299[%3404] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3406 = llvm.getelementptr %3405[0, 11] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3389, %3406 : !llvm.ptr, !llvm.ptr
      %3407 = arith.constant 0 : i32
      %3408 = arith.constant 0 : i32
      %3409 = arith.extsi %3408 : i32 to i64
      %3410 = llvm.getelementptr %3299[%3409] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      %3411 = llvm.getelementptr %3410[0, 12] : (!llvm.ptr) -> !llvm.ptr, !llvm.struct<(!llvm.ptr, i64, i64, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32, !llvm.ptr, i32, i32)>
      llvm.store %3407, %3411 : i32, !llvm.ptr
      %3412 = llvm.mlir.addressof @seqs : !llvm.ptr
      %3413 = llvm.load %3412 : !llvm.ptr -> !llvm.ptr
      %3414 = llvm.mlir.addressof @seqs_count : !llvm.ptr
      %3415 = llvm.load %3414 : !llvm.ptr -> i32
      %3416 = arith.extsi %3415 : i32 to i64
      %3417 = llvm.getelementptr %3413[%3416] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      llvm.store %3299, %3417 : !llvm.ptr, !llvm.ptr
      %3418 = llvm.mlir.addressof @seqs_count : !llvm.ptr
      %3419 = llvm.load %3418 : !llvm.ptr -> i32
      %3420 = arith.constant 1 : i32
      %3421 = arith.addi %3419, %3420 : i32
      %3422 = llvm.mlir.addressof @seqs_count : !llvm.ptr
      llvm.store %3421, %3422 : i32, !llvm.ptr
      %3423 = llvm.load %3228 : !llvm.ptr -> i32
      %3424 = arith.constant 1 : i32
      %3425 = arith.addi %3423, %3424 : i32
      llvm.store %3425, %3228 : i32, !llvm.ptr
      cf.br ^bb390
    ^bb392:
    %3426 = arith.constant 0 : i32
    %3427 = arith.extsi %3426 : i32 to i64
    %3428 = llvm.mlir.constant(1 : i64) : i64
    %3429 = llvm.alloca %3428 x i64 : (i64) -> !llvm.ptr
    llvm.store %3427, %3429 : i64, !llvm.ptr
    %3430 = arith.constant 2 : i32
    llvm.store %3430, %3197 : i32, !llvm.ptr
    cf.br ^bb393
    ^bb393:
    %3431 = llvm.load %3197 : !llvm.ptr -> i32
    %3432 = arith.cmpi sle, %3431, %3180 : i32
    cf.cond_br %3432, ^bb394, ^bb395
    ^bb394:
      %3435 = llvm.load %3197 : !llvm.ptr -> i32
      %3436 = arith.extsi %3435 : i32 to i64
      %3437 = llvm.getelementptr %3190[%3436] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.ptr
      %3434 = llvm.load %3437 : !llvm.ptr -> !llvm.ptr
      %3438 = arith.constant 0 : i32
      %3433 = func.call @get_value(%3434, %3438) : (!llvm.ptr, i32) -> i64
      %3439 = llvm.load %3429 : !llvm.ptr -> i64
      %3440 = arith.addi %3439, %3433 : i64
      llvm.store %3440, %3429 : i64, !llvm.ptr
      %3441 = llvm.load %3197 : !llvm.ptr -> i32
      %3442 = arith.constant 1 : i32
      %3443 = arith.addi %3441, %3442 : i32
      llvm.store %3443, %3197 : i32, !llvm.ptr
      cf.br ^bb393
    ^bb395:
    %3444 = llvm.mlir.addressof @str_0 : !llvm.ptr
    %3445 = llvm.load %3429 : !llvm.ptr -> i64
    %3446 = llvm.call @printf(%3444, %3445) vararg(!llvm.func<i32 (ptr, ...)>) : (!llvm.ptr, i64) -> i32
    %3447 = arith.constant 0 : i32
    func.return %3447 : i32
  }
}