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