data mut $BUF align 1 {
    undef * 4096;
}

fn ptr $newArena(ptr %0, ptr %1) {
  @entry0
    reserve %2 24 8;
    blit %2 %1 16;
    store w32 0 %2 16;
    blit %0 %2 24;
    ret %0;
}

fn ptr $arenaAlloc(ptr %0, w32 %1, w32 %2) {
  @entry0
    load w32 %3 %0 16;
    add w32 %4 %3 %2;
    sub w32 %5 %4 1;
    udiv w32 %6 %5 %2;
    mul w32 %7 %6 %2;
    add w32 %8 %7 %1;
    load w32 %9 %0 8;
    br.ult w32 %9 %8 @assert.fail1 @assert.ok2;
  @assert.fail1
    unreachable;
  @assert.ok2
    load w32 %10 %0 8;
    load ptr %11 %0 0;
    elem %12 %11 %7 %10 1;
    store w32 %8 %0 16;
    ret %12;
}

fn ptr $arenaAllocFn(ptr %0, w32 %1, w32 %2) {
  @entry0
    call ptr %3 $arenaAlloc(%0, %1, %2);
    ret %3;
}

fn ptr $arenaAllocator(ptr %0, ptr %1) {
  @entry0
    reserve %2 16 8;
    copy %3 $arenaAllocFn;
    store ptr %3 %2 0;
    store ptr %1 %2 8;
    blit %0 %2 16;
    ret %0;
}

fn w32 $main() {
  @entry0
    copy %0 $BUF;
    reserve %1 16 8;
    store ptr %0 %1 0;
    store w32 4096 %1 8;
    store w32 4096 %1 12;
    reserve %2 24 8;
    call ptr %3 $newArena(%2, %1);
    reserve %4 16 8;
    call ptr %5 $arenaAllocator(%4, %3);
    mul w32 %6 4 4;
    call ptr %7 $arenaAlloc(%3, %6, 4);
    reserve %8 16 8;
    store ptr %7 %8 0;
    store w32 0 %8 8;
    store w32 4 %8 12;
    load w32 %9 %8 8;
    load w32 %10 %8 12;
    br.ult w32 %9 %10 @append.store1 @append.grow2;
  @append.store1
    load ptr %24 %8 0;
    load w32 %25 %8 12;
    elem %26 %24 %9 %25 4;
    store w32 10 %26 0;
    add w32 %27 %9 1;
    store w32 %27 %8 8;
    load w32 %32 %8 8;
    load w32 %33 %8 12;
    br.ult w32 %32 %33 @append.store6 @append.grow7;
  @append.grow2
    shl w32 %11 %10 1;
    or w32 %12 %11 1;
    load ptr %13 %5 0;
    load ptr %14 %5 8;
    mul w32 %15 %12 4;
    call ptr %16 %13(%14, %15, 4);
    load ptr %17 %8 0;
    mul w32 %18 %9 4;
    jmp @append3(0);
  @append3(w32 %19)
    br.ult w32 %19 %18 @append4 @append5;
  @append4
    elem %20 %17 %19 %18 1;
    load w8 %21 %20 0;
    elem %22 %16 %19 %18 1;
    store w8 %21 %22 0;
    add w32 %23 %19 1;
    jmp @append3(%23);
  @append5
    store ptr %16 %8 0;
    store w32 %12 %8 12;
    jmp @append.store1;
  @append.store6
    load ptr %47 %8 0;
    load w32 %48 %8 12;
    elem %49 %47 %32 %48 4;
    store w32 20 %49 0;
    add w32 %50 %32 1;
    store w32 %50 %8 8;
    load w32 %55 %8 8;
    load w32 %56 %8 12;
    br.ult w32 %55 %56 @append.store11 @append.grow12;
  @append.grow7
    shl w32 %34 %33 1;
    or w32 %35 %34 1;
    load ptr %36 %5 0;
    load ptr %37 %5 8;
    mul w32 %38 %35 4;
    call ptr %39 %36(%37, %38, 4);
    load ptr %40 %8 0;
    mul w32 %41 %32 4;
    jmp @append8(0);
  @append8(w32 %42)
    br.ult w32 %42 %41 @append9 @append10;
  @append9
    elem %43 %40 %42 %41 1;
    load w8 %44 %43 0;
    elem %45 %39 %42 %41 1;
    store w8 %44 %45 0;
    add w32 %46 %42 1;
    jmp @append8(%46);
  @append10
    store ptr %39 %8 0;
    store w32 %35 %8 12;
    jmp @append.store6;
  @append.store11
    load ptr %70 %8 0;
    load w32 %71 %8 12;
    elem %72 %70 %55 %71 4;
    store w32 30 %72 0;
    add w32 %73 %55 1;
    store w32 %73 %8 8;
    load w32 %76 %8 8;
    br.ne w32 %76 3 @then16 @merge17;
  @append.grow12
    shl w32 %57 %56 1;
    or w32 %58 %57 1;
    load ptr %59 %5 0;
    load ptr %60 %5 8;
    mul w32 %61 %58 4;
    call ptr %62 %59(%60, %61, 4);
    load ptr %63 %8 0;
    mul w32 %64 %55 4;
    jmp @append13(0);
  @append13(w32 %65)
    br.ult w32 %65 %64 @append14 @append15;
  @append14
    elem %66 %63 %65 %64 1;
    load w8 %67 %66 0;
    elem %68 %62 %65 %64 1;
    store w8 %67 %68 0;
    add w32 %69 %65 1;
    jmp @append13(%69);
  @append15
    store ptr %62 %8 0;
    store w32 %58 %8 12;
    jmp @append.store11;
  @then16
    ret 1;
  @merge17
    load w32 %77 %8 12;
    br.ne w32 %77 4 @then18 @merge19;
  @then18
    ret 2;
  @merge19
    load w32 %78 %8 8;
    load ptr %79 %8 0;
    elem %80 %79 0 %78 4;
    sload w32 %81 %80 0;
    br.ne w32 %81 10 @then20 @merge21;
  @then20
    ret 3;
  @merge21
    load w32 %82 %8 8;
    load ptr %83 %8 0;
    elem %84 %83 1 %82 4;
    sload w32 %85 %84 0;
    br.ne w32 %85 20 @then22 @merge23;
  @then22
    ret 4;
  @merge23
    load w32 %86 %8 8;
    load ptr %87 %8 0;
    elem %88 %87 2 %86 4;
    sload w32 %89 %88 0;
    br.ne w32 %89 30 @then24 @merge25;
  @then24
    ret 5;
  @merge25
    load w32 %92 %8 8;
    load w32 %93 %8 12;
    br.ult w32 %92 %93 @append.store26 @append.grow27;
  @append.store26
    load ptr %107 %8 0;
    load w32 %108 %8 12;
    elem %109 %107 %92 %108 4;
    store w32 40 %109 0;
    add w32 %110 %92 1;
    store w32 %110 %8 8;
    load w32 %113 %8 8;
    br.ne w32 %113 4 @then31 @merge32;
  @append.grow27
    shl w32 %94 %93 1;
    or w32 %95 %94 1;
    load ptr %96 %5 0;
    load ptr %97 %5 8;
    mul w32 %98 %95 4;
    call ptr %99 %96(%97, %98, 4);
    load ptr %100 %8 0;
    mul w32 %101 %92 4;
    jmp @append28(0);
  @append28(w32 %102)
    br.ult w32 %102 %101 @append29 @append30;
  @append29
    elem %103 %100 %102 %101 1;
    load w8 %104 %103 0;
    elem %105 %99 %102 %101 1;
    store w8 %104 %105 0;
    add w32 %106 %102 1;
    jmp @append28(%106);
  @append30
    store ptr %99 %8 0;
    store w32 %95 %8 12;
    jmp @append.store26;
  @then31
    ret 6;
  @merge32
    load w32 %114 %8 12;
    br.ne w32 %114 4 @then33 @merge34;
  @then33
    ret 7;
  @merge34
    load w32 %117 %8 8;
    load w32 %118 %8 12;
    br.ult w32 %117 %118 @append.store35 @append.grow36;
  @append.store35
    load ptr %132 %8 0;
    load w32 %133 %8 12;
    elem %134 %132 %117 %133 4;
    store w32 50 %134 0;
    add w32 %135 %117 1;
    store w32 %135 %8 8;
    load w32 %138 %8 8;
    br.ne w32 %138 5 @then40 @merge41;
  @append.grow36
    shl w32 %119 %118 1;
    or w32 %120 %119 1;
    load ptr %121 %5 0;
    load ptr %122 %5 8;
    mul w32 %123 %120 4;
    call ptr %124 %121(%122, %123, 4);
    load ptr %125 %8 0;
    mul w32 %126 %117 4;
    jmp @append37(0);
  @append37(w32 %127)
    br.ult w32 %127 %126 @append38 @append39;
  @append38
    elem %128 %125 %127 %126 1;
    load w8 %129 %128 0;
    elem %130 %124 %127 %126 1;
    store w8 %129 %130 0;
    add w32 %131 %127 1;
    jmp @append37(%131);
  @append39
    store ptr %124 %8 0;
    store w32 %120 %8 12;
    jmp @append.store35;
  @then40
    ret 8;
  @merge41
    load w32 %139 %8 12;
    br.ne w32 %139 9 @then42 @merge43;
  @then42
    ret 9;
  @merge43
    load w32 %140 %8 8;
    load ptr %141 %8 0;
    elem %142 %141 4 %140 4;
    sload w32 %143 %142 0;
    br.ne w32 %143 50 @then44 @merge45;
  @then44
    ret 10;
  @merge45
    load w32 %144 %8 8;
    load ptr %145 %8 0;
    elem %146 %145 0 %144 4;
    sload w32 %147 %146 0;
    br.ne w32 %147 10 @then46 @merge47;
  @then46
    ret 11;
  @merge47
    load w32 %148 %8 8;
    load ptr %149 %8 0;
    elem %150 %149 3 %148 4;
    sload w32 %151 %150 0;
    br.ne w32 %151 40 @then48 @merge49;
  @then48
    ret 12;
  @merge49
    reserve %162 16 8;
    store ptr %7 %162 0;
    store w32 0 %162 8;
    store w32 0 %162 12;
    load w32 %165 %162 8;
    load w32 %166 %162 12;
    br.ult w32 %165 %166 @append.store50 @append.grow51;
  @append.store50
    load ptr %180 %162 0;
    load w32 %181 %162 12;
    elem %182 %180 %165 %181 4;
    store w32 99 %182 0;
    add w32 %183 %165 1;
    store w32 %183 %162 8;
    load w32 %186 %162 8;
    br.ne w32 %186 1 @then55 @merge56;
  @append.grow51
    shl w32 %167 %166 1;
    or w32 %168 %167 1;
    load ptr %169 %5 0;
    load ptr %170 %5 8;
    mul w32 %171 %168 4;
    call ptr %172 %169(%170, %171, 4);
    load ptr %173 %162 0;
    mul w32 %174 %165 4;
    jmp @append52(0);
  @append52(w32 %175)
    br.ult w32 %175 %174 @append53 @append54;
  @append53
    elem %176 %173 %175 %174 1;
    load w8 %177 %176 0;
    elem %178 %172 %175 %174 1;
    store w8 %177 %178 0;
    add w32 %179 %175 1;
    jmp @append52(%179);
  @append54
    store ptr %172 %162 0;
    store w32 %168 %162 12;
    jmp @append.store50;
  @then55
    ret 13;
  @merge56
    load w32 %187 %162 12;
    br.ne w32 %187 1 @then57 @merge58;
  @then57
    ret 14;
  @merge58
    load w32 %188 %162 8;
    load ptr %189 %162 0;
    elem %190 %189 0 %188 4;
    sload w32 %191 %190 0;
    br.ne w32 %191 99 @then59 @merge60;
  @then59
    ret 15;
  @merge60
    load w32 %194 %8 8;
    load ptr %195 %8 0;
    jmp @loop61(0, 0);
  @loop61(w32 %196, w32 %199)
    br.slt w32 %196 %194 @body62 @merge63;
  @body62
    elem %197 %195 %196 %194 4;
    sload w32 %198 %197 0;
    add w32 %200 %199 %198;
    add w32 %201 %196 1;
    jmp @loop61(%201, %200);
  @merge63
    br.ne w32 %199 150 @then64 @merge65;
  @then64
    ret 16;
  @merge65
    call ptr %215 $arenaAlloc(%3, 2, 1);
    reserve %216 16 8;
    store ptr %215 %216 0;
    store w32 0 %216 8;
    store w32 2 %216 12;
    load w32 %220 %216 8;
    load w32 %221 %216 12;
    br.ult w32 %220 %221 @append.store66 @append.grow67;
  @append.store66
    load ptr %235 %216 0;
    load w32 %236 %216 12;
    elem %237 %235 %220 %236 1;
    store w8 171 %237 0;
    add w32 %238 %220 1;
    store w32 %238 %216 8;
    load w32 %243 %216 8;
    load w32 %244 %216 12;
    br.ult w32 %243 %244 @append.store71 @append.grow72;
  @append.grow67
    shl w32 %222 %221 1;
    or w32 %223 %222 1;
    load ptr %224 %5 0;
    load ptr %225 %5 8;
    mul w32 %226 %223 1;
    call ptr %227 %224(%225, %226, 1);
    load ptr %228 %216 0;
    mul w32 %229 %220 1;
    jmp @append68(0);
  @append68(w32 %230)
    br.ult w32 %230 %229 @append69 @append70;
  @append69
    elem %231 %228 %230 %229 1;
    load w8 %232 %231 0;
    elem %233 %227 %230 %229 1;
    store w8 %232 %233 0;
    add w32 %234 %230 1;
    jmp @append68(%234);
  @append70
    store ptr %227 %216 0;
    store w32 %223 %216 12;
    jmp @append.store66;
  @append.store71
    load ptr %258 %216 0;
    load w32 %259 %216 12;
    elem %260 %258 %243 %259 1;
    store w8 205 %260 0;
    add w32 %261 %243 1;
    store w32 %261 %216 8;
    load w32 %264 %216 8;
    br.ne w32 %264 2 @then76 @merge77;
  @append.grow72
    shl w32 %245 %244 1;
    or w32 %246 %245 1;
    load ptr %247 %5 0;
    load ptr %248 %5 8;
    mul w32 %249 %246 1;
    call ptr %250 %247(%248, %249, 1);
    load ptr %251 %216 0;
    mul w32 %252 %243 1;
    jmp @append73(0);
  @append73(w32 %253)
    br.ult w32 %253 %252 @append74 @append75;
  @append74
    elem %254 %251 %253 %252 1;
    load w8 %255 %254 0;
    elem %256 %250 %253 %252 1;
    store w8 %255 %256 0;
    add w32 %257 %253 1;
    jmp @append73(%257);
  @append75
    store ptr %250 %216 0;
    store w32 %246 %216 12;
    jmp @append.store71;
  @then76
    ret 17;
  @merge77
    load w32 %265 %216 8;
    load ptr %266 %216 0;
    elem %267 %266 0 %265 1;
    load w8 %268 %267 0;
    br.ne w8 %268 171 @then78 @merge79;
  @then78
    ret 18;
  @merge79
    load w32 %269 %216 8;
    load ptr %270 %216 0;
    elem %271 %270 1 %269 1;
    load w8 %272 %271 0;
    br.ne w8 %272 205 @then80 @merge81;
  @then80
    ret 19;
  @merge81
    load w32 %275 %216 8;
    load w32 %276 %216 12;
    br.ult w32 %275 %276 @append.store82 @append.grow83;
  @append.store82
    load ptr %290 %216 0;
    load w32 %291 %216 12;
    elem %292 %290 %275 %291 1;
    store w8 239 %292 0;
    add w32 %293 %275 1;
    store w32 %293 %216 8;
    load w32 %296 %216 8;
    br.ne w32 %296 3 @then87 @merge88;
  @append.grow83
    shl w32 %277 %276 1;
    or w32 %278 %277 1;
    load ptr %279 %5 0;
    load ptr %280 %5 8;
    mul w32 %281 %278 1;
    call ptr %282 %279(%280, %281, 1);
    load ptr %283 %216 0;
    mul w32 %284 %275 1;
    jmp @append84(0);
  @append84(w32 %285)
    br.ult w32 %285 %284 @append85 @append86;
  @append85
    elem %286 %283 %285 %284 1;
    load w8 %287 %286 0;
    elem %288 %282 %285 %284 1;
    store w8 %287 %288 0;
    add w32 %289 %285 1;
    jmp @append84(%289);
  @append86
    store ptr %282 %216 0;
    store w32 %278 %216 12;
    jmp @append.store82;
  @then87
    ret 20;
  @merge88
    load w32 %297 %216 12;
    br.ne w32 %297 5 @then89 @merge90;
  @then89
    ret 21;
  @merge90
    load w32 %298 %216 8;
    load ptr %299 %216 0;
    elem %300 %299 2 %298 1;
    load w8 %301 %300 0;
    br.ne w8 %301 239 @then91 @merge92;
  @then91
    ret 22;
  @merge92
    load w32 %302 %216 8;
    load ptr %303 %216 0;
    elem %304 %303 0 %302 1;
    load w8 %305 %304 0;
    br.ne w8 %305 171 @then93 @merge94;
  @then93
    ret 23;
  @merge94
    mul w32 %312 4 2;
    call ptr %313 $arenaAlloc(%3, %312, 4);
    reserve %314 16 8;
    store ptr %313 %314 0;
    store w32 0 %314 8;
    store w32 2 %314 12;
    load w32 %317 %314 8;
    load w32 %318 %314 12;
    br.ult w32 %317 %318 @append.store95 @append.grow96;
  @append.store95
    load ptr %332 %314 0;
    load w32 %333 %314 12;
    elem %334 %332 %317 %333 4;
    store w32 42 %334 0;
    add w32 %335 %317 1;
    store w32 %335 %314 8;
    blit %314 %314 16;
    load w32 %338 %314 8;
    br.eq w32 %338 1 @assert.ok101 @assert.fail100;
  @append.grow96
    shl w32 %319 %318 1;
    or w32 %320 %319 1;
    load ptr %321 %5 0;
    load ptr %322 %5 8;
    mul w32 %323 %320 4;
    call ptr %324 %321(%322, %323, 4);
    load ptr %325 %314 0;
    mul w32 %326 %317 4;
    jmp @append97(0);
  @append97(w32 %327)
    br.ult w32 %327 %326 @append98 @append99;
  @append98
    elem %328 %325 %327 %326 1;
    load w8 %329 %328 0;
    elem %330 %324 %327 %326 1;
    store w8 %329 %330 0;
    add w32 %331 %327 1;
    jmp @append97(%331);
  @append99
    store ptr %324 %314 0;
    store w32 %320 %314 12;
    jmp @append.store95;
  @assert.fail100
    unreachable;
  @assert.ok101
    load w32 %339 %314 8;
    load ptr %340 %314 0;
    elem %341 %340 0 %339 4;
    sload w32 %342 %341 0;
    br.eq w32 %342 42 @assert.ok103 @assert.fail102;
  @assert.fail102
    unreachable;
  @assert.ok103
    load w32 %345 %314 8;
    load w32 %346 %314 12;
    br.ult w32 %345 %346 @append.store104 @append.grow105;
  @append.store104
    load ptr %360 %314 0;
    load w32 %361 %314 12;
    elem %362 %360 %345 %361 4;
    store w32 43 %362 0;
    add w32 %363 %345 1;
    store w32 %363 %314 8;
    blit %314 %314 16;
    load w32 %366 %314 8;
    br.eq w32 %366 2 @assert.ok110 @assert.fail109;
  @append.grow105
    shl w32 %347 %346 1;
    or w32 %348 %347 1;
    load ptr %349 %5 0;
    load ptr %350 %5 8;
    mul w32 %351 %348 4;
    call ptr %352 %349(%350, %351, 4);
    load ptr %353 %314 0;
    mul w32 %354 %345 4;
    jmp @append106(0);
  @append106(w32 %355)
    br.ult w32 %355 %354 @append107 @append108;
  @append107
    elem %356 %353 %355 %354 1;
    load w8 %357 %356 0;
    elem %358 %352 %355 %354 1;
    store w8 %357 %358 0;
    add w32 %359 %355 1;
    jmp @append106(%359);
  @append108
    store ptr %352 %314 0;
    store w32 %348 %314 12;
    jmp @append.store104;
  @assert.fail109
    unreachable;
  @assert.ok110
    load w32 %367 %314 8;
    load ptr %368 %314 0;
    elem %369 %368 0 %367 4;
    load w32 %372 %314 8;
    load w32 %373 %314 12;
    br.ult w32 %372 %373 @append.store111 @append.grow112;
  @append.store111
    load ptr %387 %314 0;
    load w32 %388 %314 12;
    elem %389 %387 %372 %388 4;
    store w32 44 %389 0;
    add w32 %390 %372 1;
    store w32 %390 %314 8;
    blit %314 %314 16;
    load w32 %393 %314 8;
    br.eq w32 %393 3 @assert.ok117 @assert.fail116;
  @append.grow112
    shl w32 %374 %373 1;
    or w32 %375 %374 1;
    load ptr %376 %5 0;
    load ptr %377 %5 8;
    mul w32 %378 %375 4;
    call ptr %379 %376(%377, %378, 4);
    load ptr %380 %314 0;
    mul w32 %381 %372 4;
    jmp @append113(0);
  @append113(w32 %382)
    br.ult w32 %382 %381 @append114 @append115;
  @append114
    elem %383 %380 %382 %381 1;
    load w8 %384 %383 0;
    elem %385 %379 %382 %381 1;
    store w8 %384 %385 0;
    add w32 %386 %382 1;
    jmp @append113(%386);
  @append115
    store ptr %379 %314 0;
    store w32 %375 %314 12;
    jmp @append.store111;
  @assert.fail116
    unreachable;
  @assert.ok117
    load w32 %394 %314 12;
    br.eq w32 %394 5 @assert.ok119 @assert.fail118;
  @assert.fail118
    unreachable;
  @assert.ok119
    load w32 %395 %314 8;
    load ptr %396 %314 0;
    elem %397 %396 0 %395 4;
    br.ne ptr %369 %397 @assert.ok121 @assert.fail120;
  @assert.fail120
    unreachable;
  @assert.ok121
    load w32 %400 %314 8;
    load ptr %401 %314 0;
    elem %402 %401 0 %400 4;
    sload w32 %403 %402 0;
    br.eq w32 %403 42 @assert.ok123 @assert.fail122;
  @assert.fail122
    unreachable;
  @assert.ok123
    load w32 %404 %314 8;
    load ptr %405 %314 0;
    elem %406 %405 1 %404 4;
    sload w32 %407 %406 0;
    br.eq w32 %407 43 @assert.ok125 @assert.fail124;
  @assert.fail124
    unreachable;
  @assert.ok125
    load w32 %408 %314 8;
    load ptr %409 %314 0;
    elem %410 %409 2 %408 4;
    sload w32 %411 %410 0;
    br.eq w32 %411 44 @assert.ok127 @assert.fail126;
  @assert.fail126
    unreachable;
  @assert.ok127
    ret 0;
}
