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.
#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/2factorize 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/2factorize 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/2factorize 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/2factorize 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);
}