Fixture 87
variable length array
C · 2 functions · 4 lanes · 0 of 8 function-lanes behave identically
4 of 4 lanes have a function that returns a different result after decompilation: clang-O0 (0/2), clang-O2 (0/2), gcc-O0 (0/2), gcc-O2 (0/2).
C99 variable-length arrays. The element count is a runtime value, so the frame is sized dynamically and indexing uses a runtime stride. The count is hard-clamped: an unbounded VLA would be a stack-overflow hazard, not a test.
#include <stdint.h>
/* C99 variable-length arrays. The element count is a runtime value, so the
* frame is sized dynamically and indexing uses a runtime stride. The count is
* hard-clamped: an unbounded VLA would be a stack-overflow hazard, not a test. */
#define VLA_LIMIT 16
__attribute__((noinline)) int32_t
vla_reverse_sum(const int32_t *input, int32_t count) {
if (input == 0 || count < 1 || count > VLA_LIMIT) {
return -1;
}
{
int32_t scratch[count];
int32_t index;
int32_t total = 0;
for (index = 0; index < count; ++index) {
scratch[count - 1 - index] = input[index];
}
for (index = 0; index < count; ++index) {
total += scratch[index] * (index + 1);
}
return total;
}
}
__attribute__((noinline)) int32_t
vla_two_dimensional(int32_t rows, int32_t columns) {
if (rows < 1 || rows > 4 || columns < 1 || columns > 4) {
return -1;
}
{
int32_t grid[rows][columns];
int32_t row;
int32_t column;
int32_t total = 0;
for (row = 0; row < rows; ++row) {
for (column = 0; column < columns; ++column) {
grid[row][column] = row * columns + column;
}
}
for (row = 0; row < rows; ++row) {
for (column = 0; column < columns; ++column) {
total += grid[row][column];
}
}
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
0/2vla_reverse_sum fail 39 lines
// glaurung: vla_reverse_sum @ 0x1100
__attribute__((no_stack_protector)) int32_t vla_reverse_sum(const int32_t * arg0, int32_t arg1) {
unsigned long __vla_expr0;
int total;
int index;
void * local_20;
long local_38;
int local_4;
unsigned char stack_1[64];
// x86-64 prologue: save rbp, frame 64 bytes
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);
}
local_20 = &stack_1[0];
local_38 = (long)((&stack_1[0] - ((((unsigned long)((unsigned int)(arg1)) * 4) + 15) & -16)));
__vla_expr0 = (unsigned int)(arg1);
total = 0;
for (index = 0; (index < arg1); index++) {
*(int *)((local_38 + ((long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) - 1))) - index))) * 4))) = arg0[(long)(index)];
}
for (index = 0; (index < arg1); index++) {
total = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((local_38 + ((long)(index) * 4))))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) + 1))))) + total);
}
local_4 = total;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} vla_two_dimensional fail 57 lines
// glaurung: vla_two_dimensional @ 0x1200
__attribute__((no_stack_protector)) int32_t vla_two_dimensional(int32_t arg0, int32_t arg1) {
unsigned long __vla_expr0;
unsigned long __vla_expr1;
int total;
int row;
int column;
void * local_18;
int local_4;
long local_40;
long local_48;
unsigned char stack_1[80];
// x86-64 prologue: save rbp, frame 80 bytes
if (((long)(arg0) < 1)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
if (((((unsigned long)((unsigned int)(arg0)) == 4) | ((long)(arg0) < 4)) == 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)) == 4) | ((long)(arg1) < 4)) == 0)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
local_48 = (unsigned int)(arg1);
local_18 = &stack_1[0];
local_40 = (long)((&stack_1[0] - (((((unsigned long)((unsigned int)(arg0)) * (unsigned long)((unsigned int)(arg1))) * 4) + 15) & -16)));
__vla_expr0 = (unsigned int)(arg0);
__vla_expr1 = (unsigned int)(arg1);
total = 0;
row = 0;
while ((row < arg0)) {
for (column = 0; (column < arg1); column++) {
*(int *)(((local_40 + (((long)(row) * local_48) << 2)) + ((long)(column) * 4))) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg1))) + column);
}
row = ((unsigned int)(row) + 1);
}
row = 0;
while ((row < arg0)) {
for (column = 0; (column < arg1); column++) {
total = ((unsigned int)(*(int *)(((local_40 + (((long)(row) * local_48) << 2)) + ((long)(column) * 4)))) + total);
}
row = ((unsigned int)(row) + 1);
}
local_4 = total;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} clang -O2
0/2vla_reverse_sum fail 300 lines
// glaurung: vla_reverse_sum @ 0x1100
__attribute__((no_stack_protector)) int32_t vla_reverse_sum(const int32_t * arg0, int32_t arg1) {
int index;
int total;
long rbp;
long ret;
long rsp;
unsigned char stack_2[24];
long t110;
long t113;
long t421;
long t424;
long var0;
long var1;
long var12;
int var128;
int var129;
int var130;
int var131;
long var133;
int var134;
int var135;
int var136;
int var137;
int var138;
int var139;
long var14;
int var140;
int var141;
int var145;
int var146;
int var147;
int var148;
int var149;
int var150;
int var151;
int var152;
int var153;
int var154;
int var155;
int var156;
long var16;
long var2;
long var22;
long var23;
long var25;
long var273;
long var29;
long var32;
int var38;
long var4;
int var45;
int var46;
int var47;
int var48;
int var54;
int var55;
int var56;
int var57;
int var63;
int var64;
int var65;
int var66;
int var72;
int var73;
int var74;
int var75;
long var79;
long var8;
long var80;
long var83;
int var85;
int var86;
int var87;
int var88;
int var89;
long var9;
int var90;
int var91;
int var92;
long var95;
ret = 0xffffffff;
if ((arg0 == 0)) {
return ret;
}
var0 = (unsigned long)((unsigned int)((arg1 - 17)));
if (((unsigned long)((unsigned long)((unsigned int)(var0))) < (unsigned long)(0xfffffff0))) {
return ret;
}
rsp = (rsp - 8);
*(long *)((&stack_2[0] + 16)) = rbp;
rbp = rsp;
rsp = (rsp - 8);
*(long *)((&stack_2[0] + 8)) = var1;
*(long *)(&stack_2[0]) = var2;
var4 = (unsigned long)((unsigned int)(arg1));
var8 = (long)((&stack_2[0] - ((((unsigned long)((unsigned int)(arg1)) * 4) + 15) & -16)));
rsp = var8;
if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
var0 = (var4 - 1);
var9 = (unsigned long)((unsigned int)((arg1 - 1)));
var12 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var9)) - var0)));
var14 = 0;
if (((((unsigned int)(var12) == (unsigned int)(var9)) | ((long)((int)(var12)) < (long)((int)(var9)))) == 0)) {
L_11d3: ;
var16 = (~var14);
if (((unsigned long)((unsigned char)((var4 & 1))) != 0)) {
var0 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var14 * 4))));
*(int *)((var8 + ((long)((int)(((~(unsigned long)((unsigned int)(var14))) + arg1))) * 4))) = var0;
var14 = (var14 | 1);
}
var22 = (var16 + var4);
var23 = (long)arg0;
if ((var22 != 0)) {
var25 = (var4 - var14);
var29 = (unsigned long)((unsigned int)(((~(unsigned long)((unsigned int)(var14))) + arg1)));
var23 = (long)((((long)arg0 + (var14 * 4)) + 4));
var32 = 0;
do {
*(int *)((var8 + ((long)((int)(var29)) * 4))) = *(int *)((var23 + var32 * 4 - 0x4));
*(int *)((var8 + ((long)((int)(((long)((int)(var29)) - 1))) * 4))) = *(int *)((var23 + var32 * 4));
var32 = (var32 + 2);
var38 = ((long)((int)(var29)) - 2);
var29 = (unsigned long)((unsigned int)(var38));
var22 = (unsigned long)((unsigned int)(var38));
} while ((var25 != var32));
}
} else {
var0 = ((unsigned long)(var0) >> 32);
if ((var0 != 0)) {
goto L_11d3;
} else {
var14 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var4)) & -4)));
var22 = (long)((int)(var9));
var45 = *(int *)(((long)arg0 + 0xc));
var46 = *(int *)(((long)arg0 + 0x8));
var47 = *(int *)(((long)arg0 + 0x4));
var48 = *(int *)(((long)arg0));
ret = ((unsigned long)((unsigned int)(var46)) | (unsigned long)((unsigned int)(var45)));
*(int *)(((var8 + ((long)((int)(var9)) * 4)) - 12)) = var45;
*(int *)(((var8 + ((long)((int)(var9)) * 4)) - 8)) = var46;
*(int *)(((var8 + ((long)((int)(var9)) * 4)) - 4)) = var47;
*(int *)((var8 + ((long)((int)(var9)) * 4))) = var48;
if ((var14 != 4)) {
var22 = (long)((int)((arg1 - 5)));
var54 = *(int *)(((long)arg0 + 0x1c));
var55 = *(int *)(((long)arg0 + 0x18));
var56 = *(int *)(((long)arg0 + 0x14));
var57 = *(int *)(((long)arg0 + 0x10));
ret = ((unsigned long)((unsigned int)(var55)) | (unsigned long)((unsigned int)(var54)));
*(int *)((var8 + var22 * 4 - 0xc)) = var54;
*(int *)((var8 + var22 * 4 - 0x8)) = var55;
*(int *)((var8 + var22 * 4 - 0x4)) = var56;
*(int *)((var8 + var22 * 4)) = var57;
if (((unsigned long)((unsigned int)(var14)) != 8)) {
var22 = (long)((int)((arg1 - 9)));
var63 = *(int *)(((long)arg0 + 0x2c));
var64 = *(int *)(((long)arg0 + 0x28));
var65 = *(int *)(((long)arg0 + 0x24));
var66 = *(int *)(((long)arg0 + 0x20));
ret = ((unsigned long)((unsigned int)(var64)) | (unsigned long)((unsigned int)(var63)));
*(int *)((var8 + var22 * 4 - 0xc)) = var63;
*(int *)((var8 + var22 * 4 - 0x8)) = var64;
*(int *)((var8 + var22 * 4 - 0x4)) = var65;
*(int *)((var8 + var22 * 4)) = var66;
if (((unsigned long)((unsigned int)(var14)) != 12)) {
var22 = (long)((int)((arg1 - 13)));
var72 = *(int *)(((long)arg0 + 0x3c));
var73 = *(int *)(((long)arg0 + 0x38));
var74 = *(int *)(((long)arg0 + 0x34));
var75 = *(int *)(((long)arg0 + 0x30));
ret = ((unsigned long)((unsigned int)(var73)) | (unsigned long)((unsigned int)(var72)));
*(int *)((var8 + var22 * 4 - 0xc)) = var72;
*(int *)((var8 + var22 * 4 - 0x8)) = var73;
*(int *)((var8 + var22 * 4 - 0x4)) = var74;
*(int *)((var8 + var22 * 4)) = var75;
}
}
}
var23 = (long)arg0;
if ((var14 == var4)) {
goto L_1243;
}
goto L_11d3;
}
}
} else {
var14 = 0;
goto L_11d3;
}
L_1243: ;
if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
var79 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var4)) & -4)));
var80 = (var79 - 4);
var83 = (((unsigned long)(var80) >> 2) + 1);
if ((var80 == 0)) {
var85 = 0;
var86 = 0;
var87 = 0;
var88 = 0;
var89 = 1;
var90 = 2;
var91 = 3;
var92 = 4;
var95 = 0;
if (((unsigned long)((unsigned char)((var83 & 1))) != 0)) {
L_133f: ;
var128 = (var85 + (unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4)))) * (unsigned long)((unsigned int)(var89)))));
var129 = (var86 + (unsigned int)(((unsigned long)((unsigned int)(var90)) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x4)))))));
var130 = (var87 + (unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x8)))) * (unsigned long)((unsigned int)(var91)))));
var131 = (var88 + (unsigned int)(((unsigned long)((unsigned int)(var92)) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0xc)))))));
} else {
var128 = var85;
var129 = var86;
var130 = var87;
var131 = var88;
}
} else {
var133 = (var83 & -2);
var134 = 2;
var135 = 0;
var136 = 3;
var137 = 0;
var138 = 0;
var139 = 0;
var140 = 1;
var141 = 0;
var85 = 0;
var86 = 0;
var87 = 0;
var88 = 0;
var95 = 0;
var145 = -1;
var146 = -1;
var147 = -1;
var148 = -1;
var149 = 5;
var150 = 5;
var151 = 5;
var152 = 5;
var153 = 8;
var154 = 0;
var155 = 8;
var156 = 0;
do {
var85 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x10)))) * (unsigned long)((unsigned int)((var138 + var149))))) + ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4)))) * (unsigned long)((unsigned int)((var138 - var145))))) + var85));
var86 = ((unsigned int)(((unsigned long)((unsigned int)((var140 + var150))) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x14)))))) + ((unsigned int)(((unsigned long)((unsigned int)((var140 - var146))) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x4)))))) + var86));
var87 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x18)))) * (unsigned long)((unsigned int)((var134 + var151))))) + ((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x8)))) * (unsigned long)((unsigned int)((var134 - var147))))) + var87));
var88 = ((unsigned int)(((unsigned long)((unsigned int)((var136 + var152))) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0x1c)))))) + ((unsigned int)(((unsigned long)((unsigned int)((var136 - var148))) * (unsigned long)((unsigned int)(*(int *)((var8 + var95 * 4 + 0xc)))))) + var88));
ret = ((unsigned long)((unsigned int)(var86)) | (unsigned long)((unsigned int)(var85)));
var95 = (var95 + 8);
t110 = (((unsigned long)((unsigned int)(var139)) | (unsigned long)((unsigned int)(var138))) + ((unsigned long)((unsigned int)(var154)) | (unsigned long)((unsigned int)(var153))));
var138 = (unsigned int)(t110);
var139 = (((unsigned long)(t110) >> 32) & 0xffffffff);
t113 = (((unsigned long)((unsigned int)(var141)) | (unsigned long)((unsigned int)(var140))) + ((unsigned long)((unsigned int)(var156)) | (unsigned long)((unsigned int)(var155))));
var140 = (unsigned int)(t113);
var141 = (((unsigned long)(t113) >> 32) & 0xffffffff);
t421 = (((unsigned long)((unsigned int)(var135)) | (unsigned long)((unsigned int)(var134))) + ((unsigned long)((unsigned int)(var154)) | (unsigned long)((unsigned int)(var153))));
var134 = (unsigned int)(t421);
var135 = (((unsigned long)(t421) >> 32) & 0xffffffff);
t424 = (((unsigned long)((unsigned int)(var137)) | (unsigned long)((unsigned int)(var136))) + ((unsigned long)((unsigned int)(var156)) | (unsigned long)((unsigned int)(var155))));
var136 = (unsigned int)(t424);
var137 = (((unsigned long)(t424) >> 32) & 0xffffffff);
var133 = (var133 - 2);
} while ((var133 != 0));
var89 = (var138 + 1);
var90 = (var140 + 1);
var91 = (var134 + 1);
var92 = (var136 + 1);
var128 = var85;
var129 = var86;
var130 = var87;
var131 = var88;
if (((unsigned long)((unsigned char)((var83 & 1))) == 0)) {
goto L_1369;
}
goto L_133f;
}
L_1369: ;
var273 = (unsigned long)((unsigned int)(((var131 + var129) + (var130 + var128))));
ret = var273;
if ((var79 != var4)) {
L_1390: ;
do {
index = (var79 + 1);
total = (var273 + (unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + var79 * 4)))) * index)));
var273 = (unsigned long)((unsigned int)(total));
var79 = (unsigned long)((unsigned int)(index));
ret = (unsigned long)((unsigned int)(total));
} while ((var4 != index));
}
} else {
var273 = 0;
var79 = 0;
goto L_1390;
}
rsp = (rbp - 16);
// x86-64 epilogue: restore rbp
return ret;
} vla_two_dimensional fail 162 lines
// glaurung: vla_two_dimensional @ 0x13d0
__attribute__((no_stack_protector)) int32_t vla_two_dimensional(int32_t arg0, int32_t arg1) {
int column;
int row;
int total;
long rbp;
long ret;
unsigned char stack_0[40];
long var12;
long var15;
long var16;
long var17;
long var18;
long var19;
long var2;
int var22;
long var23;
int var24;
long var25;
long var28;
long var3;
long var31;
long var32;
long var33;
long var38;
long var39;
long var4;
long var40;
long var43;
long var44;
long var45;
long var5;
int var60;
long var7;
long var8;
ret = 0xffffffff;
if (((unsigned long)(0xfffffffc) <= (unsigned long)((unsigned long)((unsigned int)((arg0 - 5)))))) {
if (((unsigned long)((unsigned long)((unsigned int)((arg1 - 5)))) < (unsigned long)(0xfffffffc))) {
return ret;
}
*(long *)((&stack_0[0] + 32)) = rbp;
rbp = (long)((&stack_0[0] + 32));
*(long *)((&stack_0[0] + 24)) = var2;
*(long *)((&stack_0[0] + 16)) = var3;
*(long *)((&stack_0[0] + 8)) = var4;
*(long *)(&stack_0[0]) = var5;
var7 = (unsigned long)((unsigned int)(arg0));
var8 = (unsigned long)((unsigned int)(arg1));
var12 = (((((unsigned long)((unsigned int)(arg1)) * (unsigned long)((unsigned int)(arg0))) * 4) + 15) & -16);
var15 = (long)((&stack_0[0] - var12));
var16 = (-var12);
*(int *)((&stack_0[0] + var16)) = 0;
if (((unsigned long)((unsigned int)(arg1)) != 1)) {
*(int *)((var15 + 0x4)) = 1;
if (((unsigned long)((unsigned int)(arg1)) != 2)) {
*(int *)((var15 + 0x8)) = 2;
if (((unsigned long)((unsigned int)(arg1)) != 3)) {
*(int *)((var15 + 0xc)) = 3;
}
}
}
var17 = var18;
if (((unsigned long)((unsigned int)(arg0)) != 1)) {
*(int *)((var15 + var8 * 4)) = arg1;
if (((unsigned long)((unsigned int)(arg1)) != 1)) {
var16 = (unsigned long)((unsigned int)((arg1 + 1)));
*(int *)((var15 + var8 * 4 + 0x4)) = var16;
if (((unsigned long)((unsigned int)(arg1)) != 2)) {
var16 = (unsigned long)((unsigned int)((arg1 + 2)));
*(int *)((var15 + var8 * 4 + 0x8)) = var16;
if (((unsigned long)((unsigned int)(arg1)) != 3)) {
var16 = (unsigned long)((unsigned int)((arg1 + 3)));
*(int *)((var15 + var8 * 4 + 0xc)) = var16;
}
}
}
var17 = var18;
if (((unsigned long)((unsigned int)(arg0)) != 2)) {
var16 = (unsigned long)((unsigned int)((arg1 + arg1)));
*(int *)((var15 + var8 * 8)) = var16;
var17 = var18;
if (((unsigned long)((unsigned int)(arg1)) != 1)) {
var19 = (var8 + var8);
var17 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var16)) | 1)));
*(int *)((var15 + var19 * 4 + 0x4)) = var17;
if (((unsigned long)((unsigned int)(arg1)) != 2)) {
var17 = (unsigned long)((unsigned int)((var16 + 2)));
*(int *)((var15 + var19 * 4 + 0x8)) = var17;
if (((unsigned long)((unsigned int)(arg1)) != 3)) {
var22 = (var16 + 3);
var16 = (unsigned long)((unsigned int)(var22));
*(int *)((var15 + var19 * 4 + 0xc)) = var22;
}
}
}
if (((unsigned long)((unsigned int)(arg0)) != 3)) {
var16 = (unsigned long)((unsigned int)((arg1 + (arg1 * 2))));
var23 = (var8 + (var8 * 2));
*(int *)((var15 + var23 * 4)) = var16;
if (((unsigned long)((unsigned int)(arg1)) != 1)) {
var17 = (unsigned long)((unsigned int)((var16 + 1)));
*(int *)((var15 + var23 * 4 + 0x4)) = var17;
if (((unsigned long)((unsigned int)(arg1)) != 2)) {
var17 = (unsigned long)((unsigned int)((var16 + 2)));
*(int *)((var15 + var23 * 4 + 0x8)) = var17;
if (((unsigned long)((unsigned int)(arg1)) != 3)) {
var24 = (var16 + 3);
var16 = (unsigned long)((unsigned int)(var24));
*(int *)((var15 + var23 * 4 + 0xc)) = var24;
}
}
}
}
}
}
var25 = (var8 - 1);
var28 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var8)) & 7)));
var31 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var8)) & -8)));
var32 = (var15 + 28);
var33 = (var8 << 2);
var38 = 0;
ret = 0;
var39 = (unsigned long)((unsigned int)(arg0));
do {
var40 = var39;
if (((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0)) == 0)) {
column = 0;
var43 = ret;
var44 = 0;
if (((unsigned long)(7) <= (unsigned long)(var25))) {
var45 = ret;
do {
var60 = ((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var45 + *(int *)((var32 + column * 4 - 0x1c))))) + *(int *)((var32 + column * 4 - 0x18))))) + *(int *)((var32 + column * 4 - 0x14))))) + *(int *)((var32 + column * 4 - 0x10))))) + *(int *)((var32 + column * 4 - 0xc))))) + *(int *)((var32 + column * 4 - 0x8))))) + *(int *)((var32 + column * 4 - 0x4)))) + *(int *)((var32 + column * 4)));
var45 = (unsigned long)((unsigned int)(var60));
column = (column + 8);
var43 = (unsigned long)((unsigned int)(var60));
var44 = (unsigned long)((unsigned int)(column));
} while ((var31 != column));
}
ret = var43;
var40 = var39;
var17 = var44;
if ((var28 != 0)) {
var17 = (var15 + (var44 * 4));
var40 = 0;
do {
var43 = (unsigned long)((unsigned int)((var43 + *(int *)((var17 + var40 * 4)))));
var40 = (var40 + 1);
} while ((var28 != var40));
ret = var43;
}
}
row = (var38 + 1);
var32 = (var32 + var33);
var15 = (var15 + var33);
var38 = (unsigned long)((unsigned int)(row));
var39 = var40;
} while ((row != var7));
// x86-64 epilogue: restore rbp
}
return ret;
} gcc -O0
0/2vla_reverse_sum fail 49 lines
// glaurung: vla_reverse_sum @ 0x1119
int32_t vla_reverse_sum(const int32_t * arg0, int32_t arg1) {
extern __attribute__((noreturn)) void __stack_chk_fail(void);
int total;
int index;
long local_18;
long local_20;
long local_28;
long ret;
long rsp;
long var23;
long var27;
long var37;
long var4;
// x86-64 prologue: save rbp, frame 8 bytes
rsp = (rsp - 56);
local_18 = (long)(0x28);
if ((((arg0 == 0) || (((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) || (((unsigned long)((unsigned int)(arg1)) != 16) && (16 <= (long)(arg1))))) {
ret = 0xffffffff;
} else {
var4 = rsp;
local_28 = ((long)(arg1) - 1);
var23 = (((unsigned long)(((((unsigned __int128)(unsigned long)(0) << 64) | (unsigned long)(((16 - 1) + (0 + ((long)((int)((unsigned long)((unsigned int)(arg1)))) * 4))))) / (unsigned long)(16)))) * 16);
var27 = (rsp - (var23 & -4096));
while ((rsp != var27)) {
rsp = (rsp - 4096);
}
rsp = (rsp - (unsigned long)((unsigned int)((var23 & 4095))));
if (((unsigned long)((unsigned int)((var23 & 4095))) != 0)) {
var37 = (((unsigned long)((unsigned int)((var23 & 4095))) - 8) + rsp);
*(long *)((var37)) = *(long *)((var37));
}
local_20 = (((unsigned long)((rsp + 3)) >> 2) << 2);
total = 0;
for (index = 0; (index < arg1); index++) {
*(int *)((local_20 + ((long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) - 1))) - index))) * 4))) = arg0[(long)(index)];
}
for (index = 0; (index < arg1); index++) {
total = (total + (unsigned int)(((unsigned long)((unsigned int)(*(int *)((local_20 + ((long)(index) * 4))))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(index)) + 1))))));
}
ret = (unsigned long)((unsigned int)(total));
rsp = var4;
}
if ((local_18 != 0x28)) {
__stack_chk_fail();
}
// x86-64 epilogue: restore rbp
return ret;
} vla_two_dimensional fail 72 lines
// glaurung: vla_two_dimensional @ 0x12a2
int32_t vla_two_dimensional(int32_t arg0, int32_t arg1) {
extern __attribute__((noreturn)) void __stack_chk_fail(void);
int total;
int row;
int column;
long local_38;
long local_40;
long local_48;
long local_50;
long local_78;
long local_80;
long rbp;
long ret;
long rsp;
long var11;
long var4;
long var56;
long var60;
long var70;
// x86-64 prologue: save rbp, frame 8 bytes
rsp = (rsp - 8);
rsp = (rsp - 8);
rsp = (rsp - 8);
rsp = (rsp - 8);
rsp = (rsp - 88);
local_38 = (long)(0x28);
if (((((((unsigned long)((unsigned int)(arg0)) == 0) | ((long)(arg0) < 0)) || ((((unsigned long)((unsigned int)(arg0)) == 4) | ((long)(arg0) < 4)) == 0)) || (((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) || (((unsigned long)((unsigned int)(arg1)) != 4) && (4 <= (long)(arg1))))) {
ret = 0xffffffff;
} else {
var4 = rsp;
local_50 = ((long)(arg1) - 1);
local_80 = arg1;
local_78 = 0;
var11 = ((long)(arg1) << 2);
local_48 = ((long)(arg0) - 1);
var56 = (((unsigned long)(((((unsigned __int128)(unsigned long)(0) << 64) | (unsigned long)(((16 - 1) + (0 + (((long)((int)((unsigned long)((unsigned int)(arg0)))) * (long)((int)((unsigned long)((unsigned int)(arg1))))) * 4))))) / (unsigned long)(16)))) * 16);
var60 = (rsp - (var56 & -4096));
while ((rsp != var60)) {
rsp = (rsp - 4096);
}
rsp = (rsp - (unsigned long)((unsigned int)((var56 & 4095))));
if (((unsigned long)((unsigned int)((var56 & 4095))) != 0)) {
var70 = (((unsigned long)((unsigned int)((var56 & 4095))) - 8) + rsp);
*(long *)((var70)) = *(long *)((var70));
}
local_40 = (((unsigned long)((rsp + 3)) >> 2) << 2);
total = 0;
row = 0;
while ((row < arg0)) {
for (column = 0; (column < arg1); column++) {
*(int *)((local_40 + ((((long)(row) * ((unsigned long)(var11) >> 2)) + (long)(column)) * 4))) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg1))) + (unsigned long)((unsigned int)(column)));
}
row = (row + 1);
}
row = 0;
while ((row < arg0)) {
for (column = 0; (column < arg1); column++) {
total = (total + (unsigned int)(*(int *)((local_40 + ((((long)(row) * ((unsigned long)(var11) >> 2)) + (long)(column)) * 4)))));
}
row = (row + 1);
}
ret = (unsigned long)((unsigned int)(total));
rsp = var4;
}
if ((local_38 != 0x28)) {
__stack_chk_fail();
}
rsp = (rbp - 40);
// x86-64 epilogue: restore rbp
return ret;
} gcc -O2
0/2vla_reverse_sum fail 86 lines
// glaurung: vla_reverse_sum @ 0x1120
int32_t vla_reverse_sum(const int32_t * arg0, int32_t arg1) {
extern __attribute__((noreturn)) void __stack_chk_fail(void);
int index;
int total;
long local_8;
long rsp;
unsigned char stack_0[8];
long var12;
long var13;
long var15;
long var16;
long var19;
long var20;
long var21;
long var26;
long var27;
long var28;
int var29;
long var34;
long var4;
long var7;
long var8;
long var9;
rsp = (rsp - 8);
rsp = (rsp - 16);
local_8 = (long)(0x28);
if (((unsigned long)(15) < (unsigned long)((unsigned long)((unsigned int)((arg1 - 1)))))) {
goto L_1200;
}
var4 = (long)arg0;
if ((arg0 == 0)) {
goto L_1200;
}
var7 = rsp;
var8 = ((long)(arg1) << 2);
var9 = (var8 + 15);
var12 = (rsp - (var9 & -4096));
var13 = (var9 & -16);
if ((rsp != var12)) {
while ((rsp != var12)) {
rsp = (rsp - 4096);
}
}
var15 = (unsigned long)((unsigned int)((var13 & 4095)));
rsp = (rsp - var15);
if ((var15 != 0)) {
goto L_11f8;
}
L_119c: ;
var16 = rsp;
index = 0;
var19 = (var8 + rsp);
do {
var20 = (unsigned long)((unsigned int)(*(int *)((var4 + index * 4))));
index = (index + 1);
var19 = (var19 - 4);
*(int *)((var19)) = var20;
} while (((((unsigned int)(arg1) == (unsigned int)(index)) | (arg1 < index)) == 0));
var21 = var16;
var26 = 0;
var27 = 0;
do {
var28 = (unsigned long)((unsigned int)(*(int *)((var21))));
var29 = (var27 + 1);
var21 = (var21 + 4);
var26 = (unsigned long)((unsigned int)((var26 + (unsigned long)((unsigned int)((var28 * (unsigned long)((unsigned int)(var29))))))));
var27 = (unsigned long)((unsigned int)(var29));
} while ((var29 < arg1));
rsp = var7;
var34 = var26;
L_11de: ;
if ((local_8 != 0x28)) {
goto L_1208;
}
// x86-64 epilogue: restore rbp
return (unsigned int)(var34);
L_11f8: ;
*(long *)((&stack_0[0] + var15)) = *(long *)((&stack_0[0] + var15));
goto L_119c;
L_1200: ;
var34 = 0xffffffff;
goto L_11de;
L_1208: ;
__stack_chk_fail();
} vla_two_dimensional fail 113 lines
// glaurung: vla_two_dimensional @ 0x1210
int32_t vla_two_dimensional(int32_t arg0, int32_t arg1) {
extern __attribute__((noreturn)) void __stack_chk_fail(void);
int row;
int column;
int total;
long local_18;
long rbp;
long rsp;
unsigned char stack_0[8];
long var10;
long var11;
long var13;
long var16;
long var17;
long var19;
long var20;
long var21;
long var23;
long var25;
long var26;
long var27;
long var28;
int var29;
long var38;
long var39;
long var46;
long var5;
long var9;
rsp = (rsp - 8);
rbp = rsp;
rsp = (rsp - 8);
rsp = (rsp - 8);
rsp = (rsp - 16);
local_18 = (long)(0x28);
if (((unsigned long)(3) < (unsigned long)((unsigned long)((unsigned int)((arg0 - 1)))))) {
goto L_1331;
}
var5 = (unsigned long)((unsigned int)(arg1));
if (((unsigned long)(3) < (unsigned long)((unsigned long)((unsigned int)((arg1 - 1)))))) {
goto L_1331;
}
var9 = (unsigned long)((unsigned int)(arg0));
var10 = ((long)(arg1) << 2);
var11 = rsp;
var13 = (((long)(arg0) * var10) + 15);
var16 = (rsp - (var13 & -4096));
var17 = (var13 & -16);
if ((rsp != var16)) {
while ((rsp != var16)) {
rsp = (rsp - 4096);
}
}
var19 = (unsigned long)((unsigned int)((var17 & 4095)));
rsp = (rsp - var19);
if ((var19 != 0)) {
goto L_1326;
}
L_129f: ;
var20 = rsp;
var21 = (unsigned long)((unsigned int)(var5));
var23 = 0;
var25 = 0;
var26 = rsp;
L_12b0: ;
var27 = var26;
var28 = (unsigned long)((unsigned int)(var23));
do {
*(int *)((var27)) = var28;
var29 = (var28 + 1);
var28 = (unsigned long)((unsigned int)(var29));
var27 = (var27 + 4);
} while (((unsigned int)(var29) != (unsigned int)(var21)));
row = (unsigned long)((unsigned int)((var25 + 1)));
var23 = (unsigned long)((unsigned int)((var23 + var5)));
var26 = (var26 + var10);
var21 = (unsigned long)((unsigned int)((var21 + var5)));
if (((unsigned int)(var9) != (unsigned int)(row))) {
var25 = (unsigned long)((unsigned int)(row));
goto L_12b0;
}
var38 = 0;
var39 = 0;
L_12e5: ;
column = 0;
do {
var38 = (unsigned long)((unsigned int)((var38 + *(int *)((var20 + column * 4)))));
column = (column + 1);
} while (((((unsigned int)(var5) == (unsigned int)(column)) | ((long)((int)(var5)) < (long)(column))) == 0));
row = (unsigned long)((unsigned int)((var39 + 1)));
var20 = (var20 + var10);
if (((unsigned int)(var25) != (unsigned int)(var39))) {
var39 = (unsigned long)((unsigned int)(row));
goto L_12e5;
}
rsp = var11;
var46 = var38;
L_130b: ;
if ((local_18 != 0x28)) {
goto L_1339;
}
rsp = (rbp - 16);
// x86-64 epilogue: restore rbp
return (unsigned int)(var46);
L_1326: ;
*(long *)((&stack_0[0] + var19)) = *(long *)((&stack_0[0] + var19));
goto L_129f;
L_1331: ;
var46 = 0xffffffff;
goto L_130b;
L_1339: ;
__stack_chk_fail();
}