Fixture 56

sieve

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

One lane has a function that returns a different result after decompilation: clang-O2 (1/2).

Sieve of Eratosthenes into a caller-owned flag array plus trial-division factorisation. The sieve's inner loop starts at p*p and strides by p, a classic non-unit-stride induction variable.

tests/decompiler_fixtures/src/56_sieve.c source
#include <stdint.h>

/* Sieve of Eratosthenes into a caller-owned flag array plus trial-division
 * factorisation.  The sieve's inner loop starts at p*p and strides by p, a
 * classic non-unit-stride induction variable. */

#define SIEVE_MAX 64
#define FACTOR_MAX 8

__attribute__((noinline)) int32_t
sieve_primes(uint8_t *flags, int32_t limit) {
    int32_t candidate;
    int32_t multiple;
    int32_t count = 0;
    if (flags == 0 || limit < 0 || limit > SIEVE_MAX) {
        return -1;
    }
    for (candidate = 0; candidate < limit; ++candidate) {
        flags[candidate] = 1;
    }
    if (limit > 0) {
        flags[0] = 0;
    }
    if (limit > 1) {
        flags[1] = 0;
    }
    for (candidate = 2; candidate * candidate < limit; ++candidate) {
        if (flags[candidate]) {
            for (multiple = candidate * candidate; multiple < limit;
                 multiple += candidate) {
                flags[multiple] = 0;
            }
        }
    }
    for (candidate = 0; candidate < limit; ++candidate) {
        if (flags[candidate]) {
            count += 1;
        }
    }
    return count;
}

__attribute__((noinline)) int32_t
factorize(int32_t value, int32_t *factors, int32_t capacity) {
    int32_t divisor = 2;
    int32_t produced = 0;
    if (factors == 0 || value < 2 || value > 1000000 || capacity < 1 ||
        capacity > FACTOR_MAX) {
        return -1;
    }
    while (divisor * divisor <= value && produced < capacity) {
        while ((value % divisor) == 0 && produced < capacity) {
            factors[produced] = divisor;
            produced += 1;
            value /= divisor;
        }
        divisor += 1;
    }
    if (value > 1 && produced < capacity) {
        factors[produced] = value;
        produced += 1;
    }
    return produced;
}

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 -O2

1/2
factorize pass 97 lines
// glaurung: factorize @ 0x1340
int32_t factorize(int32_t arg0, int32_t * arg1, int32_t arg2) {
    int produced;
    int divisor;
    long of_17;
    long sf_17;
    long var0;
    long var18;
    long var19;
    long var2;
    long var20;
    int var23;
    int var28;
    int var30;
    long var33;
    long var35;
    long var36;
    long var4;
    long var7;
    long var8;
    var0 = (unsigned long)((unsigned int)(arg0));
    var2 = 0xffffffff;
    produced = 0xffffffff;
    if (((unsigned long)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) - 0xf4241)))) < (unsigned long)(0xfff0bdc1))) {
        goto L_13f7;
    }
    produced = var2;
    if ((arg1 == 0)) {
        goto L_13f7;
    }
    var4 = (unsigned long)((unsigned int)(arg2));
    produced = var2;
    if (((unsigned long)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) - 9)))) < (unsigned long)(0xfffffff8))) {
        goto L_13f7;
    }
    var7 = 0;
    if (((unsigned long)((unsigned long)((unsigned int)(var0))) < (unsigned long)(4))) {
        goto L_13fa;
    }
    var8 = (unsigned long)((unsigned int)(var4));
    produced = 0;
    divisor = 2;
    L_1390: ;
    if (((unsigned long)((unsigned int)(((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(var0))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(var0)))) % (int)(divisor))))) == 0)) {
        if (((long)(produced) < (long)((int)(var4)))) {
            var18 = var0;
            var19 = (unsigned long)((unsigned int)(produced));
            var20 = ((long)(produced) + 1);
            do {
                *(int *)(((long)arg1 + var20 * 4 - 0x4)) = divisor;
                var23 = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(var18))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(var18)))) / (int)(divisor)));
                var18 = (unsigned long)((unsigned int)(var23));
                var28 = (var19 + 1);
                var19 = (unsigned long)((unsigned int)(var28));
                var0 = (unsigned long)((unsigned int)(var23));
                produced = (unsigned long)((unsigned int)(var28));
                if (((unsigned long)((unsigned int)(((int)((((long long)(int)((((unsigned long)((long)((int)(var23))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)(var23)) % (int)(divisor))))) != 0)) {
                    break;
                }
                sf_17 = ((var20 - var8) < 0);
                of_17 = ((var20 < var8) ^ ((var20 - var8) < 0));
                var20 = (var20 + 1);
                var0 = var18;
                produced = var19;
            } while ((sf_17 ^ of_17));
        }
    }
    var30 = (divisor + 1);
    divisor = (unsigned long)((unsigned int)(var30));
    var33 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var30)) * (unsigned long)((unsigned int)(var30)))));
    if (((((unsigned int)(var33) == (unsigned int)(var0)) | ((long)((int)(var33)) < (long)((int)(var0)))) != 0)) {
        if (((long)(produced) < (long)((int)(var4)))) {
            goto L_1390;
        }
    }
    var35 = ((long)((int)(var4)) <= (long)(produced));
    var36 = (unsigned long)((unsigned int)(produced));
    if ((2 <= (long)((int)(var0)))) {
        goto L_1402;
    }
    L_13f7: ;
    return (unsigned int)(produced);
    L_13fa: ;
    var35 = 0;
    produced = var7;
    var36 = var7;
    if (((long)((int)(var0)) < 2)) {
        goto L_13f7;
    }
    L_1402: ;
    produced = var36;
    if (((unsigned long)((unsigned char)((var35 & 255))) != 0)) {
        goto L_13f7;
    }
    arg1[(long)((int)(var36))] = var0;
    return (unsigned int)(((long)((int)(var36)) + 1));
}
sieve_primes fail 219 lines
// glaurung: sieve_primes @ 0x1110
int32_t sieve_primes(uint8_t * arg0, int32_t arg1) {
    extern long __unknown(long, ...);
    extern void * memset(void *, int, __SIZE_TYPE__);
    int candidate;
    int multiple;
    int count;
    long var0;
    long var1;
    int var130;
    int var131;
    long var14;
    int var151;
    int var152;
    int var164;
    int var165;
    int var166;
    int var167;
    int var168;
    int var169;
    long var17;
    int var170;
    int var171;
    int var197;
    int var198;
    long var2;
    int var221;
    int var222;
    long var23;
    long var24;
    int var249;
    long var257;
    long var27;
    long var30;
    long var32;
    long var4;
    int var44;
    int var45;
    int var46;
    int var47;
    int var49;
    long var5;
    int var50;
    int var51;
    int var52;
    int var54;
    int var55;
    int var56;
    int var57;
    long var6;
    int var74;
    int var75;
    void * var9;
    int var98;
    int var99;
    // x86-64 prologue: save callee registers, frame 40 bytes
    var0 = 0xffffffff;
    var1 = 0xffffffff;
    if ((arg0 == 0)) {
        goto L_1311;
    }
    var2 = (unsigned long)((unsigned int)(arg1));
    var1 = var0;
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        goto L_1311;
    }
    var4 = 0;
    var1 = 0;
    if (((unsigned long)((unsigned int)(var2)) == 0)) {
        goto L_1311;
    }
    var5 = (long)arg0;
    var6 = (unsigned long)((unsigned int)(var2));
    var9 = ((void * (*)(void))memset)();
    *(signed char *)((var5)) = 0;
    if (((unsigned long)((unsigned int)(var2)) == 1)) {
        goto L_11a6;
    }
    *(signed char *)((var5 + 0x1)) = 0;
    if (((unsigned long)((unsigned long)((unsigned int)(var2))) < (unsigned long)(5))) {
        goto L_11a6;
    }
    candidate = 2;
    var14 = 4;
    goto L_117d;
    L_1170: ;
    candidate = (candidate + 1);
    var17 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(candidate)) * candidate)));
    var14 = var17;
    if (((long)((int)(var2)) <= (long)((int)(var17)))) {
        goto L_119e;
    }
    L_117d: ;
    if (((unsigned long)((unsigned char)(*(char *)((var5 + candidate)))) == 0)) {
        goto L_1170;
    }
    if (((long)((int)(var2)) <= (long)((int)(var14)))) {
        goto L_1170;
    }
    multiple = (unsigned long)((unsigned int)(var14));
    do {
        *(signed char *)((var5 + multiple)) = 0;
        multiple = (multiple + candidate);
    } while (((long)(multiple) < (long)((int)(var2))));
    goto L_1170;
    L_119e: ;
    var1 = var4;
    if (((unsigned long)((unsigned int)(var2)) == 0)) {
        goto L_1311;
    }
    L_11a6: ;
    if (((unsigned long)((unsigned long)((unsigned int)(var2))) < (unsigned long)(8))) {
        var23 = 0;
        var24 = 0;
        goto L_1300;
    }
    var23 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var6)) & -8)));
    var27 = (var23 - 8);
    var30 = (((unsigned long)(var27) >> 3) + 1);
    if ((var27 == 0)) {
        goto L_131e;
    }
    var32 = (var30 & -2);
    var44 = 1;
    var45 = 1;
    var46 = 1;
    var47 = 1;
    var49 = 0;
    var50 = 0;
    var51 = 0;
    var52 = 0;
    var54 = 0;
    var55 = 0;
    var56 = 0;
    var57 = 0;
    do {
        var74 = __unknown(0);
        var75 = __unknown(0);
        var98 = __unknown(0);
        var99 = __unknown(0);
        var130 = __unknown(0);
        var131 = __unknown(0);
        var49 = ((((unsigned int)((unsigned short)(var130)) | ((unsigned int)((unsigned short)(var130)) << 16)) & var44) + ((((unsigned int)((unsigned short)(var74)) | ((unsigned int)((unsigned short)(var74)) << 16)) & var44) + var49));
        var50 = ((((unsigned int)((unsigned short)((((unsigned int)(var130) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var130) >> 16) & 0xffff))) << 16)) & var45) + ((((unsigned int)((unsigned short)((((unsigned int)(var74) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var74) >> 16) & 0xffff))) << 16)) & var45) + var50));
        var51 = ((((unsigned int)((unsigned short)(var131)) | ((unsigned int)((unsigned short)(var131)) << 16)) & var46) + ((((unsigned int)((unsigned short)(var75)) | ((unsigned int)((unsigned short)(var75)) << 16)) & var46) + var51));
        var52 = ((((unsigned int)((unsigned short)((((unsigned int)(var131) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var131) >> 16) & 0xffff))) << 16)) & var47) + ((((unsigned int)((unsigned short)((((unsigned int)(var75) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var75) >> 16) & 0xffff))) << 16)) & var47) + var52));
        var151 = __unknown(0);
        var152 = __unknown(0);
        var54 = ((((unsigned int)((unsigned short)(var151)) | ((unsigned int)((unsigned short)(var151)) << 16)) & var44) + ((((unsigned int)((unsigned short)(var98)) | ((unsigned int)((unsigned short)(var98)) << 16)) & var44) + var54));
        var55 = ((((unsigned int)((unsigned short)((((unsigned int)(var151) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var151) >> 16) & 0xffff))) << 16)) & var45) + ((((unsigned int)((unsigned short)((((unsigned int)(var98) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var98) >> 16) & 0xffff))) << 16)) & var45) + var55));
        var56 = ((((unsigned int)((unsigned short)(var152)) | ((unsigned int)((unsigned short)(var152)) << 16)) & var46) + ((((unsigned int)((unsigned short)(var99)) | ((unsigned int)((unsigned short)(var99)) << 16)) & var46) + var56));
        var57 = ((((unsigned int)((unsigned short)((((unsigned int)(var152) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var152) >> 16) & 0xffff))) << 16)) & var47) + ((((unsigned int)((unsigned short)((((unsigned int)(var99) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var99) >> 16) & 0xffff))) << 16)) & var47) + var57));
        var32 = (var32 - 2);
    } while ((var32 != 0));
    var164 = var49;
    var165 = var50;
    var166 = var51;
    var167 = var52;
    var168 = var54;
    var169 = var55;
    var170 = var56;
    var171 = var57;
    if (((unsigned long)((unsigned char)((var30 & 1))) == 0)) {
        goto L_12db;
    }
    L_128e: ;
    var197 = __unknown(0);
    var198 = __unknown(0);
    var164 = (var49 + (((unsigned int)((unsigned short)(var197)) | ((unsigned int)((unsigned short)(var197)) << 16)) & 1));
    var165 = (var50 + (((unsigned int)((unsigned short)((((unsigned int)(var197) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var197) >> 16) & 0xffff))) << 16)) & 1));
    var166 = (var51 + (((unsigned int)((unsigned short)(var198)) | ((unsigned int)((unsigned short)(var198)) << 16)) & 1));
    var167 = (var52 + (((unsigned int)((unsigned short)((((unsigned int)(var198) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var198) >> 16) & 0xffff))) << 16)) & 1));
    var221 = __unknown(0);
    var222 = __unknown(0);
    var168 = (var54 + (((unsigned int)((unsigned short)(var221)) | ((unsigned int)((unsigned short)(var221)) << 16)) & 1));
    var169 = (var55 + (((unsigned int)((unsigned short)((((unsigned int)(var221) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var221) >> 16) & 0xffff))) << 16)) & 1));
    var170 = (var56 + (((unsigned int)((unsigned short)(var222)) | ((unsigned int)((unsigned short)(var222)) << 16)) & 1));
    var171 = (var57 + (((unsigned int)((unsigned short)((((unsigned int)(var222) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var222) >> 16) & 0xffff))) << 16)) & 1));
    L_12db: ;
    var249 = (((var167 + var171) + (var165 + var169)) + ((var166 + var170) + (var164 + var168)));
    var24 = (unsigned long)((unsigned int)(var249));
    var1 = (unsigned long)((unsigned int)(var249));
    if ((var23 == var6)) {
        goto L_1311;
    }
    L_1300: ;
    count = (unsigned int)(((unsigned int)((var24 + 1)) - ((unsigned long)((unsigned long)((unsigned char)(*(char *)((var5 + var23))))) < (unsigned long)(1))));
    var257 = (var23 + 1);
    var23 = var257;
    var24 = (unsigned long)((unsigned int)(count));
    var1 = (unsigned long)((unsigned int)(count));
    if ((var6 != var257)) {
        goto L_1300;
    }
    L_1311: ;
    // x86-64 epilogue: restore callee registers
    return (unsigned int)(var1);
    L_131e: ;
    var49 = 0;
    var50 = 0;
    var51 = 0;
    var52 = 0;
    var54 = 0;
    var55 = 0;
    var56 = 0;
    var57 = 0;
    if (((unsigned long)((unsigned char)((var30 & 1))) != 0)) {
        goto L_128e;
    }
    var164 = var49;
    var165 = var50;
    var166 = var51;
    var167 = var52;
    var168 = var54;
    var169 = var55;
    var170 = var56;
    var171 = var57;
    goto L_12db;
}

clang -O0

2/2
factorize pass 60 lines
// glaurung: factorize @ 0x1250
int32_t factorize(int32_t arg0, int32_t * arg1, int32_t arg2) {
    int divisor;
    int produced;
    signed char local_1d;
    signed char local_1e;
    int local_4;
    long var3;
    divisor = 2;
    produced = 0;
    if ((arg1 != 0)) {
        if ((2 <= (long)(arg0))) {
            if (((((unsigned long)((unsigned int)(arg0)) == 0xf4240) | ((long)(arg0) < 0xf4240)) != 0)) {
                if ((1 <= (long)(arg2))) {
                    if ((((unsigned long)((unsigned int)(arg2)) == 8) | ((long)(arg2) < 8))) {
                        goto L_12ae;
                    }
                }
            }
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_12ae: ;
    goto L_12b3;
    L_12b3: ;
    var3 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(divisor)) * divisor)));
    local_1d = 0;
    if (((((unsigned int)(var3) == (unsigned int)(arg0)) | ((long)((int)(var3)) < (long)(arg0))) != 0)) {
        local_1d = (produced < arg2);
    }
    if (((unsigned long)((unsigned char)((local_1d & 1))) == 0)) {
        goto L_1350;
    }
    goto L_12e9;
    L_12e9: ;
    local_1e = 0;
    if (((unsigned long)((unsigned int)(((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(arg0))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(arg0)))) % (int)(divisor))))) == 0)) {
        local_1e = (produced < arg2);
    }
    if (((unsigned long)((unsigned char)((local_1e & 1))) != 0)) {
        arg1[(long)(produced)] = divisor;
        produced = ((unsigned int)(produced) + 1);
        arg0 = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(arg0))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(arg0)))) / (int)((unsigned long)((unsigned int)(divisor)))));
        goto L_12e9;
    }
    divisor = ((unsigned int)(divisor) + 1);
    goto L_12b3;
    L_1350: ;
    if (((((unsigned long)((unsigned int)(arg0)) == 1) | ((long)(arg0) < 1)) == 0)) {
        if ((produced < arg2)) {
            arg1[(long)(produced)] = arg0;
            produced = ((unsigned int)(produced) + 1);
        }
    }
    local_4 = produced;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
sieve_primes pass 52 lines
// glaurung: sieve_primes @ 0x1100
int32_t sieve_primes(uint8_t * arg0, int32_t arg1) {
    int count;
    int candidate;
    int multiple;
    int local_4;
    // x86-64 prologue: save rbp
    count = 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)) == 64) | ((long)(arg1) < 64)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    for (candidate = 0; (candidate < arg1); candidate++) {
        arg0[candidate] = 1;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0)) == 0)) {
        *(signed char *)((long)arg0) = 0;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 1) | ((long)(arg1) < 1)) == 0)) {
        *(signed char *)(((long)arg0 + 0x1)) = 0;
    }
    candidate = 2;
    while (((long)((int)(((unsigned long)((unsigned int)(candidate)) * candidate))) < (long)(arg1))) {
        if (((unsigned long)((unsigned char)(arg0[candidate])) != 0)) {
            multiple = ((unsigned int)(candidate) * candidate);
            while ((multiple < arg1)) {
                arg0[multiple] = 0;
                multiple = ((unsigned int)(candidate) + multiple);
            }
        }
        candidate = ((unsigned int)(candidate) + 1);
    }
    for (candidate = 0; (candidate < arg1); candidate++) {
        if (((unsigned long)((unsigned char)(arg0[candidate])) != 0)) {
            count = ((unsigned int)(count) + 1);
        }
    }
    local_4 = count;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

gcc -O0

2/2
factorize pass 50 lines
// glaurung: factorize @ 0x11f6
int32_t factorize(int32_t arg0, int32_t * arg1, int32_t arg2) {
    int divisor;
    int produced;
    // x86-64 prologue: save rbp
    divisor = 2;
    produced = 0;
    if ((arg1 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((((unsigned long)((unsigned int)(arg0)) == 1) | ((long)(arg0) < 1))) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 0xf4240) | ((long)(arg0) < 0xf4240)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((((unsigned long)((unsigned int)(arg2)) == 0) | ((long)(arg2) < 0))) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((((unsigned long)((unsigned int)(arg2)) == 8) | ((long)(arg2) < 8)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    while (((long)((int)(((unsigned long)((unsigned int)(divisor)) * (unsigned long)((unsigned int)(divisor))))) <= (long)(arg0))) {
        if ((arg2 <= produced)) {
            break;
        }
        while (((unsigned long)((unsigned int)(((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(arg0))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(arg0)))) % (int)(divisor))))) == 0)) {
            if ((arg2 <= produced)) {
                break;
            }
            arg1[(long)(produced)] = divisor;
            produced = (produced + 1);
            arg0 = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(arg0))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(arg0)))) / (int)(divisor)));
        }
        divisor = (divisor + 1);
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 1) | ((long)(arg0) < 1)) == 0)) {
        if ((produced < arg2)) {
            arg1[(long)(produced)] = arg0;
            produced = (produced + 1);
        }
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(produced);
}
sieve_primes pass 52 lines
// glaurung: sieve_primes @ 0x10f9
int32_t sieve_primes(uint8_t * arg0, int32_t arg1) {
    int count;
    int candidate;
    int multiple;
    long var10;
    // x86-64 prologue: save rbp
    count = 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)) == 64) | ((long)(arg1) < 64)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    for (candidate = 0; (candidate < arg1); candidate++) {
        arg0[candidate] = 1;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0)) == 0)) {
        *(signed char *)((long)arg0) = 0;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 1) | ((long)(arg1) < 1)) == 0)) {
        arg0[1] = 0;
    }
    candidate = 2;
    while (1) {
        var10 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(candidate)) * (unsigned long)((unsigned int)(candidate)))));
        if (((((unsigned int)(arg1) == (unsigned int)(var10)) | ((long)(arg1) < (long)((int)(var10)))) != 0)) {
            break;
        }
        if (((unsigned long)((unsigned char)(((unsigned int)((unsigned char)(arg0[candidate])) & 255))) != 0)) {
            multiple = ((unsigned int)(candidate) * (unsigned int)(candidate));
            while ((multiple < arg1)) {
                arg0[multiple] = 0;
                multiple = (multiple + (unsigned int)(candidate));
            }
        }
        candidate = (candidate + 1);
    }
    for (candidate = 0; (candidate < arg1); candidate++) {
        if (((unsigned long)((unsigned char)(((unsigned int)((unsigned char)(arg0[candidate])) & 255))) != 0)) {
            count = (count + 1);
        }
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(count);
}

gcc -O2

2/2
factorize pass 98 lines
// glaurung: factorize @ 0x11f0
int32_t factorize(int32_t arg0, int32_t * arg1, int32_t arg2) {
    int divisor;
    int produced;
    long var1;
    long var12;
    long var16;
    long var19;
    long var2;
    long var20;
    long var23;
    int var25;
    int var31;
    long var34;
    long var35;
    long var5;
    long var6;
    long var7;
    long var8;
    var1 = (long)arg1;
    var2 = (unsigned long)((unsigned int)(arg2));
    if (((unsigned long)(0xf423e) < (unsigned long)((unsigned long)((unsigned int)((arg0 - 2)))))) {
        goto L_12a0;
    }
    if ((arg1 == 0)) {
        goto L_12a0;
    }
    if (((unsigned long)(7) < (unsigned long)((unsigned long)((unsigned int)((arg2 - 1)))))) {
        goto L_12a0;
    }
    var5 = 0;
    var6 = 2;
    var7 = (unsigned long)((unsigned int)(arg0));
    if ((((unsigned long)((unsigned int)(arg0)) == 3) | ((long)(arg0) < 3))) {
        goto L_1291;
    }
    var8 = var5;
    divisor = var6;
    var7 = (unsigned long)((unsigned int)(arg0));
    L_1230: ;
    var12 = ((((unsigned int)(var2) == (unsigned int)(var8)) | ((long)((int)(var2)) < (long)((int)(var8)))) == 0);
    var16 = var12;
    var5 = var8;
    if (((unsigned long)((unsigned int)(((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(var7))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(var7)))) % (int)(divisor))))) != 0)) {
        goto L_1276;
    }
    var19 = var8;
    var20 = var7;
    produced = (long)((int)((var8 + 1)));
    goto L_1271;
    L_1250: ;
    *(int *)((var1 + produced * 4 - 0x4)) = divisor;
    var23 = (unsigned long)((unsigned int)(produced));
    var25 = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(var20))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(var20)))) / (int)(divisor)));
    var12 = ((((unsigned int)(var2) == (unsigned int)(produced)) | ((long)((int)(var2)) < (long)(produced))) == 0);
    produced = (produced + 1);
    var20 = (unsigned long)((unsigned int)(var25));
    var19 = var23;
    var16 = var12;
    var5 = var23;
    var7 = (unsigned long)((unsigned int)(var25));
    if (((unsigned long)((unsigned int)(((int)((((long long)(int)((((unsigned long)((long)((int)(var25))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)(var25)) % (int)(divisor))))) != 0)) {
        goto L_1276;
    }
    L_1271: ;
    var16 = var12;
    var5 = var19;
    var7 = var20;
    if (((unsigned long)((unsigned char)((var12 & 255))) != 0)) {
        goto L_1250;
    }
    L_1276: ;
    var31 = (divisor + 1);
    divisor = (unsigned long)((unsigned int)(var31));
    var34 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var31)) * (unsigned long)((unsigned int)(var31)))));
    if (((((unsigned int)(var34) == (unsigned int)(var7)) | ((long)((int)(var34)) < (long)((int)(var7)))) != 0)) {
        var8 = var5;
        if (((unsigned long)((unsigned char)((var16 & 255))) != 0)) {
            goto L_1230;
        }
    }
    var35 = var5;
    if ((((unsigned long)((unsigned int)(var7)) == 1) | ((long)((int)(var7)) < 1))) {
        goto L_129c;
    }
    var35 = var5;
    if (((unsigned long)((unsigned char)((var16 & 255))) == 0)) {
        goto L_129c;
    }
    L_1291: ;
    *(int *)((var1 + ((long)((int)(var5)) * 4))) = var7;
    var35 = (unsigned long)((unsigned int)((var5 + 1)));
    L_129c: ;
    return (unsigned int)(var35);
    L_12a0: ;
    var35 = 0xffffffff;
    goto L_129c;
}
sieve_primes pass 92 lines
// glaurung: sieve_primes @ 0x1120
int32_t sieve_primes(uint8_t * arg0, int32_t arg1) {
    extern void * memset(void *, int, __SIZE_TYPE__);
    int multiple;
    int count;
    int candidate;
    long local_8;
    long var1;
    long var11;
    long var15;
    long var16;
    long var17;
    long var2;
    long var20;
    long var22;
    long var23;
    long var24;
    long var27;
    long var29;
    long var36;
    long var4;
    void * var9;
    if ((arg0 == 0)) {
        return (unsigned int)(-1);
    }
    local_8 = var1;
    var2 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        return 0xffffffff;
    }
    var4 = 0;
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(var4);
    }
    var9 = memset((void *)(arg0), 1, (__SIZE_TYPE__)(((unsigned long)((unsigned int)((arg1 - 1))) + 1)));
    *(signed char *)((var9)) = 0;
    var11 = var9;
    if (((unsigned long)((unsigned int)(var2)) != 1)) {
        *(signed char *)((var9 + 0x1)) = 0;
        if (((((unsigned long)((unsigned int)(var2)) == 4) | ((long)((int)(var2)) < 4)) == 0)) {
            multiple = 4;
            var15 = 2;
            L_1186: ;
            while (1) {
                var16 = (unsigned long)((unsigned int)(var15));
                if (((unsigned long)((unsigned char)(*(char *)((var11 + var15)))) == 0)) {
                    goto L_1178;
                }
                goto L_118e;
                L_1178: ;
                var17 = (unsigned long)((unsigned int)((var16 + 1)));
                var20 = (unsigned long)((unsigned int)((var17 * var17)));
                multiple = var20;
                var15 = (var15 + 1);
                if (((long)((int)(var2)) <= (long)((int)(var20)))) {
                    goto L_11b1;
                }
                goto L_1186;
                L_118e: ;
                if ((((unsigned int)(var2) == (unsigned int)(multiple)) | ((long)((int)(var2)) < (long)(multiple)))) {
                    goto L_1178;
                }
                var22 = (long)(multiple);
                do {
                    *(signed char *)((var11 + var22)) = 0;
                    var23 = (var22 + var15);
                    var22 = var23;
                } while (((((unsigned int)(var2) == (unsigned int)(var23)) | ((long)((int)(var2)) < (long)((int)(var23)))) == 0));
                var24 = (unsigned long)((unsigned int)((var16 + 1)));
                var27 = (unsigned long)((unsigned int)((var24 * var24)));
                multiple = var27;
                var15 = (var15 + 1);
                if (((long)((int)(var27)) < (long)((int)(var2)))) {
                    goto L_1186;
                }
                goto L_11b1;
            }
        }
    }
    L_11b1: ;
    var29 = 0;
    count = 0;
    do {
        count = (unsigned int)(((unsigned int)((count + 1)) - ((unsigned long)((unsigned long)((unsigned char)(*(char *)((var11 + var29))))) < (unsigned long)(1))));
        var36 = (var29 + 1);
        var29 = var36;
        var4 = (unsigned long)((unsigned int)(count));
    } while (((((unsigned int)(var2) == (unsigned int)(var36)) | ((long)((int)(var2)) < (long)((int)(var36)))) == 0));
    // x86-64 epilogue: tear down frame
    return (unsigned int)(var4);
}

← 213 fixtures