Fixture 29

polynomial

C · 2 functions · 4 lanes · 8 of 8 function-lanes behave identically

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

tests/decompiler_fixtures/src/29_polynomial.c source
#include <stdint.h>

__attribute__((noinline)) uint32_t
polynomial_eval_mod32(const uint32_t *coefficients, int32_t count, uint32_t x) {
    uint32_t result = 0;
    int32_t i;
    if (coefficients == 0 || count < 0 || count > 16) {
        return 0;
    }
    for (i = count - 1; i >= 0; --i) {
        result = result * x + coefficients[i];
    }
    return result;
}

__attribute__((noinline)) uint32_t
polynomial_derivative_mod32(const uint32_t *coefficients, int32_t count,
                            uint32_t x) {
    uint32_t result = 0;
    int32_t i;
    if (coefficients == 0 || count < 0 || count > 16) {
        return 0;
    }
    for (i = count - 1; i > 0; --i) {
        result = result * x + coefficients[i] * (uint32_t)i;
    }
    return result;
}

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

2/2
polynomial_derivative_mod32 pass 28 lines
// glaurung: polynomial_derivative_mod32 @ 0x1190
uint32_t polynomial_derivative_mod32(const uint32_t * arg0, int32_t arg1, uint32_t arg2) {
    unsigned int result;
    int i;
    int local_4;
    // x86-64 prologue: save rbp
    result = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((long)(arg1) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    i = ((unsigned int)(arg1) - 1);
    while (((((unsigned long)((unsigned int)(i)) == 0) | ((long)(i) < 0)) == 0)) {
        result = ((unsigned int)((result * arg2)) + (unsigned int)(((unsigned long)((unsigned int)(arg0[(long)(i)])) * i)));
        i = ((unsigned int)(i) - 1);
    }
    local_4 = result;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
polynomial_eval_mod32 pass 28 lines
// glaurung: polynomial_eval_mod32 @ 0x1100
uint32_t polynomial_eval_mod32(const uint32_t * arg0, int32_t arg1, uint32_t arg2) {
    unsigned int result;
    int i;
    int local_4;
    // x86-64 prologue: save rbp
    result = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((long)(arg1) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    i = ((unsigned int)(arg1) - 1);
    while ((0 <= (long)(i))) {
        result = ((unsigned int)((result * arg2)) + arg0[(long)(i)]);
        i = ((unsigned int)(i) - 1);
    }
    local_4 = result;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

clang -O2

2/2
polynomial_derivative_mod32 pass 28 lines
// glaurung: polynomial_derivative_mod32 @ 0x1140
uint32_t polynomial_derivative_mod32(const uint32_t * arg0, int32_t arg1, uint32_t arg2) {
    unsigned int result;
    long ret;
    int var14;
    int var15;
    long var3;
    long var5;
    ret = 0;
    if (((unsigned long)((unsigned long)((unsigned int)((arg1 - 2)))) <= (unsigned long)(14))) {
        ret = 0;
        if ((arg0 == 0)) {
            return ret;
        }
        var3 = (unsigned long)((unsigned int)((arg1 + 1)));
        var5 = (unsigned long)((unsigned int)((arg1 - 1)));
        result = 0;
        do {
            var14 = ((unsigned int)((result * arg2)) + (unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + var5 * 4)))) * var5)));
            ret = (unsigned long)((unsigned int)(var14));
            var15 = (var3 - 1);
            var3 = (unsigned long)((unsigned int)(var15));
            var5 = (var5 - 1);
            result = (unsigned long)((unsigned int)(var14));
        } while (((((unsigned long)((unsigned int)(var15)) == 2) | ((long)((int)(var15)) < 2)) == 0));
    }
    return ret;
}
polynomial_eval_mod32 pass 30 lines
// glaurung: polynomial_eval_mod32 @ 0x1100
uint32_t polynomial_eval_mod32(const uint32_t * arg0, int32_t arg1, uint32_t arg2) {
    unsigned int result;
    long ret;
    long var0;
    int var12;
    int var13;
    long var4;
    long var6;
    var0 = (unsigned long)((unsigned int)((arg1 - 1)));
    ret = 0;
    if (((unsigned long)((unsigned long)((unsigned int)(var0))) <= (unsigned long)(15))) {
        ret = 0;
        if ((arg0 == 0)) {
            return ret;
        }
        var4 = (unsigned long)((unsigned int)((arg1 + 1)));
        var6 = (long)(((long)arg0 + ((unsigned long)((unsigned int)(var0)) * 4)));
        result = 0;
        do {
            var12 = ((unsigned int)((result * arg2)) + *(int *)((var6)));
            ret = (unsigned long)((unsigned int)(var12));
            var13 = (var4 - 1);
            var4 = (unsigned long)((unsigned int)(var13));
            var6 = (var6 - 4);
            result = (unsigned long)((unsigned int)(var12));
        } while (((((unsigned long)((unsigned int)(var13)) == 1) | ((long)((int)(var13)) < 1)) == 0));
    }
    return ret;
}

gcc -O0

2/2
polynomial_derivative_mod32 pass 26 lines
// glaurung: polynomial_derivative_mod32 @ 0x116a
uint32_t polynomial_derivative_mod32(const uint32_t * arg0, int32_t arg1, uint32_t arg2) {
    unsigned int result;
    int i;
    // x86-64 prologue: save rbp
    result = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((long)(arg1) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    i = ((unsigned int)(arg1) - 1);
    while (((((unsigned long)((unsigned int)(i)) == 0) | ((long)(i) < 0)) == 0)) {
        result = ((unsigned int)(((unsigned long)((unsigned int)(i)) * (unsigned long)((unsigned int)(arg0[(long)(i)])))) + (unsigned int)((result * arg2)));
        i = (i - 1);
    }
    // x86-64 epilogue: restore rbp
    return result;
}
polynomial_eval_mod32 pass 26 lines
// glaurung: polynomial_eval_mod32 @ 0x10f9
uint32_t polynomial_eval_mod32(const uint32_t * arg0, int32_t arg1, uint32_t arg2) {
    unsigned int result;
    int i;
    // x86-64 prologue: save rbp
    result = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((long)(arg1) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0;
    }
    i = ((unsigned int)(arg1) - 1);
    while ((0 <= (long)(i))) {
        result = ((unsigned int)(arg0[(long)(i)]) + (unsigned int)((result * arg2)));
        i = (i - 1);
    }
    // x86-64 epilogue: restore rbp
    return result;
}

gcc -O2

2/2
polynomial_derivative_mod32 pass 24 lines
// glaurung: polynomial_derivative_mod32 @ 0x1130
uint32_t polynomial_derivative_mod32(const uint32_t * arg0, int32_t arg1, uint32_t arg2) {
    unsigned int result;
    int i;
    long var11;
    int var12;
    long var5;
    result = 0;
    if ((arg0 != 0)) {
        if (((unsigned long)(14) < (unsigned long)((unsigned long)((unsigned int)((arg1 - 2)))))) {
            return result;
        }
        var5 = 0;
        i = (long)((int)((arg1 - 1)));
        do {
            var11 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + i * 4)))) * i)));
            i = (i - 1);
            var12 = ((unsigned int)((var5 * arg2)) + var11);
            result = (unsigned long)((unsigned int)(var12));
            var5 = (unsigned long)((unsigned int)(var12));
        } while (((((unsigned long)((unsigned int)(i)) == 0) | ((long)(i) < 0)) == 0));
    }
    return result;
}
polynomial_eval_mod32 pass 26 lines
// glaurung: polynomial_eval_mod32 @ 0x1100
uint32_t polynomial_eval_mod32(const uint32_t * arg0, int32_t arg1, uint32_t arg2) {
    unsigned int result;
    int i;
    long var3;
    long var4;
    int var7;
    long var8;
    result = 0;
    if ((arg0 != 0)) {
        i = (unsigned long)((unsigned int)((arg1 - 1)));
        if (((unsigned long)(15) < (unsigned long)((unsigned long)((unsigned int)(i))))) {
            return result;
        }
        var3 = (long)(i);
        var4 = 0;
        do {
            var7 = ((unsigned int)((var4 * arg2)) + *(int *)(((long)arg0 + var3 * 4)));
            result = (unsigned long)((unsigned int)(var7));
            var8 = (var3 - 1);
            var4 = (unsigned long)((unsigned int)(var7));
            var3 = var8;
        } while (((unsigned long)((unsigned int)(var8)) != 0xffffffff));
    }
    return result;
}

← 213 fixtures