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.
#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/5adjacent_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/5adjacent_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/5adjacent_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/5adjacent_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);
}