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.

tests/decompiler_fixtures/src/24_merge_sort.c source
#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/1
merge_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/1
merge_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/1
merge_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/1
merge_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();
}

← 213 fixtures