← All problems
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.
View problem on Project Euler
Performance comparison
Metric Our solution Best known
Time complexity O(2^n)?
Space complexity O(n^2)?
Approach Flow solution Not curated
Verdict Unknown
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
}
}