fn w32 $nestedTargets() {
  @entry0
    jmp @loop1(0, 0);
  @loop1(w64 %0, w32 %47)
    br.slt w64 %0 3 @body2 @merge3(%47);
  @body2
    br.eq w64 %0 0 @then4 @merge5;
  @merge3(w32 %49)
    ret %49;
  @then4
    jmp @step6;
  @merge5
    jmp @loop7(0, %47);
  @step6
    add w64 %48 %0 1;
    jmp @loop1(%48, %47);
  @loop7(w64 %1, w32 %45)
    br.slt w64 %1 3 @body8 @merge9(%45);
  @body8
    br.eq w64 %1 0 @then10 @merge11;
  @merge9(w32 %50)
    jmp @merge3(%50);
  @then10
    jmp @step12;
  @merge11
    jmp @loop13(0, %45);
  @step12
    add w64 %46 %1 1;
    jmp @loop7(%46, %45);
  @loop13(w64 %2, w32 %43)
    br.slt w64 %2 3 @body14 @merge15(%43);
  @body14
    br.eq w64 %2 0 @then16 @merge17;
  @merge15(w32 %51)
    jmp @merge9(%51);
  @then16
    jmp @step18;
  @merge17
    jmp @loop19(0, %43);
  @step18
    add w64 %44 %2 1;
    jmp @loop13(%44, %43);
  @loop19(w64 %3, w32 %41)
    br.slt w64 %3 3 @body20 @merge21(%41);
  @body20
    br.eq w64 %3 0 @then22 @merge23;
  @merge21(w32 %52)
    jmp @merge15(%52);
  @then22
    jmp @step24;
  @merge23
    jmp @loop25(0, %41);
  @step24
    add w64 %42 %3 1;
    jmp @loop19(%42, %41);
  @loop25(w64 %4, w32 %39)
    br.slt w64 %4 3 @body26 @merge27(%39);
  @body26
    br.eq w64 %4 0 @then28 @merge29;
  @merge27(w32 %53)
    jmp @merge21(%53);
  @then28
    jmp @step30;
  @merge29
    jmp @loop31(0, %39);
  @step30
    add w64 %40 %4 1;
    jmp @loop25(%40, %39);
  @loop31(w64 %5, w32 %37)
    br.slt w64 %5 3 @body32 @merge33(%37);
  @body32
    br.eq w64 %5 0 @then34 @merge35;
  @merge33(w32 %54)
    jmp @merge27(%54);
  @then34
    jmp @step36;
  @merge35
    jmp @loop37(0, %37);
  @step36
    add w64 %38 %5 1;
    jmp @loop31(%38, %37);
  @loop37(w64 %6, w32 %35)
    br.slt w64 %6 3 @body38 @merge39(%35);
  @body38
    br.eq w64 %6 0 @then40 @merge41;
  @merge39(w32 %55)
    jmp @merge33(%55);
  @then40
    jmp @step42;
  @merge41
    jmp @loop43(0, %35);
  @step42
    add w64 %36 %6 1;
    jmp @loop37(%36, %35);
  @loop43(w64 %7, w32 %33)
    br.slt w64 %7 3 @body44 @merge45(%33);
  @body44
    br.eq w64 %7 0 @then46 @merge47;
  @merge45(w32 %56)
    jmp @merge39(%56);
  @then46
    jmp @step48;
  @merge47
    jmp @loop49(0, %33);
  @step48
    add w64 %34 %7 1;
    jmp @loop43(%34, %33);
  @loop49(w64 %8, w32 %31)
    br.slt w64 %8 3 @body50 @merge51(%31);
  @body50
    br.eq w64 %8 0 @then52 @merge53;
  @merge51(w32 %57)
    jmp @merge45(%57);
  @then52
    jmp @step54;
  @merge53
    jmp @loop55(0, %31);
  @step54
    add w64 %32 %8 1;
    jmp @loop49(%32, %31);
  @loop55(w64 %9, w32 %29)
    br.slt w64 %9 3 @body56 @merge57(%29);
  @body56
    br.eq w64 %9 0 @then58 @merge59;
  @merge57(w32 %58)
    jmp @merge51(%58);
  @then58
    jmp @step60;
  @merge59
    jmp @loop61(0, %29);
  @step60
    add w64 %30 %9 1;
    jmp @loop55(%30, %29);
  @loop61(w64 %10, w32 %27)
    br.slt w64 %10 3 @body62 @merge63(%27);
  @body62
    br.eq w64 %10 0 @then64 @merge65;
  @merge63(w32 %59)
    jmp @merge57(%59);
  @then64
    jmp @step66;
  @merge65
    jmp @loop67(0, %27);
  @step66
    add w64 %28 %10 1;
    jmp @loop61(%28, %27);
  @loop67(w64 %11, w32 %25)
    br.slt w64 %11 3 @body68 @merge69(%25);
  @body68
    br.eq w64 %11 0 @then70 @merge71;
  @merge69(w32 %60)
    jmp @merge63(%60);
  @then70
    jmp @step72;
  @merge71
    jmp @loop73(0, %25);
  @step72
    add w64 %26 %11 1;
    jmp @loop67(%26, %25);
  @loop73(w64 %12, w32 %23)
    br.slt w64 %12 3 @body74 @merge75(%23);
  @body74
    br.eq w64 %12 0 @then76 @merge77;
  @merge75(w32 %61)
    jmp @merge69(%61);
  @then76
    jmp @step78;
  @merge77
    jmp @loop79(0, %23);
  @step78
    add w64 %24 %12 1;
    jmp @loop73(%24, %23);
  @loop79(w64 %13, w32 %21)
    br.slt w64 %13 3 @body80 @merge81(%21);
  @body80
    br.eq w64 %13 0 @then82 @merge83;
  @merge81(w32 %62)
    jmp @merge75(%62);
  @then82
    jmp @step84;
  @merge83
    jmp @loop85(0, %21);
  @step84
    add w64 %22 %13 1;
    jmp @loop79(%22, %21);
  @loop85(w64 %14, w32 %19)
    br.slt w64 %14 3 @body86 @merge87(%19);
  @body86
    br.eq w64 %14 0 @then88 @merge89;
  @merge87(w32 %63)
    jmp @merge81(%63);
  @then88
    jmp @step90;
  @merge89
    jmp @loop91(0, %19);
  @step90
    add w64 %20 %14 1;
    jmp @loop85(%20, %19);
  @loop91(w64 %15, w32 %16)
    br.slt w64 %15 3 @body92 @merge93(%16);
  @body92
    br.eq w64 %15 0 @then94 @merge95;
  @merge93(w32 %64)
    jmp @merge87(%64);
  @then94
    jmp @step96;
  @merge95
    add w32 %17 %16 42;
    jmp @merge93(%17);
  @step96
    add w64 %18 %15 1;
    jmp @loop91(%18, %16);
}

fn w32 $parameters(w32 %0, w32 %1, w32 %2, w32 %3, w32 %4, w32 %5, w32 %6, w32 %7) {
  @entry0
    add w32 %8 %0 %1;
    add w32 %9 %8 %2;
    add w32 %10 %9 %3;
    add w32 %11 %10 %4;
    add w32 %12 %11 %5;
    add w32 %13 %12 %6;
    add w32 %14 %13 %7;
    ret %14;
}

fn w64 $aggregate(w64 %0, w32 %1, w32 %2, w32 %3, w32 %4, w32 %5, w32 %6, w32 %7) {
  @entry0
    reserve %8 8 4;
    add w32 %9 %1 %2;
    add w32 %10 %9 %3;
    add w32 %11 %10 %4;
    add w32 %12 %11 %5;
    add w32 %13 %12 %6;
    add w32 %14 %13 %7;
    store w32 %14 %8 0;
    store w32 42 %8 4;
    blit %0 %8 8;
    ret %0;
}

fn w32 $main() {
  @entry0
    call w32 %0 $parameters(1, 2, 3, 4, 5, 6, 7, 14);
    br.eq w32 %0 42 @assert.ok2 @assert.fail1;
  @assert.fail1
    unreachable;
  @assert.ok2
    reserve %1 8 4;
    call w64 %2 $aggregate(%1, 1, 2, 3, 4, 5, 6, 21);
    sload w32 %3 %2 0;
    br.eq w32 %3 42 @assert.ok4 @assert.fail3;
  @assert.fail3
    unreachable;
  @assert.ok4
    mul w64 %4 1 4;
    add w64 %5 %2 %4;
    sload w32 %6 %5 0;
    br.eq w32 %6 42 @assert.ok6 @assert.fail5;
  @assert.fail5
    unreachable;
  @assert.ok6
    call w32 %7 $nestedTargets();
    ret %7;
}
