Fixture 124

loop break continue

C · 3 functions · 4 lanes · 12 of 12 function-lanes behave identically

All 4 lanes recompile and return the same results as the original.

break and continue bind to the innermost enclosing loop or switch. A break inside a switch inside a loop leaves the switch, not the loop -- the single most common source of a mis-structured recovery.

tests/decompiler_fixtures/src/124_loop_break_continue.c source
#include <stdint.h>

/* break and continue bind to the innermost enclosing loop or switch. A break
 * inside a switch inside a loop leaves the switch, not the loop -- the single
 * most common source of a mis-structured recovery. */

__attribute__((noinline)) int32_t
break_binds_to_switch(const int32_t *values, int32_t count) {
    int32_t total = 0;
    int32_t index;
    if (values == 0 || count < 0 || count > 16) {
        return -1;
    }
    for (index = 0; index < count; ++index) {
        switch (values[index] & 3) {
        case 0:
            total += 1;
            break; /* leaves the switch; the loop continues */
        case 1:
            total += 10;
            continue; /* this one does leave the iteration */
        case 2:
            total += 100;
            break;
        default:
            total += 1000;
            break;
        }
        total += 1; /* reached for cases 0, 2, 3 but not 1 */
    }
    return total;
}

__attribute__((noinline)) int32_t
nested_loop_early_exit(const int32_t *grid, int32_t rows, int32_t columns,
                       int32_t needle) {
    int32_t row;
    int32_t column;
    int32_t visited = 0;
    if (grid == 0 || rows < 0 || rows > 4 || columns < 0 || columns > 4) {
        return -1;
    }
    for (row = 0; row < rows; ++row) {
        for (column = 0; column < columns; ++column) {
            visited += 1;
            if (grid[row * columns + column] == needle) {
                goto found; /* the only clean way out of two loops */
            }
        }
    }
    return -visited;
found:
    return visited;
}

__attribute__((noinline)) int32_t
continue_in_do_while(int32_t limit) {
    int32_t index = 0;
    int32_t total = 0;
    if (limit < 0 || limit > 16) {
        return -1;
    }
    do {
        index += 1;
        if ((index & 1) == 0) {
            continue; /* jumps to the controlling expression, not the top */
        }
        total += index;
    } while (index < limit);
    return total;
}

Recovered C

Generated by glaurung decompile --style decbench at b47f6b43. baseline.json records the result after recompiling the C and calling it beside the original with seeded inputs.

clang -O0

3/3
break_binds_to_switch pass 61 lines
// glaurung: break_binds_to_switch @ 0x1100
int32_t break_binds_to_switch(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    int local_20;
    int local_4;
    int var4;
    total = 0;
    if ((arg0 != 0)) {
        if ((0 <= (long)(arg1))) {
            if ((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16))) {
                goto L_113d;
            }
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_113d: ;
    index = 0;
    L_1144: ;
    if ((arg1 <= index)) {
        goto L_11da;
    }
    var4 = ((unsigned int)(arg0[(long)(index)]) & 3);
    local_20 = var4;
    if (((unsigned long)((unsigned int)(var4)) == 0)) {
        goto L_118e;
    }
    goto L_116c;
    L_116c: ;
    if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(local_20)) - 1))) == 0)) {
        goto L_119c;
    }
    goto L_117d;
    L_117d: ;
    if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(local_20)) - 2))) == 0)) {
        goto L_11aa;
    }
    goto L_11b8;
    L_118e: ;
    total = ((unsigned int)(total) + 1);
    goto L_11c3;
    L_119c: ;
    total = ((unsigned int)(total) + 10);
    goto L_11cc;
    L_11aa: ;
    total = ((unsigned int)(total) + 100);
    goto L_11c3;
    L_11b8: ;
    total = ((unsigned int)(total) + 1000);
    L_11c3: ;
    total = ((unsigned int)(total) + 1);
    L_11cc: ;
    index = ((unsigned int)(index) + 1);
    goto L_1144;
    L_11da: ;
    local_4 = total;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
continue_in_do_while pass 29 lines
// glaurung: continue_in_do_while @ 0x12e0
int32_t continue_in_do_while(int32_t arg0) {
    int index;
    int total;
    int local_4;
    // x86-64 prologue: save rbp
    index = 0;
    total = 0;
    if (((long)(arg0) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 16) | ((long)(arg0) < 16)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    do {
        index = ((unsigned int)(index) + 1);
        if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 1))) != 0)) {
            total = ((unsigned int)(index) + total);
        } else {
        }
    } while ((index < arg0));
    local_4 = total;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
nested_loop_early_exit pass 54 lines
// glaurung: nested_loop_early_exit @ 0x11f0
int32_t nested_loop_early_exit(const int32_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    int visited;
    int row;
    int column;
    int local_4;
    visited = 0;
    if ((arg0 != 0)) {
        if ((0 <= (long)(arg1))) {
            if (((((unsigned long)((unsigned int)(arg1)) == 4) | ((long)(arg1) < 4)) != 0)) {
                if ((0 <= (long)(arg2))) {
                    if ((((unsigned long)((unsigned int)(arg2)) == 4) | ((long)(arg2) < 4))) {
                        goto L_1247;
                    }
                }
            }
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_1247: ;
    row = 0;
    L_124e: ;
    if ((arg1 <= row)) {
        goto L_12be;
    }
    column = 0;
    L_1261: ;
    if ((arg2 <= column)) {
        goto L_12ab;
    }
    visited = ((unsigned int)(visited) + 1);
    if (((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg2))) + column)))]) == (unsigned int)(arg3))) {
        goto L_12cb;
    }
    goto L_129d;
    L_129d: ;
    column = ((unsigned int)(column) + 1);
    goto L_1261;
    L_12ab: ;
    goto L_12b0;
    L_12b0: ;
    row = ((unsigned int)(row) + 1);
    goto L_124e;
    L_12be: ;
    local_4 = (0 - visited);
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_12cb: ;
    local_4 = visited;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

clang -O2

3/3
break_binds_to_switch pass 109 lines
// glaurung: break_binds_to_switch @ 0x1100
int32_t break_binds_to_switch(const int32_t * arg0, int32_t arg1) {
    int index;
    int total;
    long ret;
    long var0;
    long var14;
    long var19;
    long var20;
    int var21;
    long var22;
    int var28;
    long var29;
    int var32;
    int var38;
    long var39;
    long var5;
    int var8;
    ret = 0xffffffff;
    if ((arg0 == 0)) {
        return ret;
    }
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        goto L_1159;
    }
    var0 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)((unsigned int)(arg1)) != 1)) {
        goto L_115c;
    }
    var5 = 0;
    index = 0;
    L_1127: ;
    ret = var5;
    if (((unsigned long)((unsigned char)((var0 & 1))) == 0)) {
        return ret;
    }
    var8 = ((unsigned int)(*(int *)(((long)arg0 + index * 4))) & 3);
    if (((unsigned long)((unsigned int)(var8)) == 0)) {
        return (unsigned int)(((unsigned long)((unsigned int)((var5 + 1))) + 1));
    }
    if (((unsigned long)((unsigned int)(var8)) == 1)) {
        return (unsigned int)((var5 + 10));
    }
    if (((unsigned long)((unsigned int)(var8)) != 2)) {
        return (unsigned int)(((unsigned long)((unsigned int)((var5 + 1000))) + 1));
    }
    return (unsigned int)(((unsigned long)((unsigned int)((var5 + 100))) + 1));
    L_1159: ;
    return 0;
    L_115c: ;
    var14 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var0)) & -2)));
    var19 = 0;
    var20 = 0;
    goto L_1183;
    L_1170: ;
    var21 = 1;
    L_1175: ;
    var5 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var22 + var21))) + 1)));
    L_117a: ;
    index = (var20 + 2);
    var19 = var5;
    var20 = (unsigned long)((unsigned int)(index));
    if ((var14 == index)) {
        goto L_1127;
    }
    L_1183: ;
    var28 = ((unsigned int)(*(int *)(((long)arg0 + var20 * 4))) & 3);
    var29 = (unsigned long)((unsigned int)(var28));
    if (((unsigned long)((unsigned int)(var28)) != 0)) {
        if (((unsigned long)((unsigned int)(var29)) == 2)) {
            goto L_11b0;
        }
        if (((unsigned long)((unsigned int)(var29)) != 1)) {
            goto L_11c0;
        }
        var22 = (unsigned long)((unsigned int)((var19 + 10)));
        goto L_11ca;
    }
    var32 = 1;
    goto L_11c5;
    L_11b0: ;
    var32 = 100;
    goto L_11c5;
    L_11c0: ;
    var32 = 1000;
    L_11c5: ;
    var22 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var19 + var32))) + 1)));
    L_11ca: ;
    var38 = ((unsigned int)(*(int *)(((long)arg0 + var20 * 4 + 0x4))) & 3);
    var39 = (unsigned long)((unsigned int)(var38));
    if (((unsigned long)((unsigned int)(var38)) == 0)) {
        goto L_1170;
    }
    if (((unsigned long)((unsigned int)(var39)) != 1)) {
        if (((unsigned long)((unsigned int)(var39)) != 2)) {
            goto L_1200;
        }
        var21 = 100;
        goto L_1175;
    }
    var5 = (unsigned long)((unsigned int)((var22 + 10)));
    goto L_117a;
    L_1200: ;
    var21 = 1000;
    goto L_1175;
}
continue_in_do_while pass 172 lines
// glaurung: continue_in_do_while @ 0x13f0
int32_t continue_in_do_while(int32_t arg0) {
    int index;
    int total;
    long ret;
    int var105;
    int var106;
    int var107;
    int var108;
    int var109;
    int var111;
    int var112;
    int var113;
    int var114;
    long var148;
    long var149;
    long var15;
    long var152;
    int var161;
    long var18;
    int var2;
    int var20;
    int var21;
    int var22;
    int var23;
    int var24;
    int var25;
    int var26;
    int var27;
    int var29;
    int var30;
    int var31;
    int var32;
    int var33;
    int var34;
    int var35;
    int var36;
    int var37;
    int var38;
    int var39;
    long var4;
    int var40;
    int var41;
    int var42;
    int var43;
    int var44;
    int var51;
    int var52;
    int var53;
    int var54;
    long var6;
    int var82;
    int var83;
    int var84;
    int var85;
    long var9;
    ret = 0xffffffff;
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg0))))) {
        goto L_1509;
    }
    var2 = ((2 <= (long)(arg0)) ? arg0 : 1);
    var4 = 0;
    var6 = 0;
    if (((unsigned long)((unsigned long)((unsigned int)(var2))) < (unsigned long)(4))) {
        goto L_14e5;
    }
    var4 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) & 0x7ffffffc)));
    var9 = (unsigned long)((unsigned int)((var4 - 4)));
    var15 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var9)) >> 2))) + 1)));
    if (((unsigned long)((unsigned int)(var9)) == 0)) {
        goto L_150a;
    }
    var18 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var15)) & -2)));
    var20 = 0;
    var21 = 0;
    var22 = 0;
    var23 = 0;
    var24 = 0;
    var25 = 1;
    var26 = 2;
    var27 = 3;
    var29 = -1;
    var30 = -1;
    var31 = -1;
    var32 = -1;
    var33 = 5;
    var34 = 5;
    var35 = 5;
    var36 = 5;
    var37 = 8;
    var38 = 8;
    var39 = 8;
    var40 = 8;
    do {
        var41 = var24;
        var42 = var25;
        var43 = var26;
        var44 = var27;
        var51 = (var24 - var29);
        var52 = (var25 - var30);
        var53 = (var26 - var31);
        var54 = (var27 - var32);
        var82 = (var24 + var33);
        var83 = (var25 + var34);
        var84 = (var26 + var35);
        var85 = (var27 + var36);
        var20 = ((((long)((var82 << 31)) >> 31) & var82) + ((((long)((var51 << 31)) >> 31) & var51) + var20));
        var21 = ((((long)((var83 << 31)) >> 31) & var83) + ((((long)((var52 << 31)) >> 31) & var52) + var21));
        var22 = ((((long)((var84 << 31)) >> 31) & var84) + ((((long)((var53 << 31)) >> 31) & var53) + var22));
        var23 = ((((long)((var85 << 31)) >> 31) & var85) + ((((long)((var54 << 31)) >> 31) & var54) + var23));
        var24 = (var24 + var37);
        var25 = (var25 + var38);
        var26 = (var26 + var39);
        var27 = (var27 + var40);
        var105 = (var18 - 2);
        var18 = (unsigned long)((unsigned int)(var105));
    } while (((unsigned long)((unsigned int)(var105)) != 0));
    var106 = (var41 + 9);
    var107 = (var42 + 9);
    var108 = (var43 + 9);
    var109 = (var44 + 9);
    var111 = var20;
    var112 = var21;
    var113 = var22;
    var114 = var23;
    if (((unsigned long)((unsigned char)((var15 & 1))) == 0)) {
        goto L_14cb;
    }
    L_14b5: ;
    var111 = (var20 + (((long)((var106 << 31)) >> 31) & var106));
    var112 = (var21 + (((long)((var107 << 31)) >> 31) & var107));
    var113 = (var22 + (((long)((var108 << 31)) >> 31) & var108));
    var114 = (var23 + (((long)((var109 << 31)) >> 31) & var109));
    L_14cb: ;
    var148 = (unsigned long)((unsigned int)(((var114 + var112) + (var113 + var111))));
    var6 = var148;
    ret = var148;
    if (((unsigned int)(var2) == (unsigned int)(var4))) {
        goto L_1509;
    }
    L_14e5: ;
    var149 = (-(unsigned long)((unsigned int)(var2)));
    index = (unsigned long)((unsigned int)((var4 + 1)));
    var152 = var6;
    do {
        total = (var152 + (unsigned int)(((-(unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 1)))) & index)));
        var152 = (unsigned long)((unsigned int)(total));
        var161 = ((unsigned int)((var149 + index)) + 1);
        index = (unsigned long)((unsigned int)((index + 1)));
        ret = (unsigned long)((unsigned int)(total));
    } while (((unsigned long)((unsigned int)(var161)) != 1));
    L_1509: ;
    return ret;
    L_150a: ;
    ret = 0;
    var20 = 0;
    var21 = 0;
    var22 = 0;
    var23 = 0;
    var106 = 1;
    var107 = 2;
    var108 = 3;
    var109 = 4;
    if (((unsigned long)((unsigned char)((var15 & 1))) != 0)) {
        goto L_14b5;
    }
    var111 = var20;
    var112 = var21;
    var113 = var22;
    var114 = var23;
    goto L_14cb;
}
nested_loop_early_exit pass 222 lines
// glaurung: nested_loop_early_exit @ 0x1220
int32_t nested_loop_early_exit(const int32_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    int column;
    int row;
    int visited;
    long local_8;
    long ret;
    long t151;
    long var0;
    long var12;
    long var15;
    long var18;
    long var19;
    long var2;
    long var22;
    long var24;
    long var25;
    long var28;
    long var31;
    long var7;
    local_8 = var0;
    ret = 0xffffffff;
    if (((unsigned long)(4) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        goto L_1321;
    }
    if ((arg0 == 0)) {
        goto L_1321;
    }
    if (((unsigned long)(4) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        goto L_1321;
    }
    if (((unsigned long)((unsigned int)(arg1)) != 0)) {
        if (((unsigned long)((unsigned int)(arg2)) == 0)) {
            goto L_12a0;
        }
        ret = 1;
        if (((unsigned int)(*(int *)(((long)arg0))) == (unsigned int)(arg3))) {
            goto L_1321;
        }
        var2 = (unsigned long)((unsigned int)(arg2));
        if (((unsigned long)((unsigned int)(arg2)) == 1)) {
            goto L_12a3;
        }
        ret = 2;
        if (((unsigned int)(*(int *)(((long)arg0 + 0x4))) == (unsigned int)(arg3))) {
            goto L_1321;
        }
        var2 = (unsigned long)((unsigned int)(arg2));
        if (((unsigned long)((unsigned int)(arg2)) == 2)) {
            goto L_12a3;
        }
        ret = 3;
        if (((unsigned int)(*(int *)(((long)arg0 + 0x8))) == (unsigned int)(arg3))) {
            goto L_1321;
        }
        var2 = (unsigned long)((unsigned int)(arg2));
        if (((unsigned long)((unsigned int)(arg2)) == 3)) {
            goto L_12a3;
        }
        ret = 4;
        var2 = (unsigned long)((unsigned int)(arg2));
        if (((unsigned int)(*(int *)(((long)arg0 + 0xc))) != (unsigned int)(arg3))) {
            goto L_12a3;
        }
        goto L_1321;
    }
    var7 = 0;
    goto L_12d6;
    L_12a0: ;
    var2 = 0;
    L_12a3: ;
    var7 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) * arg1)));
    if (((unsigned long)((unsigned int)(arg1)) == 1)) {
        goto L_12d6;
    }
    var12 = (unsigned long)((unsigned int)(arg2));
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        goto L_12c3;
    }
    if (((unsigned int)(*(int *)(((long)arg0 + var12 * 4))) != (unsigned int)(arg3))) {
        goto L_12c8;
    }
    var15 = (unsigned long)((unsigned int)((var2 + 1)));
    L_12be: ;
    ret = (unsigned long)((unsigned int)(var15));
    // x86-64 epilogue: tear down frame
    return (unsigned int)(var15);
    L_12c3: ;
    var18 = (unsigned long)((unsigned int)(var2));
    goto L_12d1;
    L_12c8: ;
    var19 = (unsigned long)((unsigned int)((var2 + arg2)));
    var18 = var19;
    if (((unsigned long)((unsigned int)(arg2)) != 1)) {
        goto L_12ed;
    }
    L_12d1: ;
    if (((unsigned long)((unsigned int)(arg1)) != 2)) {
        goto L_12da;
    }
    L_12d6: ;
    t151 = (-var7);
    ret = t151;
    // x86-64 epilogue: tear down frame
    return t151;
    L_12da: ;
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        goto L_12fa;
    }
    if (((unsigned int)(*(int *)(((long)arg0 + var12 * 8))) != (unsigned int)(arg3))) {
        goto L_12ff;
    }
    var22 = (unsigned long)((unsigned int)((var18 + 1)));
    goto L_13c0;
    L_12ed: ;
    if (((unsigned int)(*(int *)(((long)arg0 + var12 * 4 + 0x4))) != (unsigned int)(arg3))) {
        goto L_1323;
    }
    var15 = (unsigned long)((unsigned int)((var2 + 2)));
    goto L_12be;
    L_12fa: ;
    var24 = (unsigned long)((unsigned int)(var18));
    goto L_1308;
    L_12ff: ;
    var24 = (unsigned long)((unsigned int)((var18 + arg2)));
    if (((unsigned long)((unsigned int)(arg2)) != 1)) {
        goto L_1335;
    }
    L_1308: ;
    if (((unsigned long)((unsigned int)(arg1)) == 3)) {
        goto L_12d6;
    }
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        goto L_12d6;
    }
    var25 = (var12 + (var12 * 2));
    if (((unsigned int)(*(int *)(((long)arg0 + var25 * 4))) != (unsigned int)(arg3))) {
        goto L_1350;
    }
    var28 = (unsigned long)((unsigned int)((var24 + 1)));
    L_131e: ;
    ret = (unsigned long)((unsigned int)(var28));
    L_1321: ;
    // x86-64 epilogue: tear down frame
    return ret;
    L_1323: ;
    var18 = var19;
    if (((unsigned long)((unsigned int)(arg2)) == 2)) {
        goto L_12d1;
    }
    if (((unsigned int)(*(int *)(((long)arg0 + var12 * 4 + 0x8))) != (unsigned int)(arg3))) {
        goto L_1373;
    }
    var15 = (unsigned long)((unsigned int)((var2 + 3)));
    goto L_12be;
    L_1335: ;
    var31 = (var12 + var12);
    if (((unsigned int)(*(int *)(((long)arg0 + ((var31 * 4) | 4)))) != (unsigned int)(arg3))) {
        goto L_1361;
    }
    var22 = (unsigned long)((unsigned int)((var18 + 2)));
    goto L_13c0;
    L_1350: ;
    if (((unsigned long)((unsigned int)(arg2)) == 1)) {
        goto L_12d6;
    }
    if (((unsigned int)(*(int *)(((long)arg0 + var25 * 4 + 0x4))) != (unsigned int)(arg3))) {
        goto L_1390;
    }
    var28 = (unsigned long)((unsigned int)((var24 + 2)));
    goto L_131e;
    L_1361: ;
    if (((unsigned long)((unsigned int)(arg2)) == 2)) {
        goto L_1308;
    }
    if (((unsigned int)(*(int *)(((long)arg0 + var31 * 4 + 0x8))) != (unsigned int)(arg3))) {
        goto L_13a8;
    }
    var22 = (unsigned long)((unsigned int)((var18 + 3)));
    goto L_13c0;
    L_1373: ;
    var18 = var19;
    if (((unsigned long)((unsigned int)(arg2)) == 3)) {
        goto L_12d1;
    }
    var18 = var19;
    if (((unsigned int)(*(int *)(((long)arg0 + var12 * 4 + 0xc))) != (unsigned int)(arg3))) {
        goto L_12d1;
    }
    var15 = (unsigned long)((unsigned int)((var2 + 4)));
    goto L_12be;
    L_1390: ;
    if (((unsigned long)((unsigned int)(arg2)) == 2)) {
        goto L_12d6;
    }
    if (((unsigned int)(*(int *)(((long)arg0 + var25 * 4 + 0x8))) != (unsigned int)(arg3))) {
        goto L_13c5;
    }
    var28 = (unsigned long)((unsigned int)((var24 + 3)));
    goto L_131e;
    L_13a8: ;
    if (((unsigned long)((unsigned int)(arg2)) == 3)) {
        goto L_1308;
    }
    if (((unsigned int)(*(int *)(((long)arg0 + var31 * 4 + 0xc))) != (unsigned int)(arg3))) {
        goto L_1308;
    }
    var22 = (unsigned long)((unsigned int)((var18 + 4)));
    L_13c0: ;
    ret = (unsigned long)((unsigned int)(var22));
    // x86-64 epilogue: tear down frame
    return (unsigned int)(var22);
    L_13c5: ;
    if (((unsigned long)((unsigned int)(arg2)) == 3)) {
        goto L_12d6;
    }
    if (((unsigned int)(*(int *)(((long)arg0 + var25 * 4 + 0xc))) != (unsigned int)(arg3))) {
        goto L_12d6;
    }
    var28 = (unsigned long)((unsigned int)((var24 + 4)));
    goto L_131e;
}

gcc -O0

3/3
break_binds_to_switch pass 49 lines
// glaurung: break_binds_to_switch @ 0x10f9
int32_t break_binds_to_switch(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    long var8;
    // x86-64 prologue: save rbp
    total = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((long)(arg1) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    index = 0;
    while ((index < arg1)) {
        var8 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0[(long)(index)])) & 3)));
        if (((unsigned long)((unsigned int)(var8)) == 2)) {
            total = (total + 100);
            L_117a: ;
            total = (total + 1);
        } else {
            if (((((unsigned long)((unsigned int)(var8)) == 2) | ((long)((int)(var8)) < 2)) == 0)) {
                L_1172: ;
                total = (total + 1000);
                goto L_117a;
            } else {
                if (((unsigned long)((unsigned int)(var8)) == 0)) {
                    total = (total + 1);
                    goto L_117a;
                } else {
                    if (((unsigned long)((unsigned int)(var8)) == 1)) {
                        total = (total + 10);
                    } else {
                        goto L_1172;
                    }
                }
            }
        }
        index = (index + 1);
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(total);
}
continue_in_do_while pass 25 lines
// glaurung: continue_in_do_while @ 0x1232
int32_t continue_in_do_while(int32_t arg0) {
    int index;
    int total;
    // x86-64 prologue: save rbp
    index = 0;
    total = 0;
    if (((long)(arg0) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 16) | ((long)(arg0) < 16)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    do {
        index = (index + 1);
        if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) & 1))) == 0)) {
        } else {
            total = (total + (unsigned int)(index));
        }
    } while ((index < arg0));
    // x86-64 epilogue: restore rbp
    return (unsigned int)(total);
}
nested_loop_early_exit pass 44 lines
// glaurung: nested_loop_early_exit @ 0x118f
int32_t nested_loop_early_exit(const int32_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    int visited;
    int row;
    int column;
    visited = 0;
    if ((arg0 != 0)) {
        if ((0 <= (long)(arg1))) {
            if (((((unsigned long)((unsigned int)(arg1)) == 4) | ((long)(arg1) < 4)) != 0)) {
                if ((0 <= (long)(arg2))) {
                    if ((((unsigned long)((unsigned int)(arg2)) == 4) | ((long)(arg2) < 4))) {
                        goto L_11d1;
                    }
                }
            }
        }
    }
    // x86-64 epilogue: restore rbp
    return 0xffffffff;
    L_11d1: ;
    row = 0;
    goto L_121d;
    L_11da: ;
    column = 0;
    goto L_1211;
    L_11e3: ;
    visited = (visited + 1);
    if (((unsigned int)(arg3) == (unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg2))))))]))) {
        // x86-64 epilogue: restore rbp
        return (unsigned int)(visited);
    }
    column = (column + 1);
    L_1211: ;
    if ((column < arg2)) {
        goto L_11e3;
    }
    row = (row + 1);
    L_121d: ;
    if ((row < arg1)) {
        goto L_11da;
    }
    // x86-64 epilogue: restore rbp
    return (-(unsigned long)((unsigned int)(visited)));
}

gcc -O2

3/3
break_binds_to_switch pass 50 lines
// glaurung: break_binds_to_switch @ 0x1100
int32_t break_binds_to_switch(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    long ret;
    long var11;
    int var16;
    long var2;
    long var6;
    long var9;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        return 0xffffffff;
    }
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        return 0;
    }
    var2 = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg1 - 1))) * 4)) + 4));
    total = 0;
    var6 = (long)arg0;
    L_1141: ;
    while (1) {
        var9 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var6)))) & 3)));
        if (((unsigned long)((unsigned int)(var9)) != 1)) {
            var11 = (unsigned long)((unsigned int)((total + 100)));
            if (((unsigned long)((unsigned int)(var9)) != 2)) {
                var11 = (((unsigned long)((unsigned int)(var9)) != 0) ? (unsigned long)((unsigned int)((total + 1000))) : (unsigned long)((unsigned int)((total + 1))));
            }
            var6 = (var6 + 4);
            total = (unsigned long)((unsigned int)((var11 + 1)));
            ret = (unsigned long)((unsigned int)(total));
            if ((var6 == var2)) {
                goto L_1157;
            }
            goto L_1141;
        }
        var6 = (var6 + 4);
        var16 = (total + 10);
        ret = (unsigned long)((unsigned int)(var16));
        total = (unsigned long)((unsigned int)(var16));
        if ((var6 != var2)) {
            goto L_1141;
        }
        goto L_1157;
    }
    L_1157: ;
    return ret;
}
continue_in_do_while pass 22 lines
// glaurung: continue_in_do_while @ 0x11e0
int32_t continue_in_do_while(int32_t arg0) {
    int index;
    int total;
    int var1;
    int var10;
    long var6;
    int var8;
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg0))))) {
        return 0xffffffff;
    }
    var6 = 0;
    index = 0;
    do {
        var8 = (index + 1);
        index = (unsigned long)((unsigned int)(var8));
        var10 = (((unsigned long)((unsigned char)(((unsigned long)((unsigned int)(var8)) & 1))) != 0) ? (unsigned long)((unsigned int)((var6 + (unsigned long)((unsigned int)(var8))))) : var6);
        var6 = (unsigned long)((unsigned int)(var10));
        var1 = var10;
    } while (((((unsigned int)(arg0) == (unsigned int)(var8)) | (arg0 < var8)) == 0));
    return (unsigned int)(var1);
}
nested_loop_early_exit pass 63 lines
// glaurung: nested_loop_early_exit @ 0x1170
int32_t nested_loop_early_exit(const int32_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    int visited;
    int column;
    int row;
    long var0;
    long var10;
    long var12;
    long var13;
    int var15;
    long var2;
    long var7;
    long var8;
    long var9;
    var0 = (long)arg0;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    if (((unsigned long)(4) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        return 0xffffffff;
    }
    if (((unsigned long)(4) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        return 0xffffffff;
    }
    var2 = 0;
    var7 = 0;
    var8 = 0;
    var9 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        return (unsigned int)(var9);
    }
    L_1192: ;
    var10 = var8;
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        goto L_11c0;
    }
    var12 = (unsigned long)((unsigned int)((var8 + arg2)));
    var13 = (var0 + ((long)((int)(var2)) * 4));
    visited = var8;
    goto L_11b1;
    L_11a8: ;
    var13 = (var13 + 4);
    var10 = visited;
    if (((unsigned int)(visited) == (unsigned int)(var12))) {
        goto L_11c0;
    }
    L_11b1: ;
    visited = (unsigned long)((unsigned int)((visited + 1)));
    if (((unsigned int)(*(int *)((var13))) != (unsigned int)(arg3))) {
        goto L_11a8;
    }
    return visited;
    L_11c0: ;
    var15 = (var7 + 1);
    var2 = (unsigned long)((unsigned int)((var2 + arg2)));
    var7 = (unsigned long)((unsigned int)(var15));
    var8 = var10;
    if (((unsigned int)(arg1) != (unsigned int)(var15))) {
        goto L_1192;
    }
    var9 = (unsigned long)((unsigned int)((-var10)));
    return (unsigned int)(var9);
}

← 213 fixtures