Fixture 24
merge sort
C · 1 functions · 4 lanes · 4 of 4 function-lanes behave identically
All 4 lanes recompile and return the same results as the original.
#include <stdint.h>
__attribute__((noinline)) int32_t merge_sort_i32(int32_t *values, int32_t n) {
int32_t temp[16];
int32_t width;
if (values == 0 || n < 0 || n > 16) {
return -1;
}
for (width = 1; width < n; width *= 2) {
int32_t left;
for (left = 0; left < n; left += width * 2) {
int32_t middle = left + width < n ? left + width : n;
int32_t right = left + width * 2 < n ? left + width * 2 : n;
int32_t i = left;
int32_t j = middle;
int32_t out = left;
while (i < middle && j < right) {
temp[out++] = values[i] <= values[j] ? values[i++] : values[j++];
}
while (i < middle) {
temp[out++] = values[i++];
}
while (j < right) {
temp[out++] = values[j++];
}
for (i = left; i < right; ++i) {
values[i] = temp[i];
}
}
}
return n > 0 ? values[n / 2] : 0;
} 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
1/1merge_sort_i32 pass 140 lines
// glaurung: merge_sort_i32 @ 0x1100
__attribute__((no_stack_protector)) int32_t merge_sort_i32(int32_t * arg0, int32_t arg1) {
int width;
int left;
int middle;
int right;
int i;
int j;
int out;
int local_4;
unsigned char local_60[64];
int local_80;
int local_84;
signed char local_85;
int local_8c;
int local_90;
long t201;
long var37;
long var41;
long var48;
long var55;
long var61;
long var66;
long var67;
long var74;
long var79;
long var80;
if ((arg0 != 0)) {
if ((0 <= (long)(arg1))) {
if ((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16))) {
goto L_113a;
}
}
}
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
L_113a: ;
width = 1;
L_1141: ;
if ((arg1 <= width)) {
goto L_1354;
}
left = 0;
L_1154: ;
if ((arg1 <= left)) {
goto L_1341;
}
if (((long)((int)(((unsigned long)((unsigned int)(left)) + width))) < (long)(arg1))) {
local_80 = ((unsigned int)(left) + width);
goto L_1183;
}
local_80 = arg1;
L_1183: ;
middle = local_80;
if (((long)((int)(((unsigned long)((unsigned int)(left)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(width)) << 1)))))) < (long)(arg1))) {
local_84 = ((unsigned int)(left) + (unsigned int)(((unsigned long)((unsigned int)(width)) << 1)));
goto L_11bc;
}
local_84 = arg1;
L_11bc: ;
right = local_84;
i = left;
j = middle;
out = left;
L_11d7: ;
local_85 = 0;
if ((i < middle)) {
local_85 = (j < right);
}
if (((unsigned long)((unsigned char)((local_85 & 1))) == 0)) {
goto L_1280;
}
var37 = (unsigned long)((unsigned int)(arg0[(long)(i)]));
t201 = arg0[(long)(j)];
if (((((unsigned int)(var37) == (unsigned int)(t201)) | ((long)((int)(var37)) < (long)((int)(t201)))) != 0)) {
var41 = (unsigned long)((unsigned int)(i));
i = ((unsigned int)(i) + 1);
local_8c = arg0[(long)((int)(var41))];
goto L_1264;
}
var48 = (unsigned long)((unsigned int)(j));
j = ((unsigned int)(j) + 1);
local_8c = arg0[(long)((int)(var48))];
L_1264: ;
var55 = (unsigned long)((unsigned int)(out));
out = ((unsigned int)(out) + 1);
*(int *)((&local_60[0] + ((long)((int)(var55)) * 4))) = local_8c;
goto L_11d7;
L_1280: ;
goto L_1285;
L_1285: ;
if ((i < middle)) {
var61 = (unsigned long)((unsigned int)(i));
i = ((unsigned int)(i) + 1);
var66 = (unsigned long)((unsigned int)(arg0[(long)((int)(var61))]));
var67 = (unsigned long)((unsigned int)(out));
out = ((unsigned int)(out) + 1);
*(int *)((&local_60[0] + ((long)((int)(var67)) * 4))) = var66;
goto L_1285;
}
goto L_12c1;
L_12c1: ;
if ((j < right)) {
var74 = (unsigned long)((unsigned int)(j));
j = ((unsigned int)(j) + 1);
var79 = (unsigned long)((unsigned int)(arg0[(long)((int)(var74))]));
var80 = (unsigned long)((unsigned int)(out));
out = ((unsigned int)(out) + 1);
*(int *)((&local_60[0] + ((long)((int)(var80)) * 4))) = var79;
goto L_12c1;
}
i = left;
L_12fe: ;
if ((i < right)) {
arg0[(long)(i)] = *(int *)((&local_60[0] + ((long)(i) * 4)));
i = ((unsigned int)(i) + 1);
goto L_12fe;
}
goto L_1330;
L_1330: ;
left = ((unsigned int)(((unsigned long)((unsigned int)(width)) << 1)) + left);
goto L_1154;
L_1341: ;
goto L_1346;
L_1346: ;
width = ((unsigned long)((unsigned int)(width)) << 1);
goto L_1141;
L_1354: ;
if (((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0)) == 0)) {
local_90 = arg0[(long)((int)(((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(arg1))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(arg1)))) / (int)(2)))))];
goto L_139b;
}
local_90 = 0;
goto L_139b;
L_139b: ;
local_4 = local_90;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} clang -O2
1/1merge_sort_i32 pass 397 lines
// glaurung: merge_sort_i32 @ 0x1110
__attribute__((no_stack_protector)) int32_t merge_sort_i32(int32_t * arg0, int32_t arg1) {
extern void * memcpy(void *, const void *, __SIZE_TYPE__);
int width;
int left;
int middle;
int i;
int j;
int out;
int right;
unsigned char local_78[120];
unsigned char local_e8[112];
long ret;
long t110;
long t113;
long t214;
long t606;
long t607;
long t608;
long t609;
long t610;
long t621;
long t622;
long t623;
long t624;
long var0;
long var1;
long var10;
long var101;
long var102;
void * var107;
long var11;
long var110;
long var111;
long var113;
int var114;
int var115;
int var116;
int var117;
long var118;
long var121;
int var123;
int var124;
int var125;
int var126;
long var133;
int var135;
int var136;
int var137;
int var138;
int var139;
int var140;
int var141;
int var142;
int var144;
int var145;
int var146;
int var147;
long var148;
int var151;
int var152;
int var153;
int var154;
int var156;
int var157;
int var158;
int var159;
int var160;
int var161;
int var162;
int var163;
long var176;
int var180;
long var192;
long var195;
long var196;
long var197;
long var198;
long var2;
long var200;
long var201;
void * var214;
long var25;
long var3;
long var32;
int var36;
int var38;
long var39;
int var40;
long var41;
long var43;
long var45;
long var51;
long var55;
long var56;
long var57;
long var58;
long var59;
long var62;
long var64;
int var73;
int var75;
long var76;
long var77;
long var78;
long var79;
long var80;
long var81;
long var82;
long var89;
long var90;
void * var91;
int var93;
long var95;
long var96;
long var97;
// x86-64 prologue: save callee registers, frame 48 bytes
ret = 0xffffffff;
if ((arg0 == 0)) {
// x86-64 epilogue: restore callee registers
return ret;
}
var0 = (unsigned long)((unsigned int)(arg1));
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
// x86-64 epilogue: restore callee registers
return ret;
}
var1 = (long)arg0;
var2 = var0;
var3 = ret;
if (((unsigned long)(2) <= (unsigned long)((unsigned long)((unsigned int)(var0))))) {
*(long *)((&local_e8[0] + 72)) = var0;
width = 1;
var10 = (unsigned long)((unsigned int)(arg1));
do {
var11 = (unsigned long)((unsigned int)((width + width)));
*(int *)((&local_e8[0] + 12)) = var11;
*(int *)((&local_e8[0] + 56)) = (-(unsigned long)((unsigned int)(var11)));
var10 = 0;
*(int *)((&local_e8[0] + 60)) = ((unsigned int)(((((unsigned long long)(unsigned int)((unsigned long)((unsigned int)(0))) << 32) | (unsigned int)((unsigned long)((unsigned int)(((((((unsigned int)(var0) == (unsigned int)(var11)) | ((long)((int)(var0)) < (long)((int)(var11)))) == 0) ? var0 : (unsigned long)((unsigned int)(var11))) - 1))))) / (unsigned int)((long)((int)(var11))))));
*(long *)((&local_e8[0] + 96)) = (int)(var11);
*(long *)((&local_e8[0] + 88)) = ((long)((int)(var11)) * 4);
var25 = (unsigned long)((unsigned int)(width));
*(long *)((&local_e8[0] + 48)) = (long)((long)(&local_78[0]));
*(long *)((&local_e8[0] + 16)) = (unsigned long)((unsigned int)(width));
left = 0;
do {
*(int *)((&local_e8[0] + 68)) = var25;
*(int *)((&local_e8[0] + 64)) = (((long)((int)(var0)) < (long)((int)(var25))) ? var0 : var25);
var32 = *(long *)((&local_e8[0] + 96));
*(long *)((&local_e8[0] + 40)) = var10;
var36 = ((unsigned int)(((unsigned long)((unsigned int)(var32)) * var10)) + width);
var38 = (((long)((int)(var0)) < (long)((int)(var36))) ? var0 : (unsigned long)((unsigned int)(var36)));
var39 = (unsigned long)((unsigned int)((var32 + left)));
var40 = (((long)((int)(var0)) < (long)((int)(var39))) ? var0 : var39);
var41 = (unsigned long)((unsigned int)((width + left)));
var43 = (((long)((int)(var0)) < (long)((int)(var41))) ? var0 : (unsigned long)((unsigned int)(var41)));
middle = ((((unsigned int)(var0) == (unsigned int)(var41)) | ((long)((int)(var0)) < (long)((int)(var41)))) ? var0 : var41);
var45 = (var32 + (unsigned long)((unsigned int)(left)));
*(long *)((&local_e8[0] + 104)) = var45;
*(int *)((&local_e8[0] + 8)) = (((long)((int)(var45)) < (long)((int)(var0))) ? var45 : (unsigned long)((unsigned int)(var0)));
var51 = (unsigned long)((unsigned int)(left));
i = (unsigned long)((unsigned int)(left));
j = (unsigned long)((unsigned int)(middle));
if (((((unsigned int)(middle) == (unsigned int)(left)) | (middle < left)) == 0)) {
var55 = (unsigned long)((unsigned int)(left));
j = (unsigned long)((unsigned int)(middle));
var51 = (unsigned long)((unsigned int)(left));
var56 = *(long *)((&local_e8[0] + 48));
i = (unsigned long)((unsigned int)(left));
if (((long)(middle) < (long)((int)(*(int *)((&local_e8[0] + 8)))))) {
var57 = var51;
var58 = var55;
var59 = (unsigned long)((unsigned int)(j));
while (1) {
var62 = (unsigned long)((unsigned int)(*(int *)((var1 + ((long)((int)(var58)) * 4)))));
var64 = (unsigned long)((unsigned int)(*(int *)((var1 + ((long)((int)(var59)) * 4)))));
var45 = ((((unsigned int)(var62) == (unsigned int)(var64)) | ((long)((int)(var62)) < (long)((int)(var64)))) & 255);
var73 = ((long)((int)(var58)) + var45);
i = (unsigned long)((unsigned int)(var73));
j = (unsigned long)((unsigned int)(((long)((int)(var59)) + ((((unsigned int)(var62) == (unsigned int)(var64)) | ((long)((int)(var62)) < (long)((int)(var64)))) == 0))));
*(int *)((var56)) = (((((unsigned int)(var62) == (unsigned int)(var64)) | ((long)((int)(var62)) < (long)((int)(var64)))) == 0) ? var64 : var62);
var75 = (var57 + 1);
var57 = (unsigned long)((unsigned int)(var75));
var51 = (unsigned long)((unsigned int)(var75));
if ((middle <= var73)) {
break;
}
var56 = (var56 + 4);
var58 = (unsigned long)((unsigned int)(i));
var59 = (unsigned long)((unsigned int)(j));
var51 = var57;
if (((long)((int)(*(int *)((&local_e8[0] + 8)))) <= (long)(j))) {
break;
}
}
}
}
if ((middle <= i)) {
var76 = *(long *)((&local_e8[0] + 16));
var77 = *(long *)((&local_e8[0] + 40));
var78 = (unsigned long)((unsigned int)(left));
var79 = var51;
var80 = var77;
var81 = var0;
var82 = var76;
if (((long)(j) < (long)((int)(*(int *)((&local_e8[0] + 8)))))) {
L_1448: ;
var89 = var78;
var90 = (unsigned long)((unsigned int)(var40));
var91 = memcpy((void *)((&local_78[0] + ((long)((int)(var79)) * 4))), (const void *)((var1 + ((long)(j) * 4))), (__SIZE_TYPE__)((((unsigned long)((unsigned int)(((~j) + var40))) * 4) + 4)));
var93 = var90;
var95 = var89;
var96 = var80;
var0 = var81;
var97 = var82;
} else {
var95 = (unsigned long)((unsigned int)(left));
var93 = var40;
var96 = var77;
var97 = var76;
}
} else {
*(long *)((&local_e8[0] + 24)) = (unsigned long)((unsigned int)(var40));
*(long *)((&local_e8[0] + 32)) = (unsigned long)((unsigned int)(left));
*(long *)((&local_e8[0] + 80)) = (int)(var38);
var101 = (long)((int)(var51));
var102 = (long)(i);
var107 = memcpy((void *)((&local_78[0] + ((long)((int)(var51)) * 4))), (const void *)((var1 + ((long)(i) * 4))), (__SIZE_TYPE__)((((unsigned long)((unsigned int)((var43 + (~(unsigned long)((unsigned int)(i)))))) * 4) + 4)));
var110 = (*(long *)((&local_e8[0] + 80)) - var102);
if (((unsigned long)(4) <= (unsigned long)(var110))) {
var111 = (long)((int)(*(int *)((&local_e8[0] + 64))));
var113 = (var110 & -4);
var114 = (unsigned int)(var101);
var115 = (((unsigned long)(var101) >> 32) & 0xffffffff);
var116 = 0;
var117 = 0;
var118 = (var113 - 4);
var121 = (((unsigned long)(var118) >> 2) + 1);
var123 = 0;
var124 = 0;
var125 = 0;
var126 = 0;
if (((unsigned long)(28) <= (unsigned long)(var118))) {
var133 = ((((unsigned long)((((var111 - var102) & -4) - 4)) >> 2) + 1) & -8);
var135 = 0;
var136 = 0;
var137 = 0;
var138 = 0;
var139 = -1;
var140 = -1;
var141 = -1;
var142 = -1;
var144 = 8;
var145 = 0;
var146 = 8;
var147 = 0;
var148 = *(long *)((&local_e8[0] + 32));
var40 = *(long *)((&local_e8[0] + 24));
do {
t110 = (((unsigned long)((unsigned int)(var115)) | (unsigned long)((unsigned int)(var114))) + ((unsigned long)((unsigned int)(var145)) | (unsigned long)((unsigned int)(var144))));
var114 = (unsigned int)(t110);
var115 = (((unsigned long)(t110) >> 32) & 0xffffffff);
t113 = (((unsigned long)((unsigned int)(var117)) | (unsigned long)((unsigned int)(var116))) + ((unsigned long)((unsigned int)(var147)) | (unsigned long)((unsigned int)(var146))));
var116 = (unsigned int)(t113);
var117 = (((unsigned long)(t113) >> 32) & 0xffffffff);
t606 = (((unsigned long)((unsigned int)(var136)) | (unsigned long)((unsigned int)(var135))) + ((unsigned long)((unsigned int)(var145)) | (unsigned long)((unsigned int)(var144))));
var135 = (unsigned int)(t606);
var136 = (((unsigned long)(t606) >> 32) & 0xffffffff);
t621 = (((unsigned long)((unsigned int)(var138)) | (unsigned long)((unsigned int)(var137))) + ((unsigned long)((unsigned int)(var147)) | (unsigned long)((unsigned int)(var146))));
var137 = (unsigned int)(t621);
var138 = (((unsigned long)(t621) >> 32) & 0xffffffff);
var133 = (var133 - 8);
var78 = var148;
var151 = (unsigned int)(t110);
var152 = var115;
var153 = (unsigned int)(t113);
var154 = var117;
var123 = (unsigned int)(t606);
var124 = var136;
var125 = (unsigned int)(t621);
var126 = var138;
} while ((var133 != 0));
} else {
var139 = -1;
var140 = -1;
var141 = -1;
var142 = -1;
var40 = *(long *)((&local_e8[0] + 24));
var78 = *(long *)((&local_e8[0] + 32));
var151 = var114;
var152 = var115;
var153 = var116;
var154 = var117;
}
var156 = var151;
var157 = var152;
var158 = var153;
var159 = var154;
var160 = var123;
var161 = var124;
var162 = var125;
var163 = var126;
if (((unsigned long)((unsigned char)((var121 & 7))) != 0)) {
var176 = (unsigned long)((unsigned int)(((unsigned int)((unsigned char)((((((unsigned long)((unsigned char)(((((unsigned long)((unsigned int)((var111 - i))) & 28) - 4) & 255))) >> 2) & 255) + 1) & 255))) & 7)));
do {
t607 = (((unsigned long)((unsigned int)(var152)) | (unsigned long)((unsigned int)(var151))) - ((unsigned long)((unsigned int)(var140)) | (unsigned long)((unsigned int)(var139))));
var151 = (unsigned int)(t607);
var152 = (((unsigned long)(t607) >> 32) & 0xffffffff);
t622 = (((unsigned long)((unsigned int)(var154)) | (unsigned long)((unsigned int)(var153))) - ((unsigned long)((unsigned int)(var142)) | (unsigned long)((unsigned int)(var141))));
var153 = (unsigned int)(t622);
var154 = (((unsigned long)(t622) >> 32) & 0xffffffff);
t608 = (((unsigned long)((unsigned int)(var124)) | (unsigned long)((unsigned int)(var123))) - ((unsigned long)((unsigned int)(var140)) | (unsigned long)((unsigned int)(var139))));
var123 = (unsigned int)(t608);
var124 = (((unsigned long)(t608) >> 32) & 0xffffffff);
t623 = (((unsigned long)((unsigned int)(var126)) | (unsigned long)((unsigned int)(var125))) - ((unsigned long)((unsigned int)(var142)) | (unsigned long)((unsigned int)(var141))));
var125 = (unsigned int)(t623);
var126 = (((unsigned long)(t623) >> 32) & 0xffffffff);
var176 = (var176 - 1);
var156 = (unsigned int)(t607);
var157 = var152;
var158 = (unsigned int)(t622);
var159 = var154;
var160 = (unsigned int)(t608);
var161 = var124;
var162 = (unsigned int)(t623);
var163 = var126;
} while ((var176 != 0));
}
t609 = (((unsigned long)((unsigned int)(var157)) | (unsigned long)((unsigned int)(var156))) + ((unsigned long)((unsigned int)(var161)) | (unsigned long)((unsigned int)(var160))));
var180 = (((unsigned long)(t609) >> 32) & 0xffffffff);
t624 = (((unsigned long)((unsigned int)(var159)) | (unsigned long)((unsigned int)(var158))) + ((unsigned long)((unsigned int)(var163)) | (unsigned long)((unsigned int)(var162))));
ret = ((unsigned long)((unsigned int)(var180)) | (unsigned int)(t609));
t610 = (((((unsigned long)(t624) >> 32) & 0xffffffff) | (unsigned int)(t624)) + ((unsigned long)((unsigned int)(var180)) | (unsigned int)(t609)));
var192 = ((((unsigned long)(t610) >> 32) & 0xffffffff) | (unsigned int)(t610));
if ((var110 != var113)) {
var101 = var192;
var195 = (var102 + var113);
var196 = *(long *)((&local_e8[0] + 16));
L_1419: ;
var197 = (long)(middle);
var198 = *(long *)((&local_e8[0] + 40));
out = var101;
var200 = var195;
do {
var200 = (var200 + 1);
out = (out + 1);
var201 = (unsigned long)((unsigned int)(out));
var80 = var198;
var82 = var196;
} while ((var200 < var197));
} else {
var201 = var192;
var80 = *(long *)((&local_e8[0] + 40));
var82 = *(long *)((&local_e8[0] + 16));
}
} else {
var196 = *(long *)((&local_e8[0] + 16));
var40 = *(long *)((&local_e8[0] + 24));
var78 = *(long *)((&local_e8[0] + 32));
var195 = var102;
goto L_1419;
}
var81 = *(long *)((&local_e8[0] + 72));
var79 = var201;
var95 = var78;
var93 = var40;
var96 = var80;
var0 = var81;
var97 = var82;
if (((long)((int)(*(int *)((&local_e8[0] + 8)))) <= (long)(j))) {
goto L_1478;
}
goto L_1448;
}
L_1478: ;
t214 = *(int *)((&local_e8[0] + 8));
if (((((unsigned int)(t214) == (unsigned int)(var95)) | ((long)((int)(t214)) < (long)((int)(var95)))) == 0)) {
var214 = memcpy((void *)((var1 + (var95 * 4))), (const void *)((&local_78[0] + (var95 * 4))), (__SIZE_TYPE__)((((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_e8[0] + 56)))) * var96))) + var93))) - 1))) * 4) + 4)));
}
*(long *)((&local_e8[0] + 48)) = (*(long *)((&local_e8[0] + 48)) + *(long *)((&local_e8[0] + 88)));
var25 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_e8[0] + 68)))) + *(int *)((&local_e8[0] + 12)))));
var10 = (unsigned long)((unsigned int)((var96 + 1)));
left = *(long *)((&local_e8[0] + 104));
width = var97;
} while (((unsigned int)(var96) != (unsigned int)(*(int *)((&local_e8[0] + 60)))));
var3 = (unsigned long)((unsigned int)(*(int *)((&local_e8[0] + 12))));
width = (unsigned long)((unsigned int)(var3));
var2 = var0;
} while (((long)((int)(var3)) < (long)((int)(var0))));
}
if ((((unsigned long)((unsigned int)(var2)) == 0) | ((long)((int)(var2)) < 0))) {
return 0;
} else {
return (unsigned int)(*(int *)((var1 + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) >> 1))) * 4))));
}
} gcc -O0
1/1merge_sort_i32 pass 89 lines
// glaurung: merge_sort_i32 @ 0x1119
int32_t merge_sort_i32(int32_t * arg0, int32_t arg1) {
extern __attribute__((noreturn)) void __stack_chk_fail(void);
int width;
int left;
int middle;
int right;
int i;
int j;
int out;
unsigned char local_50[64];
long local_8;
long ret;
int var14;
long var28;
long var34;
long var35;
long var41;
long var42;
long var48;
long var52;
long var58;
long var63;
long var69;
int var7;
// x86-64 prologue: save rbp
local_8 = (long)(0x28);
if ((((arg0 == 0) || ((long)(arg1) < 0)) || (((unsigned long)((unsigned int)(arg1)) != 16) && (16 <= (long)(arg1))))) {
ret = 0xffffffff;
} else {
width = 1;
while ((width < arg1)) {
left = 0;
while ((left < arg1)) {
var7 = ((unsigned int)(left) + (unsigned int)(width));
middle = (((((unsigned int)(arg1) == (unsigned int)(var7)) | (arg1 < var7)) == 0) ? (unsigned long)((unsigned int)(var7)) : (unsigned long)((unsigned int)(arg1)));
var14 = ((unsigned int)(((unsigned long)((unsigned int)(width)) + (unsigned long)((unsigned int)(width)))) + (unsigned int)(left));
right = (((((unsigned int)(arg1) == (unsigned int)(var14)) | (arg1 < var14)) == 0) ? (unsigned long)((unsigned int)(var14)) : (unsigned long)((unsigned int)(arg1)));
i = left;
j = middle;
out = left;
while ((i < middle)) {
if ((right <= j)) {
break;
}
var28 = (unsigned long)((unsigned int)(arg0[(long)(i)]));
var34 = (unsigned long)((unsigned int)(arg0[(long)(j)]));
if (((((unsigned int)(var28) == (unsigned int)(var34)) | ((long)((int)(var28)) < (long)((int)(var34)))) == 0)) {
var35 = (unsigned long)((unsigned int)(j));
j = ((unsigned int)(j) + 1);
var41 = (unsigned long)((unsigned int)(arg0[(long)((int)(var35))]));
} else {
var42 = (unsigned long)((unsigned int)(i));
i = ((unsigned int)(i) + 1);
var41 = (unsigned long)((unsigned int)(arg0[(long)((int)(var42))]));
}
var48 = (unsigned long)((unsigned int)(out));
out = ((unsigned int)(out) + 1);
*(int *)((&local_50[0] + ((long)((int)(var48)) * 4))) = var41;
}
while ((i < middle)) {
var52 = (unsigned long)((unsigned int)(i));
i = ((unsigned int)(i) + 1);
var58 = (unsigned long)((unsigned int)(out));
out = ((unsigned int)(out) + 1);
*(int *)((&local_50[0] + ((long)((int)(var58)) * 4))) = arg0[(long)((int)(var52))];
}
while ((j < right)) {
var63 = (unsigned long)((unsigned int)(j));
j = ((unsigned int)(j) + 1);
var69 = (unsigned long)((unsigned int)(out));
out = ((unsigned int)(out) + 1);
*(int *)((&local_50[0] + ((long)((int)(var69)) * 4))) = arg0[(long)((int)(var63))];
}
for (i = left; (i < right); i++) {
arg0[(long)(i)] = *(int *)((&local_50[0] + ((long)(i) * 4)));
}
left = (left + (unsigned int)(((unsigned long)((unsigned int)(width)) + (unsigned long)((unsigned int)(width)))));
}
width = (width << 1);
}
ret = ((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0)) ? 0 : (unsigned long)((unsigned int)(arg0[(long)((int)(((int)(((unsigned long)((unsigned int)(arg1)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) >> 31))))) >> 1)))])));
}
if ((local_8 != 0x28)) {
__stack_chk_fail();
}
// x86-64 epilogue: restore rbp
return ret;
} gcc -O2
1/1merge_sort_i32 pass 179 lines
// glaurung: merge_sort_i32 @ 0x1140
int32_t merge_sort_i32(int32_t * arg0, int32_t arg1) {
extern __attribute__((noreturn)) void __stack_chk_fail(void);
extern void * memcpy(void *, const void *, __SIZE_TYPE__);
int left;
int j;
int right;
int i;
int width;
long local_40;
unsigned char local_88[64];
int local_8c;
unsigned char local_b8[44];
long ret;
int var13;
long var17;
long var20;
int var22;
long var3;
long var30;
long var32;
int var33;
long var34;
long var35;
long var36;
long var37;
long var38;
long var39;
long var4;
long var40;
long var41;
long var44;
int var46;
long var48;
long var49;
long var5;
void * var55;
long var66;
long var67;
long var7;
void * var73;
void * var80;
local_40 = (long)(0x28);
if ((arg0 == 0)) {
goto L_1356;
}
var3 = (unsigned long)((unsigned int)(arg1));
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
goto L_1356;
}
local_8c = 1;
var4 = (long)arg0;
if ((((unsigned long)((unsigned int)(arg1)) == 1) | ((long)(arg1) < 1))) {
goto L_134e;
}
L_1190: ;
var7 = 0;
*(int *)((&local_b8[0] + 40)) = local_8c;
var13 = ((unsigned int)(local_8c) + (unsigned int)(local_8c));
local_8c = var13;
*(long *)((&local_b8[0] + 32)) = ((long)((int)(var13)) << 2);
var5 = 0;
L_11b0: ;
var17 = (unsigned long)((unsigned int)(*(int *)((&local_b8[0] + 40))));
left = (unsigned long)((unsigned int)(var5));
*(int *)((&local_b8[0] + 12)) = var5;
var20 = (unsigned long)((unsigned int)((var17 + var5)));
j = ((((unsigned int)(var20) == (unsigned int)(var3)) | ((long)((int)(var20)) < (long)((int)(var3)))) ? var20 : (unsigned long)((unsigned int)(var3)));
var22 = (var20 + var17);
var5 = (unsigned long)((unsigned int)(var22));
right = ((((unsigned int)(var3) == (unsigned int)(var22)) | ((long)((int)(var3)) < (long)((int)(var22)))) ? var3 : (unsigned long)((unsigned int)(var22)));
if ((right <= j)) {
goto L_1340;
}
if ((((unsigned int)(j) == (unsigned int)(left)) | (j < left))) {
goto L_1340;
}
var30 = (long)((int)((left + 1)));
i = (unsigned long)((unsigned int)(left));
var32 = (unsigned long)((unsigned int)(j));
goto L_1218;
L_1200: ;
var33 = (i + 1);
var34 = (unsigned long)((unsigned int)(var33));
*(int *)((&local_88[0] + ((var30 * 4) - 4))) = var35;
var36 = (unsigned long)((unsigned int)(var30));
var37 = (var30 + 1);
var38 = (unsigned long)((unsigned int)(var30));
var39 = var32;
var40 = (unsigned long)((unsigned int)(var33));
var41 = var32;
if ((j <= var33)) {
goto L_123f;
}
L_1213: ;
var30 = var37;
i = var34;
var32 = var39;
var36 = var38;
var40 = var34;
var41 = var39;
if (((long)(right) <= (long)((int)(var39)))) {
goto L_123f;
}
L_1218: ;
var35 = (unsigned long)((unsigned int)(*(int *)((var4 + ((long)(i) * 4)))));
var44 = (unsigned long)((unsigned int)(*(int *)((var4 + ((long)((int)(var32)) * 4)))));
if ((((unsigned int)(var35) == (unsigned int)(var44)) | ((long)((int)(var35)) < (long)((int)(var44))))) {
goto L_1200;
}
var36 = (unsigned long)((unsigned int)(var30));
var46 = (var32 + 1);
var39 = (unsigned long)((unsigned int)(var46));
*(int *)((&local_88[0] + ((var30 * 4) - 4))) = var44;
var38 = (unsigned long)((unsigned int)(var30));
var37 = (var30 + 1);
var34 = (unsigned long)((unsigned int)(i));
var40 = (unsigned long)((unsigned int)(i));
var41 = (unsigned long)((unsigned int)(var46));
if ((i < j)) {
goto L_1213;
}
L_123f: ;
var48 = (unsigned long)((unsigned int)(left));
var49 = (unsigned long)((unsigned int)(right));
if (((((unsigned int)(j) == (unsigned int)(var40)) | ((long)(j) < (long)((int)(var40)))) == 0)) {
*(int *)((&local_b8[0] + 28)) = left;
*(int *)((&local_b8[0] + 24)) = right;
*(int *)((&local_b8[0] + 20)) = var36;
*(int *)((&local_b8[0] + 16)) = j;
var55 = memcpy((void *)((&local_88[0] + ((long)((int)(var36)) * 4))), (const void *)((var4 + ((long)((int)(var40)) * 4))), (__SIZE_TYPE__)((((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((j - 1))) - var40))) * 4) + 4)));
var36 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((&local_b8[0] + 16)))) + (unsigned long)((unsigned int)(*(int *)((&local_b8[0] + 20))))))) - var40)));
var48 = (unsigned long)((unsigned int)(*(int *)((&local_b8[0] + 28))));
var49 = (unsigned long)((unsigned int)(*(int *)((&local_b8[0] + 24))));
}
var66 = var48;
var67 = var49;
if (((((unsigned int)(var49) == (unsigned int)(var41)) | ((long)((int)(var49)) < (long)((int)(var41)))) == 0)) {
*(int *)((&local_b8[0] + 20)) = var48;
*(int *)((&local_b8[0] + 16)) = var49;
var73 = memcpy((void *)((&local_88[0] + ((long)((int)(var36)) * 4))), (const void *)((var4 + ((long)((int)(var41)) * 4))), (__SIZE_TYPE__)((((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var49 - 1))) - var41))) * 4) + 4)));
var66 = (unsigned long)((unsigned int)(*(int *)((&local_b8[0] + 20))));
var67 = (unsigned long)((unsigned int)(*(int *)((&local_b8[0] + 16))));
}
if (((((unsigned int)(var67) == (unsigned int)(var66)) | ((long)((int)(var67)) < (long)((int)(var66)))) == 0)) {
var80 = memcpy((void *)((var4 + var7)), (const void *)((&local_88[0] + var7)), (__SIZE_TYPE__)((((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var67 - *(int *)((&local_b8[0] + 12))))) - 1))) * 4) + 4)));
}
var7 = (var7 + *(long *)((&local_b8[0] + 32)));
if (((((unsigned int)(var3) == (unsigned int)(var5)) | ((long)((int)(var3)) < (long)((int)(var5)))) == 0)) {
goto L_11b0;
}
if (((long)(local_8c) < (long)((int)(var3)))) {
goto L_1190;
}
L_130f: ;
ret = (unsigned long)((unsigned int)(*(int *)((var4 + ((long)((int)(((int)(var3) >> 1))) * 4)))));
L_131a: ;
if ((local_40 != 0x28)) {
goto L_135d;
}
// x86-64 epilogue: tear down frame
return ret;
L_1340: ;
var36 = (unsigned long)((unsigned int)(left));
var40 = (unsigned long)((unsigned int)(left));
var41 = (unsigned long)((unsigned int)(j));
goto L_123f;
L_134e: ;
if (((unsigned long)((unsigned int)(arg1)) != 0)) {
goto L_130f;
}
ret = 0;
goto L_131a;
L_1356: ;
ret = 0xffffffff;
goto L_131a;
L_135d: ;
__stack_chk_fail();
}