Fixture 187

constant bias index

C · 5 functions · 4 lanes · 20 of 20 function-lanes behave identically

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

An array subscript with a constant bias — a[i + 3] — is the shape the affine index analysis is meant to recover: one object, one induction variable, one fixed displacement folded into the address. 109_subscript_commutativity covers which *spelling* produced a subscript, and a negative offset from an interior pointer; neither is a constant bias on the index itself.

The last two functions are the controls. Recovering a bias is only correct if it is not recovered where there is none: value_bias_not_index adds the same constant to the loaded *value*, and variable_bias displaces the index by a runtime argument. A pass that folds either into a fixed address bias is wrong, and would otherwise look indistinguishable from success.

Every access is bounded by an explicit source guard rather than by the harness contract, so an out-of-domain argument returns -1 on both the original and the recompiled side instead of reading past the buffer.

tests/decompiler_fixtures/src/187_constant_bias_index.c source
#include <stdint.h>

/* An array subscript with a constant bias — a[i + 3] — is the shape the affine
 * index analysis is meant to recover: one object, one induction variable, one
 * fixed displacement folded into the address. `109_subscript_commutativity`
 * covers which *spelling* produced a subscript, and a negative offset from an
 * interior pointer; neither is a constant bias on the index itself.
 *
 * The last two functions are the controls. Recovering a bias is only correct if
 * it is not recovered where there is none: `value_bias_not_index` adds the same
 * constant to the loaded *value*, and `variable_bias` displaces the index by a
 * runtime argument. A pass that folds either into a fixed address bias is
 * wrong, and would otherwise look indistinguishable from success.
 *
 * Every access is bounded by an explicit source guard rather than by the
 * harness contract, so an out-of-domain argument returns -1 on both the
 * original and the recompiled side instead of reading past the buffer. */

#define BIAS_CAPACITY 16
#define FORWARD_BIAS 2

__attribute__((noinline)) int32_t
bias_forward_sum(const int32_t *values, int32_t count) {
    int32_t total = 0;
    int32_t index;
    if (values == 0 || count < 0 || count > BIAS_CAPACITY - FORWARD_BIAS) {
        return -1;
    }
    for (index = 0; index < count; ++index) {
        total += values[index + FORWARD_BIAS];
    }
    return total;
}

__attribute__((noinline)) int32_t
bias_backward_pair(const int32_t *values, int32_t count) {
    int32_t total = 0;
    int32_t index;
    if (values == 0 || count < 1 || count > BIAS_CAPACITY) {
        return -1;
    }
    /* Two biased reads of one object per iteration: one at the cursor and one a
     * fixed element behind it. */
    for (index = 1; index < count; ++index) {
        total += values[index] - values[index - 1];
    }
    return total;
}

__attribute__((noinline)) int32_t
adjacent_difference(const int32_t *values, int32_t count, int32_t *out) {
    int32_t index;
    if (values == 0 || out == 0 || count < 1 || count > BIAS_CAPACITY) {
        return -1;
    }
    /* A biased load feeding an unbiased store: the two objects must not be
     * unified just because their cursors advance in step. */
    for (index = 0; index + 1 < count; ++index) {
        out[index] = values[index + 1] - values[index];
    }
    return count - 1;
}

__attribute__((noinline)) int32_t
value_bias_not_index(const int32_t *values, int32_t count) {
    int32_t total = 0;
    int32_t index;
    if (values == 0 || count < 0 || count > BIAS_CAPACITY) {
        return -1;
    }
    /* Control: the constant is added to the loaded value, never to the address.
     * The sum differs from `bias_forward_sum` for the same buffer. */
    for (index = 0; index < count; ++index) {
        total += values[index] + FORWARD_BIAS;
    }
    return total;
}

__attribute__((noinline)) int32_t
variable_bias(const int32_t *values, int32_t count, int32_t bias) {
    int32_t total = 0;
    int32_t index;
    if (values == 0 || count < 0 || count > BIAS_CAPACITY || bias < 0 ||
        bias > count) {
        return -1;
    }
    /* Control: the displacement is a runtime value, so no constant bias exists
     * to recover. */
    for (index = 0; index + bias < count; ++index) {
        total += values[index + bias];
    }
    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

5/5
adjacent_difference pass 32 lines
// glaurung: adjacent_difference @ 0x1210
int32_t adjacent_difference(const int32_t * arg0, int32_t arg1, int32_t * arg2) {
    int index;
    int local_4;
    // x86-64 prologue: save rbp
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if ((arg2 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg1) < 1)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    for (index = 0; ((long)((int)(((unsigned long)((unsigned int)(index)) + 1))) < (long)(arg1)); index++) {
        arg2[(long)(index)] = ((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(index)) + 1)))])) - arg0[(long)(index)]);
    }
    local_4 = ((unsigned int)(arg1) - 1);
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
bias_backward_pair pass 29 lines
// glaurung: bias_backward_pair @ 0x1180
int32_t bias_backward_pair(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    int local_4;
    // x86-64 prologue: save rbp
    total = 0;
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg1) < 1)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    for (index = 1; (index < arg1); index++) {
        total = ((unsigned int)(((unsigned long)((unsigned int)(arg0[(long)(index)])) - arg0[(long)((int)(((unsigned long)((unsigned int)(index)) - 1)))])) + total);
    }
    local_4 = total;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
bias_forward_sum pass 29 lines
// glaurung: bias_forward_sum @ 0x1100
int32_t bias_forward_sum(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    int local_4;
    // x86-64 prologue: save rbp
    total = 0;
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg1) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 14) | ((long)(arg1) < 14)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    for (index = 0; (index < arg1); index++) {
        total = ((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(index)) + 2)))]) + total);
    }
    local_4 = total;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
value_bias_not_index pass 29 lines
// glaurung: value_bias_not_index @ 0x12b0
int32_t value_bias_not_index(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    int local_4;
    // x86-64 prologue: save rbp
    total = 0;
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg1) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    for (index = 0; (index < arg1); index++) {
        total = ((unsigned int)(((unsigned long)((unsigned int)(arg0[(long)(index)])) + 2)) + total);
    }
    local_4 = total;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
variable_bias pass 39 lines
// glaurung: variable_bias @ 0x1330
int32_t variable_bias(const int32_t * arg0, int32_t arg1, int32_t arg2) {
    int total;
    int index;
    int local_4;
    // x86-64 prologue: save rbp
    total = 0;
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg1) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg2) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned int)(arg2) == (unsigned int)(arg1)) | (arg2 < arg1)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    for (index = 0; ((long)((int)(((unsigned long)((unsigned int)(index)) + arg2))) < (long)(arg1)); index++) {
        total = ((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(index)) + arg2)))]) + total);
    }
    local_4 = total;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

clang -O2

5/5
adjacent_difference pass 51 lines
// glaurung: adjacent_difference @ 0x1240
int32_t adjacent_difference(const int32_t * arg0, int32_t arg1, int32_t * arg2) {
    int index;
    long ret;
    long var10;
    long var19;
    int var2;
    long var3;
    long var4;
    long var7;
    ret = 0xffffffff;
    if (((unsigned long)((unsigned long)((unsigned int)((arg1 - 17)))) < (unsigned long)(0xfffffff0))) {
        return ret;
    }
    if ((arg0 == 0)) {
        return ret;
    }
    if ((arg2 == 0)) {
        return ret;
    }
    ret = 0;
    if (((unsigned long)((unsigned long)((unsigned int)(arg1))) < (unsigned long)(2))) {
        return ret;
    }
    var2 = (arg1 - 1);
    var3 = (unsigned long)((unsigned int)(var2));
    if (((unsigned long)((unsigned int)(var2)) == 1)) {
        var4 = 1;
        var7 = 0;
        if (((unsigned long)((unsigned char)((var3 & 1))) != 0)) {
            goto L_12a9;
        }
        return (unsigned int)(var3);
    }
    var10 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var3)) & -2)));
    index = 0;
    do {
        *(int *)(((long)arg2 + index * 4)) = ((unsigned long)((unsigned int)(*(int *)(((long)arg0 + index * 4 + 0x4)))) - *(int *)(((long)arg0 + index * 4)));
        *(int *)(((long)arg2 + index * 4 + 0x4)) = ((unsigned long)((unsigned int)(*(int *)(((long)arg0 + index * 4 + 0x8)))) - *(int *)(((long)arg0 + index * 4 + 0x4)));
        var19 = ((unsigned long)((unsigned int)(index)) + 2);
        index = var19;
    } while ((var10 != var19));
    var4 = (var19 + 1);
    var7 = var19;
    if (((unsigned long)((unsigned char)((var3 & 1))) == 0)) {
        return (unsigned int)(var3);
    }
    L_12a9: ;
    *(int *)(((long)arg2 + var7 * 4)) = ((unsigned long)((unsigned int)(*(int *)(((long)arg0 + var4 * 4)))) - *(int *)(((long)arg0 + var7 * 4)));
    return (unsigned int)(var3);
}
bias_backward_pair pass 76 lines
// glaurung: bias_backward_pair @ 0x1180
int32_t bias_backward_pair(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    long ret;
    long var10;
    long var11;
    long var15;
    long var16;
    long var17;
    long var18;
    long var25;
    int var29;
    long var37;
    long var38;
    long var40;
    long var41;
    long var46;
    long var5;
    long var6;
    ret = 0xffffffff;
    if ((arg0 == 0)) {
        return ret;
    }
    ret = 0xffffffff;
    if (((unsigned long)((unsigned long)((unsigned int)((arg1 - 17)))) < (unsigned long)(0xfffffff0))) {
        return ret;
    }
    ret = 0;
    if (((unsigned long)((unsigned long)((unsigned int)(arg1))) < (unsigned long)(2))) {
        return ret;
    }
    var5 = (unsigned long)((unsigned int)(*(int *)(((long)arg0))));
    var6 = ((unsigned long)((unsigned int)(arg1)) - 1);
    var10 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var6)) & 3)));
    if (((unsigned long)(3) <= (unsigned long)(((unsigned long)((unsigned int)(arg1)) - 2)))) {
        var11 = (var6 & -4);
        var15 = 0;
        var16 = 0;
        do {
            var17 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var15 * 4 + 0x4))));
            var18 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var15 * 4 + 0x8))));
            var25 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var15 * 4 + 0xc))));
            var29 = ((unsigned int)((var5 + var17)) + var18);
            var5 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var15 * 4 + 0x10))));
            total = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var16 + var17))) + var18))) + var25))) + var5))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var29)) + var25))))));
            var15 = (var15 + 4);
            var16 = (unsigned long)((unsigned int)(total));
        } while ((var11 != var15));
        var37 = (var15 + 1);
        ret = (unsigned long)((unsigned int)(total));
        if ((var10 == 0)) {
            return ret;
        }
        L_121a: ;
        var38 = (long)(((long)arg0 + (var37 * 4)));
        var40 = 0;
        do {
            var41 = (unsigned long)((unsigned int)(*(int *)((var38 + var40 * 4))));
            total = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((total + var41))) - var5)));
            var40 = (var40 + 1);
            var5 = (unsigned long)((unsigned int)(var41));
            ret = (unsigned long)((unsigned int)(total));
        } while ((var10 != var40));
    } else {
        var46 = 0;
        var37 = 1;
        total = 0;
        if ((var10 != 0)) {
            goto L_121a;
        } else {
            ret = var46;
        }
    }
    return ret;
}
bias_forward_sum pass 55 lines
// glaurung: bias_forward_sum @ 0x1100
int32_t bias_forward_sum(const int32_t * arg0, int32_t arg1) {
    int index;
    int total;
    long ret;
    long var12;
    int var19;
    long var2;
    long var20;
    long var26;
    long var28;
    long var29;
    int var30;
    long var6;
    ret = 0xffffffff;
    if ((arg0 != 0)) {
        ret = 0xffffffff;
        if (((unsigned long)(14) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
            return ret;
        }
        if (((unsigned long)((unsigned int)(arg1)) == 0)) {
            return 0;
        }
        var2 = (unsigned long)((unsigned int)(arg1));
        var6 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) & 3)));
        if (((unsigned long)(3) <= (unsigned long)(((unsigned long)((unsigned int)(arg1)) - 1)))) {
            var2 = (unsigned long)((unsigned int)((var2 & -4)));
            index = 0;
            var12 = 0;
            do {
                var19 = ((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var12 + *(int *)(((long)arg0 + index * 4 + 0x8))))) + *(int *)(((long)arg0 + index * 4 + 0xc))))) + *(int *)(((long)arg0 + index * 4 + 0x10)))) + *(int *)(((long)arg0 + index * 4 + 0x14)));
                var12 = (unsigned long)((unsigned int)(var19));
                index = (index + 4);
                ret = (unsigned long)((unsigned int)(var19));
                var20 = (unsigned long)((unsigned int)(index));
            } while ((var2 != index));
        } else {
            ret = 0;
            var20 = 0;
        }
        if ((var6 == 0)) {
            return ret;
        }
        var26 = (long)((((long)arg0 + (var20 * 4)) + 8));
        var28 = 0;
        var29 = ret;
        do {
            var30 = (var29 + *(int *)((var26 + var28 * 4)));
            var29 = (unsigned long)((unsigned int)(var30));
            var28 = (var28 + 1);
            ret = (unsigned long)((unsigned int)(var30));
        } while ((var6 != var28));
    }
    return ret;
}
value_bias_not_index pass 80 lines
// glaurung: value_bias_not_index @ 0x12c0
int32_t value_bias_not_index(const int32_t * arg0, int32_t arg1) {
    int index;
    int total;
    long ret;
    int var18;
    int var19;
    long var2;
    int var20;
    int var21;
    long var5;
    long var53;
    int var57;
    int var6;
    int var7;
    int var8;
    int var9;
    ret = 0xffffffff;
    if ((arg0 == 0)) {
        return ret;
    }
    ret = 0xffffffff;
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        return 0;
    }
    var2 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        var5 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) & -4)));
        var6 = *(int *)(((long)arg0));
        var7 = *(int *)(((long)arg0 + 0x4));
        var8 = *(int *)(((long)arg0 + 0x8));
        var9 = *(int *)(((long)arg0 + 0xc));
        if ((var5 != 4)) {
            var18 = ((var6 + *(int *)(((long)arg0 + 0x10))) + 4);
            var19 = ((var7 + *(int *)(((long)arg0 + 0x14))) + 4);
            var20 = ((var8 + *(int *)(((long)arg0 + 0x18))) + 4);
            var21 = ((var9 + *(int *)(((long)arg0 + 0x1c))) + 4);
            if (((unsigned long)((unsigned int)(var5)) != 8)) {
                var18 = ((var18 + *(int *)(((long)arg0 + 0x20))) + 2);
                var19 = ((var19 + *(int *)(((long)arg0 + 0x24))) + 2);
                var20 = ((var20 + *(int *)(((long)arg0 + 0x28))) + 2);
                var21 = ((var21 + *(int *)(((long)arg0 + 0x2c))) + 2);
                if (((unsigned long)((unsigned int)(var5)) != 12)) {
                    var6 = (var18 + *(int *)(((long)arg0 + 0x30)));
                    var7 = (var19 + *(int *)(((long)arg0 + 0x34)));
                    var8 = (var20 + *(int *)(((long)arg0 + 0x38)));
                    var9 = (var21 + *(int *)(((long)arg0 + 0x3c)));
                    L_12fa: ;
                    var18 = (var6 + 2);
                    var19 = (var7 + 2);
                    var20 = (var8 + 2);
                    var21 = (var9 + 2);
                }
            }
        } else {
            goto L_12fa;
        }
        var53 = (unsigned long)((unsigned int)(((var21 + var19) + (var20 + var18))));
        ret = var53;
        if ((var5 == var2)) {
            return ret;
        }
        L_1350: ;
        do {
            var57 = ((unsigned int)((var53 + (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var5 * 4)))))) + 2);
            var53 = (unsigned long)((unsigned int)(var57));
            index = (var5 + 1);
            var5 = (unsigned long)((unsigned int)(index));
            ret = (unsigned long)((unsigned int)(var57));
        } while ((var2 != index));
    } else {
        var53 = 0;
        var5 = 0;
        goto L_1350;
    }
    return ret;
}
variable_bias pass 182 lines
// glaurung: variable_bias @ 0x1370
int32_t variable_bias(const int32_t * arg0, int32_t arg1, int32_t arg2) {
    int total;
    int index;
    long ret;
    int var100;
    int var101;
    int var102;
    int var103;
    int var104;
    int var105;
    int var106;
    int var107;
    long var110;
    long var111;
    long var113;
    long var12;
    long var143;
    long var144;
    long var145;
    long var146;
    long var148;
    long var149;
    long var15;
    long var16;
    long var18;
    int var20;
    int var21;
    int var22;
    int var23;
    long var25;
    int var27;
    int var28;
    int var29;
    int var3;
    int var30;
    long var4;
    long var5;
    long var8;
    long var88;
    int var89;
    long var9;
    int var90;
    int var91;
    int var92;
    int var93;
    int var94;
    int var95;
    int var96;
    ret = 0xffffffff;
    if ((arg1 < arg2)) {
        return ret;
    }
    ret = 0xffffffff;
    if ((arg0 == 0)) {
        return ret;
    }
    ret = 0xffffffff;
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        return ret;
    }
    ret = 0xffffffff;
    if (((long)(arg2) < 0)) {
        return ret;
    }
    var3 = (arg1 - arg2);
    var4 = (unsigned long)((unsigned int)(var3));
    ret = 0;
    if ((((unsigned long)((unsigned long)((unsigned int)(arg1))) < (unsigned long)((unsigned long)((unsigned int)(arg2)))) | ((unsigned long)((unsigned int)(var3)) == 0))) {
        return ret;
    }
    var5 = (unsigned long)((unsigned int)(arg2));
    if (((unsigned long)(8) <= (unsigned long)((unsigned long)((unsigned int)(var3))))) {
        var8 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var4)) & -8)));
        var9 = (var8 - 8);
        var12 = (((unsigned long)(var9) >> 3) + 1);
        var15 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var12)) & 3)));
        if (((unsigned long)(24) <= (unsigned long)(var9))) {
            var16 = (var12 & -4);
            var18 = (long)((((long)arg0 + (var5 * 4)) + 112));
            var20 = 0;
            var21 = 0;
            var22 = 0;
            var23 = 0;
            var25 = 0;
            var27 = 0;
            var28 = 0;
            var29 = 0;
            var30 = 0;
            do {
                var20 = (*(int *)((var18 + var25 * 4 - 0x10)) + ((*(int *)((var18 + var25 * 4 - 0x30)) + *(int *)((var18 + var25 * 4 - 0x50))) + (*(int *)((var18 + var25 * 4 - 0x70)) + var20)));
                var21 = (*(int *)((var18 + var25 * 4 - 0xc)) + ((*(int *)((var18 + var25 * 4 - 0x2c)) + *(int *)((var18 + var25 * 4 - 0x4c))) + (*(int *)((var18 + var25 * 4 - 0x6c)) + var21)));
                var22 = (*(int *)((var18 + var25 * 4 - 0x8)) + ((*(int *)((var18 + var25 * 4 - 0x28)) + *(int *)((var18 + var25 * 4 - 0x48))) + (*(int *)((var18 + var25 * 4 - 0x68)) + var22)));
                var23 = (*(int *)((var18 + var25 * 4 - 0x4)) + ((*(int *)((var18 + var25 * 4 - 0x24)) + *(int *)((var18 + var25 * 4 - 0x44))) + (*(int *)((var18 + var25 * 4 - 0x64)) + var23)));
                ret = ((unsigned long)((unsigned int)(var21)) | (unsigned long)((unsigned int)(var20)));
                var27 = (*(int *)((var18 + var25 * 4)) + ((*(int *)((var18 + var25 * 4 - 0x20)) + *(int *)((var18 + var25 * 4 - 0x40))) + (*(int *)((var18 + var25 * 4 - 0x60)) + var27)));
                var28 = (*(int *)((var18 + var25 * 4 + 0x4)) + ((*(int *)((var18 + var25 * 4 - 0x1c)) + *(int *)((var18 + var25 * 4 - 0x3c))) + (*(int *)((var18 + var25 * 4 - 0x5c)) + var28)));
                var29 = (*(int *)((var18 + var25 * 4 + 0x8)) + ((*(int *)((var18 + var25 * 4 - 0x18)) + *(int *)((var18 + var25 * 4 - 0x38))) + (*(int *)((var18 + var25 * 4 - 0x58)) + var29)));
                var30 = (*(int *)((var18 + var25 * 4 + 0xc)) + ((*(int *)((var18 + var25 * 4 - 0x14)) + *(int *)((var18 + var25 * 4 - 0x34))) + (*(int *)((var18 + var25 * 4 - 0x54)) + var30)));
                var25 = (var25 + 32);
                var16 = (var16 - 4);
                var88 = var25;
                var89 = var20;
                var90 = var21;
                var91 = var22;
                var92 = var23;
                var93 = var27;
                var94 = var28;
                var95 = var29;
                var96 = var30;
            } while ((var16 != 0));
        } else {
            var89 = 0;
            var90 = 0;
            var91 = 0;
            var92 = 0;
            var88 = 0;
            var93 = 0;
            var94 = 0;
            var95 = 0;
            var96 = 0;
            var18 = (unsigned long)((unsigned int)(arg2));
        }
        var100 = var89;
        var101 = var90;
        var102 = var91;
        var103 = var92;
        var104 = var93;
        var105 = var94;
        var106 = var95;
        var107 = var96;
        if ((var15 != 0)) {
            var110 = (long)((((long)arg0 + ((var88 + var5) * 4)) + 16));
            var111 = (var15 << 5);
            var113 = 0;
            do {
                var89 = (var89 + *(int *)((var110 + var113 - 0x10)));
                var90 = (var90 + *(int *)((var110 + var113 - 0xc)));
                var91 = (var91 + *(int *)((var110 + var113 - 0x8)));
                var92 = (var92 + *(int *)((var110 + var113 - 0x4)));
                ret = ((unsigned long)((unsigned int)(var90)) | (unsigned long)((unsigned int)(var89)));
                var93 = (var93 + *(int *)((var110 + var113)));
                var94 = (var94 + *(int *)((var110 + var113 + 0x4)));
                var95 = (var95 + *(int *)((var110 + var113 + 0x8)));
                var96 = (var96 + *(int *)((var110 + var113 + 0xc)));
                var113 = (var113 + 32);
                var100 = var89;
                var101 = var90;
                var102 = var91;
                var103 = var92;
                var104 = var93;
                var105 = var94;
                var106 = var95;
                var107 = var96;
            } while ((var111 != var113));
        }
        var143 = (unsigned long)((unsigned int)((((var103 + var107) + (var101 + var105)) + ((var102 + var106) + (var100 + var104)))));
        ret = var143;
        if ((var8 == var4)) {
            return ret;
        }
        var5 = (var5 + var8);
        var144 = var143;
        L_14ae: ;
        var145 = (var4 - var8);
        var146 = (long)(((long)arg0 + (var5 * 4)));
        var148 = 0;
        var149 = var144;
        do {
            total = (var149 + *(int *)((var146 + var148 * 4)));
            var149 = (unsigned long)((unsigned int)(total));
            var148 = (var148 + 1);
            ret = (unsigned long)((unsigned int)(total));
        } while ((var145 != var148));
    } else {
        var8 = 0;
        var144 = 0;
        var18 = (unsigned long)((unsigned int)(arg2));
        goto L_14ae;
    }
    return ret;
}

gcc -O0

5/5
adjacent_difference pass 33 lines
// glaurung: adjacent_difference @ 0x11dc
int32_t adjacent_difference(const int32_t * arg0, int32_t arg1, int32_t * arg2) {
    int index;
    int var1;
    // x86-64 prologue: save rbp
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((arg2 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((((unsigned long)((unsigned int)(arg1)) == 0) | ((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 (1) {
        var1 = ((unsigned int)(index) + 1);
        if (((((unsigned int)(arg1) == (unsigned int)(var1)) | (arg1 < var1)) != 0)) {
            break;
        }
        arg2[(long)(index)] = ((unsigned long)((unsigned int)(arg0[((long)(index) + 1)])) - (unsigned long)((unsigned int)(arg0[(long)(index)])));
        index = (index + 1);
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(((unsigned long)((unsigned int)(arg1)) - 1));
}
bias_backward_pair pass 24 lines
// glaurung: bias_backward_pair @ 0x1160
int32_t bias_backward_pair(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    // x86-64 prologue: save rbp
    total = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((((unsigned long)((unsigned int)(arg1)) == 0) | ((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;
    }
    for (index = 1; (index < arg1); index++) {
        total = (total + (unsigned int)(((unsigned long)((unsigned int)(arg0[(long)(index)])) - (unsigned long)((unsigned int)(*(int *)(((long)arg0 + (((long)(index) << 2) - 4))))))));
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(total);
}
bias_forward_sum pass 24 lines
// glaurung: bias_forward_sum @ 0x10f9
int32_t bias_forward_sum(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    // 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)) == 14) | ((long)(arg1) < 14)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    for (index = 0; (index < arg1); index++) {
        total = (total + (unsigned int)(arg0[((long)(index) + 2)]));
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(total);
}
value_bias_not_index pass 24 lines
// glaurung: value_bias_not_index @ 0x1278
int32_t value_bias_not_index(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    // 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;
    }
    for (index = 0; (index < arg1); index++) {
        total = (total + (unsigned int)(((unsigned long)((unsigned int)(arg0[(long)(index)])) + 2)));
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(total);
}
variable_bias pass 39 lines
// glaurung: variable_bias @ 0x12de
int32_t variable_bias(const int32_t * arg0, int32_t arg1, int32_t arg2) {
    int total;
    int index;
    int var3;
    // 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;
    }
    if (((long)(arg2) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((((unsigned int)(arg2) == (unsigned int)(arg1)) | (arg2 < arg1)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    index = 0;
    while (1) {
        var3 = ((unsigned int)(arg2) + (unsigned int)(index));
        if (((((unsigned int)(arg1) == (unsigned int)(var3)) | (arg1 < var3)) != 0)) {
            break;
        }
        total = (total + (unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(arg2)) + (unsigned long)((unsigned int)(index)))))]));
        index = (index + 1);
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(total);
}

gcc -O2

5/5
adjacent_difference pass 27 lines
// glaurung: adjacent_difference @ 0x1190
int32_t adjacent_difference(const int32_t * arg0, int32_t arg1, int32_t * arg2) {
    int index;
    long ret;
    long var0;
    long zf_9;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    if ((arg2 == 0)) {
        return 0xffffffff;
    }
    ret = (unsigned long)((unsigned int)((arg1 - 1)));
    if (((unsigned long)(15) < (unsigned long)((unsigned long)((unsigned int)(ret))))) {
        return 0xffffffff;
    }
    if (((unsigned long)((unsigned int)(arg1)) != 1)) {
        var0 = (unsigned long)((unsigned int)((arg1 - 2)));
        index = 0;
        do {
            *(int *)(((long)arg2 + index * 4)) = ((unsigned long)((unsigned int)(*(int *)(((long)arg0 + index * 4 + 0x4)))) - *(int *)(((long)arg0 + index * 4)));
            zf_9 = (index == var0);
            index = (index + 1);
        } while ((zf_9 == 0));
    }
    return ret;
}
bias_backward_pair pass 26 lines
// glaurung: bias_backward_pair @ 0x1150
int32_t bias_backward_pair(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    long ret;
    long var3;
    long var6;
    if (((unsigned long)(15) < (unsigned long)((unsigned long)((unsigned int)((arg1 - 1)))))) {
        return 0xffffffff;
    }
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    if (((unsigned long)((unsigned int)(arg1)) == 1)) {
        return 0;
    }
    var3 = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg1 - 2))) * 4)) + 4));
    ret = 0;
    var6 = (long)arg0;
    do {
        total = (ret + *(int *)((var6 + 0x4)));
        var6 = (var6 + 4);
        ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(total)) - *(int *)((var6 - 0x4)))));
    } while ((var3 != var6));
    return ret;
}
bias_forward_sum pass 30 lines
// glaurung: bias_forward_sum @ 0x1100
int32_t bias_forward_sum(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    long var1;
    long var5;
    long var8;
    long var9;
    if ((arg0 == 0)) {
        var1 = 0xffffffff;
        return 0xffffffff;
    }
    if (((unsigned long)(14) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        var1 = 0xffffffff;
        return 0xffffffff;
    }
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        return 0;
    }
    var5 = (long)((arg0 + 2));
    var8 = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg1 - 1))) * 4)) + 12));
    var9 = 0;
    do {
        total = (var9 + *(int *)((var5)));
        var9 = (unsigned long)((unsigned int)(total));
        var5 = (var5 + 4);
        var1 = (unsigned long)((unsigned int)(total));
    } while ((var5 != var8));
    return (unsigned int)(var1);
}
value_bias_not_index pass 26 lines
// glaurung: value_bias_not_index @ 0x11e0
int32_t value_bias_not_index(const int32_t * arg0, int32_t arg1) {
    int total;
    int index;
    long var2;
    long var5;
    long var6;
    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;
    var5 = (long)arg0;
    do {
        var6 = (unsigned long)((unsigned int)(*(int *)((var5))));
        var5 = (var5 + 4);
        total = (unsigned long)((unsigned int)(((total + var6) + 2)));
    } while ((var5 != var2));
    return total;
}
variable_bias pass 42 lines
// glaurung: variable_bias @ 0x1220
int32_t variable_bias(const int32_t * arg0, int32_t arg1, int32_t arg2) {
    int total;
    int index;
    long of_5;
    long sf_5;
    long t168;
    long var1;
    long var18;
    long var20;
    long var21;
    long zf_5;
    if ((arg0 == 0)) {
        var1 = 0xffffffff;
        return 0xffffffff;
    }
    if (((unsigned long)((unsigned char)((((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1)))) | ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) >> 31))) & 255)))) != 0)) {
        var1 = 0xffffffff;
        return 0xffffffff;
    }
    t168 = ((unsigned long)((unsigned int)(arg1)) - (unsigned long)((unsigned int)(arg2)));
    zf_5 = ((unsigned int)(arg1) == (unsigned int)(arg2));
    sf_5 = ((long)((int)(t168)) < 0);
    of_5 = ((arg1 < arg2) ^ ((long)((int)(t168)) < 0));
    if ((arg1 < arg2)) {
        var1 = 0xffffffff;
        return 0xffffffff;
    }
    if ((zf_5 | (sf_5 ^ of_5))) {
        return 0;
    }
    var18 = (long)(((long)arg0 + ((long)(arg2) * 4)));
    var20 = (long)((((long)arg0 + (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((arg1 - arg2))) - 1))) + (long)(arg2)) * 4)) + 4));
    var21 = 0;
    do {
        total = (var21 + *(int *)((var18)));
        var21 = (unsigned long)((unsigned int)(total));
        var18 = (var18 + 4);
        var1 = (unsigned long)((unsigned int)(total));
    } while ((var18 != var20));
    return (unsigned int)(var1);
}

← 213 fixtures