Fixture 62

gaussian elimination

C · 1 functions · 4 lanes · 3 of 4 function-lanes behave identically

One lane has a function that returns a different result after decompilation: clang-O2 (0/1).

Gaussian elimination with partial pivoting on a Q16.16 augmented matrix. Row swapping through an index indirection, a scaled subtract across a row, and back-substitution in reverse order compose the densest 2D-indexing case in the corpus.

tests/decompiler_fixtures/src/62_gaussian_elimination.c source
#include <stdint.h>

/* Gaussian elimination with partial pivoting on a Q16.16 augmented matrix.
 * Row swapping through an index indirection, a scaled subtract across a row,
 * and back-substitution in reverse order compose the densest 2D-indexing case
 * in the corpus. */

#define GAUSS_DIM 4

static int32_t gauss_mul_q16(int32_t left, int32_t right) {
    return (int32_t)(((int64_t)left * (int64_t)right) >> 16);
}

static int32_t gauss_div_q16(int32_t numerator, int32_t denominator) {
    if (denominator == 0) {
        return 0;
    }
    return (int32_t)(((int64_t)numerator << 16) / (int64_t)denominator);
}

__attribute__((noinline)) int32_t
gaussian_solve(int32_t *augmented, int32_t dimension, int32_t *solution) {
    int32_t pivot;
    int32_t row;
    int32_t column;
    int32_t stride;
    if (augmented == 0 || solution == 0 || dimension < 1 ||
        dimension > GAUSS_DIM) {
        return -1;
    }
    stride = dimension + 1;
    for (pivot = 0; pivot < dimension; ++pivot) {
        int32_t best = pivot;
        int32_t best_magnitude;
        for (row = pivot + 1; row < dimension; ++row) {
            int32_t candidate = augmented[row * stride + pivot];
            int32_t current = augmented[best * stride + pivot];
            int32_t candidate_magnitude = (candidate < 0) ? -candidate : candidate;
            int32_t current_magnitude = (current < 0) ? -current : current;
            if (candidate_magnitude > current_magnitude) {
                best = row;
            }
        }
        if (best != pivot) {
            for (column = 0; column < stride; ++column) {
                int32_t swap = augmented[pivot * stride + column];
                augmented[pivot * stride + column] =
                    augmented[best * stride + column];
                augmented[best * stride + column] = swap;
            }
        }
        best_magnitude = augmented[pivot * stride + pivot];
        if (best_magnitude == 0) {
            return -2;
        }
        for (row = pivot + 1; row < dimension; ++row) {
            int32_t factor =
                gauss_div_q16(augmented[row * stride + pivot], best_magnitude);
            for (column = pivot; column < stride; ++column) {
                augmented[row * stride + column] -=
                    gauss_mul_q16(factor, augmented[pivot * stride + column]);
            }
        }
    }
    for (row = dimension - 1; row >= 0; --row) {
        int32_t accumulator = augmented[row * stride + dimension];
        for (column = row + 1; column < dimension; ++column) {
            accumulator -=
                gauss_mul_q16(augmented[row * stride + column], solution[column]);
        }
        solution[row] = gauss_div_q16(accumulator, augmented[row * stride + row]);
    }
    return dimension;
}

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 -O2

0/1
gaussian_solve fail 791 lines
// glaurung: gaussian_solve @ 0x1100
__attribute__((no_stack_protector)) int32_t gaussian_solve(int32_t * arg0, int32_t arg1, int32_t * arg2) {
    int stride;
    int pivot;
    int candidate;
    int current;
    int row;
    int column;
    int accumulator;
    int best;
    int candidate_magnitude;
    int current_magnitude;
    int swap;
    long local_100;
    unsigned char local_80[128];
    long local_88;
    long local_90;
    long local_98;
    long local_a0;
    long local_a8;
    long local_b0;
    long local_b8;
    long local_c0;
    long local_c8;
    long local_d8;
    long local_e0;
    long local_e8;
    int local_f0;
    long ret;
    long t1025;
    long t1026;
    long t1027;
    long t1028;
    long t1029;
    long t1030;
    long t1031;
    long t1032;
    long t1033;
    long t1034;
    long t1035;
    long t1036;
    long t1037;
    long t1038;
    long t1039;
    long t1040;
    long t1041;
    long t1042;
    long t1043;
    long t1082;
    long t1083;
    long t1084;
    long t1085;
    long t1086;
    long t1087;
    long t1088;
    long t1089;
    long t1090;
    long t1091;
    long t1092;
    long t1093;
    long t1094;
    long t1095;
    long t1096;
    long t1097;
    long t1098;
    long t1099;
    long t110;
    long t1100;
    long t113;
    long t1288;
    long t1289;
    long t1290;
    long t1291;
    long t1292;
    long t1293;
    long t1294;
    long t1295;
    long t1296;
    long t1297;
    long t1298;
    long t1299;
    long t1300;
    long t1301;
    long t1302;
    long t1303;
    long t1304;
    long t1305;
    long t1306;
    long t1307;
    long t1308;
    long t1309;
    long t1310;
    long t1311;
    long t1312;
    long t1313;
    long t1314;
    long t1315;
    long t1316;
    long t1375;
    long t1376;
    long t1377;
    long t1378;
    long t1379;
    long t1380;
    long t1381;
    long t1382;
    long t1383;
    long t1384;
    long t1385;
    long t1386;
    long t1387;
    long t1388;
    long t1389;
    long t1390;
    long t1391;
    long t1392;
    long t1393;
    long t1394;
    long t1395;
    long t1396;
    long t1397;
    long t1398;
    long t1399;
    long t1400;
    long t1401;
    long t1402;
    long t1403;
    long t160;
    long t163;
    long t190;
    long t191;
    long t85;
    long var1;
    long var100;
    long var102;
    long var105;
    long var106;
    long var107;
    long var108;
    long var109;
    long var110;
    long var112;
    long var114;
    long var118;
    long var125;
    long var13;
    long var130;
    long var131;
    long var133;
    int var143;
    int var145;
    int var153;
    int var155;
    long var158;
    long var159;
    long var16;
    long var161;
    int var162;
    int var163;
    int var164;
    int var165;
    long var20;
    long var23;
    long var25;
    long var26;
    int var271;
    int var272;
    int var273;
    int var274;
    int var275;
    int var276;
    int var277;
    int var278;
    int var279;
    int var280;
    int var281;
    long var3;
    long var32;
    long var34;
    long var36;
    long var38;
    long var386;
    long var388;
    int var389;
    long var39;
    int var390;
    int var391;
    int var392;
    int var40;
    long var42;
    long var43;
    int var498;
    int var499;
    int var500;
    long var511;
    long var530;
    long var531;
    long var535;
    long var537;
    long var538;
    long var543;
    long var546;
    long var549;
    long var551;
    long var554;
    long var557;
    long var559;
    int var563;
    long var569;
    long var572;
    long var573;
    int var574;
    int var575;
    int var576;
    int var577;
    int var579;
    int var580;
    int var581;
    int var582;
    long var584;
    long var585;
    long var586;
    int var587;
    int var588;
    int var589;
    long var59;
    int var590;
    int var591;
    int var592;
    int var593;
    int var594;
    int var595;
    int var596;
    int var597;
    int var598;
    int var599;
    int var600;
    int var601;
    int var602;
    long var63;
    long var64;
    long var66;
    long var68;
    long var7;
    long var70;
    long var72;
    long var75;
    long var76;
    long var79;
    long var8;
    long var82;
    int var869;
    int var870;
    long var881;
    long var894;
    long var896;
    long var897;
    long var9;
    long var911;
    long var914;
    long var916;
    long var94;
    // x86-64 prologue: save callee registers, frame 48 bytes
    ret = 0xffffffff;
    if (((unsigned long)((unsigned long)((unsigned int)((arg1 - 5)))) < (unsigned long)(0xfffffffc))) {
        // x86-64 epilogue: restore callee registers
        return ret;
    }
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore callee registers
        return ret;
    }
    var1 = (long)arg2;
    if ((arg2 == 0)) {
        // x86-64 epilogue: restore callee registers
        return ret;
    }
    stride = (unsigned long)((unsigned int)((arg1 + 1)));
    var3 = (unsigned long)((unsigned int)(arg1));
    local_a8 = var1;
    local_e8 = (unsigned int)(arg1);
    var7 = (unsigned long)((unsigned int)(arg1));
    var8 = (unsigned long)((unsigned int)(arg1));
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        goto L_16f0;
    }
    var9 = ((unsigned long)((unsigned int)(stride)) * 4);
    local_88 = (((unsigned long)((unsigned int)(stride)) * 4) + 4);
    local_c0 = (-(unsigned long)((unsigned int)(stride)));
    var13 = (long)(((long)arg0 + ((unsigned long)((unsigned int)(stride)) * 4)));
    local_90 = (long)((((long)arg0 + ((unsigned long)((unsigned int)(stride)) * 4)) + 16));
    var16 = (long)((arg0 + 4));
    local_98 = ((unsigned long)((unsigned int)(stride)) - 4);
    local_a0 = (long)((((long)arg0 + ((unsigned long)((unsigned int)(stride)) * 4)) + 4));
    var20 = 1;
    var23 = (long)arg0;
    *(long *)((&local_80[0] + 32)) = var9;
    pivot = 0;
    var25 = (long)arg0;
    var26 = (unsigned long)((unsigned int)(arg1));
    goto L_1208;
    L_11c0: ;
    var20 = (long)((int)((*(long *)(&local_80[0]) + 1)));
    var13 = (*(long *)((&local_80[0] + 16)) + local_88);
    local_90 = (local_90 + local_88);
    var16 = (var16 + local_88);
    local_98 = (local_98 - 1);
    local_a0 = (local_a0 + var9);
    var23 = (var23 + var9);
    var32 = *(long *)((&local_80[0] + 8));
    var3 = local_e8;
    var1 = local_a8;
    pivot = var32;
    var7 = local_e8;
    var8 = var26;
    if ((var32 == local_e8)) {
        goto L_16f0;
    }
    L_1208: ;
    var34 = ((unsigned long)((unsigned int)(pivot)) + 1);
    *(long *)((&local_80[0] + 8)) = var34;
    if (((unsigned long)(var3) <= (unsigned long)(var34))) {
        goto L_1270;
    }
    var36 = var13;
    var38 = (unsigned long)((unsigned int)(pivot));
    var39 = (unsigned long)((unsigned int)(var20));
    goto L_123d;
    L_1230: ;
    var36 = (var36 + var9);
    var40 = (var39 + 1);
    var39 = (unsigned long)((unsigned int)(var40));
    var38 = (unsigned long)((unsigned int)(var42));
    var43 = var42;
    if (((unsigned int)(var26) == (unsigned int)(var40))) {
        goto L_1273;
    }
    L_123d: ;
    candidate = (unsigned long)((unsigned int)(*(int *)((var36))));
    current = (unsigned long)((unsigned int)(*(int *)((var25 + (((long)((int)(((unsigned long)((unsigned int)(stride)) * var38))) + pivot) * 4)))));
    t190 = (-(unsigned long)((unsigned int)(candidate)));
    t191 = (-(unsigned long)((unsigned int)(current)));
    var42 = (unsigned long)((unsigned int)(var39));
    if (((unsigned long)((unsigned long)((unsigned int)((((long)((int)(t191)) < 0) ? current : t191)))) < (unsigned long)((unsigned long)((unsigned int)((((long)((int)(t190)) < 0) ? candidate : t190)))))) {
        goto L_1230;
    }
    var42 = (unsigned long)((unsigned int)(var38));
    goto L_1230;
    L_1270: ;
    var43 = (unsigned long)((unsigned int)(pivot));
    L_1273: ;
    var59 = ((unsigned long)((unsigned int)(pivot)) * (unsigned long)((unsigned int)(stride)));
    if ((pivot != (unsigned long)((unsigned int)(var43)))) {
        var63 = (long)((int)((var43 * stride)));
        var64 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4))));
        *(int *)((var25 + var59 * 4)) = *(int *)((var25 + var63 * 4));
        *(int *)((var25 + var63 * 4)) = var64;
        var66 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4 + 0x4))));
        *(int *)((var25 + var59 * 4 + 0x4)) = *(int *)((var25 + var63 * 4 + 0x4));
        *(int *)((var25 + var63 * 4 + 0x4)) = var66;
        if (((unsigned long)((unsigned int)(stride)) != 2)) {
            var68 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4 + 0x8))));
            *(int *)((var25 + var59 * 4 + 0x8)) = *(int *)((var25 + var63 * 4 + 0x8));
            *(int *)((var25 + var63 * 4 + 0x8)) = var68;
            if (((unsigned long)((unsigned int)(stride)) != 3)) {
                var70 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4 + 0xc))));
                *(int *)((var25 + var59 * 4 + 0xc)) = *(int *)((var25 + var63 * 4 + 0xc));
                *(int *)((var25 + var63 * 4 + 0xc)) = var70;
                if (((unsigned long)((unsigned int)(stride)) != 4)) {
                    var72 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4 + 0x10))));
                    *(int *)((var25 + var59 * 4 + 0x10)) = *(int *)((var25 + var63 * 4 + 0x10));
                    *(int *)((var25 + var63 * 4 + 0x10)) = var72;
                }
            }
        }
    }
    var75 = (long)((int)(*(int *)((var25 + ((pivot + var59) * 4)))));
    var76 = local_e8;
    if ((var75 == 0)) {
        // x86-64 epilogue: restore callee registers
        return 0xfffffffe;
    }
    local_e0 = var59;
    local_100 = (unsigned long)((unsigned int)(pivot));
    *(long *)(&local_80[0]) = var20;
    *(long *)((&local_80[0] + 16)) = var13;
    if (((unsigned long)(var76) <= (unsigned long)(*(long *)((&local_80[0] + 8))))) {
        goto L_11c0;
    }
    var79 = ((unsigned long)((unsigned int)(stride)) - local_100);
    var82 = (var79 - 4);
    *(long *)((&local_80[0] + 64)) = var82;
    *(long *)((&local_80[0] + 24)) = ((((unsigned long)(local_98) >> 2) + 1) & -2);
    *(long *)((&local_80[0] + 56)) = (((unsigned long)(var82) >> 2) + 1);
    local_c8 = ((local_88 * local_100) + var25);
    local_b0 = (var25 + ((local_e0 + (unsigned long)((unsigned int)(stride))) * 4));
    var94 = *(long *)(&local_80[0]);
    local_b8 = ((var94 * (unsigned long)((unsigned int)(stride))) + local_100);
    *(long *)((&local_80[0] + 72)) = ((var94 + 1) * (unsigned long)((unsigned int)(stride)));
    local_f0 = var79;
    var100 = (var79 & -4);
    *(long *)((&local_80[0] + 48)) = var100;
    *(long *)((&local_80[0] + 40)) = (local_100 + var100);
    var102 = local_a0;
    var105 = 0;
    local_d8 = var75;
    var106 = local_90;
    var107 = var9;
    var108 = var94;
    var109 = var25;
    var110 = var26;
    goto L_13ec;
    L_13d0: ;
    row = (var108 + 1);
    var105 = (var105 + 1);
    var106 = (var106 + var9);
    var102 = (var102 + var9);
    var75 = local_d8;
    var107 = var9;
    var108 = (unsigned long)((unsigned int)(row));
    var109 = var25;
    var110 = var26;
    if (((unsigned int)(row) == (unsigned int)(var26))) {
        goto L_11c0;
    }
    L_13ec: ;
    var114 = (var108 * (unsigned long)((unsigned int)(stride)));
    var118 = ((long)((int)(*(int *)((var109 + ((local_100 + var114) * 4))))) << 16);
    if ((((unsigned long)((var118 | var75)) >> 32) != 0)) {
        var125 = ((long)((((__int128)(long)(((long)(var118) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var118)) / (long)(var75)));
        goto L_1424;
    }
    var125 = ((unsigned int)(((((unsigned long long)(unsigned int)((unsigned long)((unsigned int)(0))) << 32) | (unsigned int)(var118)) / (unsigned int)(var75))));
    L_1424: ;
    var130 = (long)((int)(var125));
    var131 = local_100;
    var9 = var107;
    var25 = var109;
    var26 = var110;
    if (((unsigned long)(local_f0) < (unsigned long)(4))) {
        goto L_1680;
    }
    var133 = (var105 * (unsigned long)((unsigned int)(stride)));
    if (((unsigned long)((var109 + ((local_b8 + var133) * 4))) < (unsigned long)(local_b0))) {
        var133 = (var133 + *(long *)((&local_80[0] + 72)));
        var131 = local_100;
        var9 = var107;
        var25 = var109;
        var26 = var110;
        if (((unsigned long)(local_c8) < (unsigned long)((var109 + (var133 * 4))))) {
            goto L_1680;
        }
    }
    t85 = (((unsigned long)(var130) >> 32) & 0xffffffff);
    var143 = (unsigned int)(var130);
    var145 = (unsigned int)(var130);
    var153 = (unsigned int)(((unsigned long)((t85 | (unsigned int)(var130))) >> 32));
    var155 = (unsigned int)(((unsigned long)((t85 | (unsigned int)(var130))) >> 32));
    if (((unsigned long)(*(long *)((&local_80[0] + 64))) < (unsigned long)(4))) {
        var158 = 0;
        goto L_15bb;
    }
    var159 = *(long *)((&local_80[0] + 24));
    var161 = 0;
    do {
        var162 = *(int *)((var16 + var161 * 4 - 0x10));
        var163 = *(int *)((var16 + var161 * 4 - 0xc));
        var164 = *(int *)((var16 + var161 * 4 - 0x8));
        var165 = *(int *)((var16 + var161 * 4 - 0x4));
        t160 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var164)));
        t163 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var165)));
        t1288 = ((unsigned long)((unsigned int)(var164)) * (unsigned long)((unsigned int)(var153)));
        t1375 = ((unsigned long)((unsigned int)(var165)) * (unsigned long)((unsigned int)(var155)));
        t1289 = ((unsigned long)((unsigned int)((-(var164 < 0)))) * (unsigned long)((unsigned int)(var143)));
        t1376 = ((unsigned long)((unsigned int)((-(var165 < 0)))) * (unsigned long)((unsigned int)(var145)));
        t110 = (((((unsigned long)(t1289) >> 32) & 0xffffffff) | (unsigned int)(t1289)) + ((((unsigned long)(t1288) >> 32) & 0xffffffff) | (unsigned int)(t1288)));
        t113 = (((((unsigned long)(t1376) >> 32) & 0xffffffff) | (unsigned int)(t1376)) + ((((unsigned long)(t1375) >> 32) & 0xffffffff) | (unsigned int)(t1375)));
        /* asm: psllq */
        t1025 = (((((unsigned long)(t110) >> 32) & 0xffffffff) | (unsigned int)(t110)) + ((((unsigned long)(t160) >> 32) & 0xffffffff) | (unsigned int)(t160)));
        t1082 = (((((unsigned long)(t113) >> 32) & 0xffffffff) | (unsigned int)(t113)) + ((((unsigned long)(t163) >> 32) & 0xffffffff) | (unsigned int)(t163)));
        t1290 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var162)));
        t1377 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var163)));
        t1291 = ((unsigned long)((unsigned int)(var162)) * (unsigned long)((unsigned int)(var153)));
        t1378 = ((unsigned long)((unsigned int)(var163)) * (unsigned long)((unsigned int)(var155)));
        t1292 = ((unsigned long)((unsigned int)((-(var162 < 0)))) * (unsigned long)((unsigned int)(var143)));
        t1379 = ((unsigned long)((unsigned int)((-(var163 < 0)))) * (unsigned long)((unsigned int)(var145)));
        t1026 = (((((unsigned long)(t1292) >> 32) & 0xffffffff) | (unsigned int)(t1292)) + ((((unsigned long)(t1291) >> 32) & 0xffffffff) | (unsigned int)(t1291)));
        t1083 = (((((unsigned long)(t1379) >> 32) & 0xffffffff) | (unsigned int)(t1379)) + ((((unsigned long)(t1378) >> 32) & 0xffffffff) | (unsigned int)(t1378)));
        /* asm: psllq */
        t1027 = (((((unsigned long)(t1026) >> 32) & 0xffffffff) | (unsigned int)(t1026)) + ((((unsigned long)(t1290) >> 32) & 0xffffffff) | (unsigned int)(t1290)));
        t1084 = (((((unsigned long)(t1083) >> 32) & 0xffffffff) | (unsigned int)(t1083)) + ((((unsigned long)(t1377) >> 32) & 0xffffffff) | (unsigned int)(t1377)));
        var271 = (*(int *)((var106 + var161 * 4 - 0xc)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1084) >> 32) & 0xffffffff) | (unsigned int)(t1084))) >> 16)));
        var272 = (*(int *)((var106 + var161 * 4 - 0x8)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1025) >> 32) & 0xffffffff) | (unsigned int)(t1025))) >> 16)));
        var273 = (*(int *)((var106 + var161 * 4 - 0x4)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1082) >> 32) & 0xffffffff) | (unsigned int)(t1082))) >> 16)));
        var274 = *(int *)((var106 + var161 * 4));
        var275 = *(int *)((var106 + var161 * 4 + 0x4));
        var276 = *(int *)((var106 + var161 * 4 + 0x8));
        var277 = *(int *)((var106 + var161 * 4 + 0xc));
        *(int *)((var106 + var161 * 4 - 0x10)) = (*(int *)((var106 + var161 * 4 - 0x10)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1027) >> 32) & 0xffffffff) | (unsigned int)(t1027))) >> 16)));
        *(int *)((var106 + var161 * 4 - 0xc)) = var271;
        *(int *)((var106 + var161 * 4 - 0x8)) = var272;
        *(int *)((var106 + var161 * 4 - 0x4)) = var273;
        var278 = *(int *)((var16 + var161 * 4));
        var279 = *(int *)((var16 + var161 * 4 + 0x4));
        var280 = *(int *)((var16 + var161 * 4 + 0x8));
        var281 = *(int *)((var16 + var161 * 4 + 0xc));
        t1293 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var280)));
        t1380 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var281)));
        t1294 = ((unsigned long)((unsigned int)(var280)) * (unsigned long)((unsigned int)(var153)));
        t1381 = ((unsigned long)((unsigned int)(var281)) * (unsigned long)((unsigned int)(var155)));
        t1295 = ((unsigned long)((unsigned int)((-(var280 < 0)))) * (unsigned long)((unsigned int)(var143)));
        t1382 = ((unsigned long)((unsigned int)((-(var281 < 0)))) * (unsigned long)((unsigned int)(var145)));
        t1028 = (((((unsigned long)(t1295) >> 32) & 0xffffffff) | (unsigned int)(t1295)) + ((((unsigned long)(t1294) >> 32) & 0xffffffff) | (unsigned int)(t1294)));
        t1085 = (((((unsigned long)(t1382) >> 32) & 0xffffffff) | (unsigned int)(t1382)) + ((((unsigned long)(t1381) >> 32) & 0xffffffff) | (unsigned int)(t1381)));
        /* asm: psllq */
        t1029 = (((((unsigned long)(t1028) >> 32) & 0xffffffff) | (unsigned int)(t1028)) + ((((unsigned long)(t1293) >> 32) & 0xffffffff) | (unsigned int)(t1293)));
        t1086 = (((((unsigned long)(t1085) >> 32) & 0xffffffff) | (unsigned int)(t1085)) + ((((unsigned long)(t1380) >> 32) & 0xffffffff) | (unsigned int)(t1380)));
        t1296 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var278)));
        t1383 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var279)));
        t1297 = ((unsigned long)((unsigned int)(var278)) * (unsigned long)((unsigned int)(var153)));
        t1384 = ((unsigned long)((unsigned int)(var279)) * (unsigned long)((unsigned int)(var155)));
        t1298 = ((unsigned long)((unsigned int)((-(var278 < 0)))) * (unsigned long)((unsigned int)(var143)));
        t1385 = ((unsigned long)((unsigned int)((-(var279 < 0)))) * (unsigned long)((unsigned int)(var145)));
        t1030 = (((((unsigned long)(t1298) >> 32) & 0xffffffff) | (unsigned int)(t1298)) + ((((unsigned long)(t1297) >> 32) & 0xffffffff) | (unsigned int)(t1297)));
        t1087 = (((((unsigned long)(t1385) >> 32) & 0xffffffff) | (unsigned int)(t1385)) + ((((unsigned long)(t1384) >> 32) & 0xffffffff) | (unsigned int)(t1384)));
        /* asm: psllq */
        t1031 = (((((unsigned long)(t1030) >> 32) & 0xffffffff) | (unsigned int)(t1030)) + ((((unsigned long)(t1296) >> 32) & 0xffffffff) | (unsigned int)(t1296)));
        t1088 = (((((unsigned long)(t1087) >> 32) & 0xffffffff) | (unsigned int)(t1087)) + ((((unsigned long)(t1383) >> 32) & 0xffffffff) | (unsigned int)(t1383)));
        *(int *)((var106 + var161 * 4)) = (var274 - (unsigned int)(((unsigned long)(((((unsigned long)(t1031) >> 32) & 0xffffffff) | (unsigned int)(t1031))) >> 16)));
        *(int *)((var106 + var161 * 4 + 0x4)) = (var275 - (unsigned int)(((unsigned long)(((((unsigned long)(t1088) >> 32) & 0xffffffff) | (unsigned int)(t1088))) >> 16)));
        *(int *)((var106 + var161 * 4 + 0x8)) = (var276 - (unsigned int)(((unsigned long)(((((unsigned long)(t1029) >> 32) & 0xffffffff) | (unsigned int)(t1029))) >> 16)));
        *(int *)((var106 + var161 * 4 + 0xc)) = (var277 - (unsigned int)(((unsigned long)(((((unsigned long)(t1086) >> 32) & 0xffffffff) | (unsigned int)(t1086))) >> 16)));
        var161 = (var161 + 8);
        var159 = (var159 - 2);
        var158 = var161;
    } while ((var159 != 0));
    L_15bb: ;
    var26 = (unsigned long)((unsigned int)(arg1));
    var25 = (long)arg0;
    var9 = *(long *)((&local_80[0] + 32));
    if (((unsigned long)((unsigned char)(((unsigned char)(*(long *)((&local_80[0] + 56))) & 1))) != 0)) {
        var386 = (var158 + local_100);
        var388 = (local_e0 + var386);
        var389 = *(int *)((var25 + var388 * 4));
        var390 = *(int *)((var25 + var388 * 4 + 0x4));
        var391 = *(int *)((var25 + var388 * 4 + 0x8));
        var392 = *(int *)((var25 + var388 * 4 + 0xc));
        t1299 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var391)));
        t1386 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var392)));
        t1300 = ((unsigned long)((unsigned int)(var391)) * (unsigned long)((unsigned int)(var153)));
        t1387 = ((unsigned long)((unsigned int)(var392)) * (unsigned long)((unsigned int)(var155)));
        t1301 = ((unsigned long)((unsigned int)((-(var391 < 0)))) * (unsigned long)((unsigned int)(var143)));
        t1388 = ((unsigned long)((unsigned int)((-(var392 < 0)))) * (unsigned long)((unsigned int)(var145)));
        t1032 = (((((unsigned long)(t1301) >> 32) & 0xffffffff) | (unsigned int)(t1301)) + ((((unsigned long)(t1300) >> 32) & 0xffffffff) | (unsigned int)(t1300)));
        t1089 = (((((unsigned long)(t1388) >> 32) & 0xffffffff) | (unsigned int)(t1388)) + ((((unsigned long)(t1387) >> 32) & 0xffffffff) | (unsigned int)(t1387)));
        /* asm: psllq */
        t1033 = (((((unsigned long)(t1032) >> 32) & 0xffffffff) | (unsigned int)(t1032)) + ((((unsigned long)(t1299) >> 32) & 0xffffffff) | (unsigned int)(t1299)));
        t1090 = (((((unsigned long)(t1089) >> 32) & 0xffffffff) | (unsigned int)(t1089)) + ((((unsigned long)(t1386) >> 32) & 0xffffffff) | (unsigned int)(t1386)));
        t1302 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var389)));
        t1389 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var390)));
        t1303 = ((unsigned long)((unsigned int)(var389)) * (unsigned long)((unsigned int)(var153)));
        t1390 = ((unsigned long)((unsigned int)(var390)) * (unsigned long)((unsigned int)(var155)));
        t1304 = ((unsigned long)((unsigned int)((-(var389 < 0)))) * (unsigned long)((unsigned int)(var143)));
        t1391 = ((unsigned long)((unsigned int)((-(var390 < 0)))) * (unsigned long)((unsigned int)(var145)));
        t1034 = (((((unsigned long)(t1304) >> 32) & 0xffffffff) | (unsigned int)(t1304)) + ((((unsigned long)(t1303) >> 32) & 0xffffffff) | (unsigned int)(t1303)));
        t1091 = (((((unsigned long)(t1391) >> 32) & 0xffffffff) | (unsigned int)(t1391)) + ((((unsigned long)(t1390) >> 32) & 0xffffffff) | (unsigned int)(t1390)));
        /* asm: psllq */
        t1035 = (((((unsigned long)(t1034) >> 32) & 0xffffffff) | (unsigned int)(t1034)) + ((((unsigned long)(t1302) >> 32) & 0xffffffff) | (unsigned int)(t1302)));
        t1092 = (((((unsigned long)(t1091) >> 32) & 0xffffffff) | (unsigned int)(t1091)) + ((((unsigned long)(t1389) >> 32) & 0xffffffff) | (unsigned int)(t1389)));
        var158 = (var386 + var114);
        var498 = (*(int *)((var25 + var158 * 4 + 0x4)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1092) >> 32) & 0xffffffff) | (unsigned int)(t1092))) >> 16)));
        var499 = (*(int *)((var25 + var158 * 4 + 0x8)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1033) >> 32) & 0xffffffff) | (unsigned int)(t1033))) >> 16)));
        var500 = (*(int *)((var25 + var158 * 4 + 0xc)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1090) >> 32) & 0xffffffff) | (unsigned int)(t1090))) >> 16)));
        *(int *)((var25 + var158 * 4)) = (*(int *)((var25 + var158 * 4)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1035) >> 32) & 0xffffffff) | (unsigned int)(t1035))) >> 16)));
        *(int *)((var25 + var158 * 4 + 0x4)) = var498;
        *(int *)((var25 + var158 * 4 + 0x8)) = var499;
        *(int *)((var25 + var158 * 4 + 0xc)) = var500;
    }
    var131 = *(long *)((&local_80[0] + 40));
    var112 = var158;
    if ((local_f0 == *(long *)((&local_80[0] + 48)))) {
        goto L_13d0;
    }
    L_1680: ;
    var112 = var131;
    if (((unsigned long)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(stride)) - var131))) & 1))) != 0)) {
        var511 = (var114 + var131);
        *(int *)((var25 + var511 * 4)) = (*(int *)((var25 + var511 * 4)) - ((unsigned long)(((long)((int)(*(int *)((var25 + ((local_e0 + var131) * 4))))) * var130)) >> 16));
        var112 = (var131 + 1);
    }
    if (((~var131) == local_c0)) {
        goto L_13d0;
    }
    do {
        *(int *)((var102 + var112 * 4 - 0x4)) = (*(int *)((var102 + var112 * 4 - 0x4)) - ((unsigned long)(((long)((int)(*(int *)((var23 + var112 * 4)))) * var130)) >> 16));
        *(int *)((var102 + var112 * 4)) = (*(int *)((var102 + var112 * 4)) - ((unsigned long)(((long)((int)(*(int *)((var23 + var112 * 4 + 0x4)))) * var130)) >> 16));
        var112 = (var112 + 2);
    } while ((stride != var112));
    goto L_13d0;
    L_16f0: ;
    if ((((unsigned long)((unsigned int)(var8)) == 0) | ((long)((int)(var8)) < 0))) {
        // x86-64 epilogue: restore callee registers
        return (unsigned int)(var8);
    }
    local_b0 = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var8 - 1))) * stride))) + var8);
    local_b8 = (0xfffffffe - var8);
    local_c8 = (-var8);
    var530 = ((var7 - 1) * (unsigned long)((unsigned int)(stride)));
    local_c0 = var530;
    var531 = (var530 + var7);
    local_e0 = (~(unsigned long)((unsigned int)(stride)));
    var535 = (((var7 * 4) + 16) + var1);
    var537 = 0;
    var538 = 0xffffffff;
    column = var7;
    goto L_1783;
    L_1750: ;
    var543 = 0;
    L_1752: ;
    var7 = local_e8;
    *(int *)((var1 + var546 * 4)) = var543;
    var537 = (unsigned long)((unsigned int)((var537 + 1)));
    var538 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(local_f0)) + 1)));
    var531 = (var531 + local_e0);
    var535 = (var535 - 4);
    local_c0 = (local_c0 - (unsigned long)((unsigned int)(stride)));
    column = var546;
    if ((local_d8 <= 1)) {
        // x86-64 epilogue: restore callee registers
        return arg1;
    }
    L_1783: ;
    var549 = ((unsigned long)((unsigned int)(column)) - 1);
    var551 = (var549 * (unsigned long)((unsigned int)(stride)));
    var554 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var549)) * stride)));
    var557 = (long)arg0;
    accumulator = (unsigned long)((unsigned int)(arg0[(unsigned long)((unsigned int)((var551 + arg1)))]));
    local_f0 = var538;
    local_100 = var549;
    local_d8 = (unsigned long)((unsigned int)(column));
    if ((column < var7)) {
        var559 = (unsigned long)((unsigned int)((var537 - 1)));
        var563 = ((unsigned int)(((unsigned long)((unsigned int)(local_b8)) * var537)) + (unsigned int)(local_b0));
        var569 = var1;
        if ((((unsigned long)(7) <= (unsigned long)((unsigned long)((unsigned int)(var559)))) && ((unsigned long)((unsigned long)((unsigned int)(var563))) <= (unsigned long)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var563)) + var559))))))) {
            var572 = (((unsigned long)((unsigned int)(var538)) + 1) & -8);
            var573 = (var559 + 1);
            var549 = var573;
            var557 = (var573 & -8);
            column = (column + var557);
            var574 = accumulator;
            var575 = 0;
            var576 = 0;
            var577 = 0;
            var579 = 0;
            var580 = 0;
            var581 = 0;
            var582 = 0;
            var584 = 0;
            var585 = (long)arg0;
            do {
                var586 = (unsigned long)((unsigned int)((var531 + var584)));
                var587 = *(int *)((var585 + var586 * 4));
                var588 = *(int *)((var585 + var586 * 4 + 0x4));
                var589 = *(int *)((var585 + var586 * 4 + 0x8));
                var590 = *(int *)((var585 + var586 * 4 + 0xc));
                var591 = *(int *)((var585 + var586 * 4 + 0x10));
                var592 = *(int *)((var585 + var586 * 4 + 0x14));
                var593 = *(int *)((var585 + var586 * 4 + 0x18));
                var594 = *(int *)((var585 + var586 * 4 + 0x1c));
                var595 = *(int *)((var535 + var584 * 4 - 0x10));
                var596 = *(int *)((var535 + var584 * 4 - 0xc));
                var597 = *(int *)((var535 + var584 * 4 - 0x8));
                var598 = *(int *)((var535 + var584 * 4 - 0x4));
                var599 = *(int *)((var535 + var584 * 4));
                var600 = *(int *)((var535 + var584 * 4 + 0x4));
                var601 = *(int *)((var535 + var584 * 4 + 0x8));
                var602 = *(int *)((var535 + var584 * 4 + 0xc));
                t1305 = ((unsigned long)((unsigned int)((-(var589 < 0)))) * (unsigned long)((unsigned int)(var597)));
                t1392 = ((unsigned long)((unsigned int)((-(var590 < 0)))) * (unsigned long)((unsigned int)(var598)));
                t1306 = ((unsigned long)((unsigned int)(var597)) * (unsigned long)((unsigned int)(var589)));
                t1393 = ((unsigned long)((unsigned int)(var598)) * (unsigned long)((unsigned int)(var590)));
                t1307 = ((unsigned long)((unsigned int)((-(var597 < 0)))) * (unsigned long)((unsigned int)(var589)));
                t1394 = ((unsigned long)((unsigned int)((-(var598 < 0)))) * (unsigned long)((unsigned int)(var590)));
                t1036 = (((((unsigned long)(t1305) >> 32) & 0xffffffff) | (unsigned int)(t1305)) + ((((unsigned long)(t1307) >> 32) & 0xffffffff) | (unsigned int)(t1307)));
                t1093 = (((((unsigned long)(t1392) >> 32) & 0xffffffff) | (unsigned int)(t1392)) + ((((unsigned long)(t1394) >> 32) & 0xffffffff) | (unsigned int)(t1394)));
                /* asm: psllq */
                t1037 = (((((unsigned long)(t1036) >> 32) & 0xffffffff) | (unsigned int)(t1036)) + ((((unsigned long)(t1306) >> 32) & 0xffffffff) | (unsigned int)(t1306)));
                t1094 = (((((unsigned long)(t1093) >> 32) & 0xffffffff) | (unsigned int)(t1093)) + ((((unsigned long)(t1393) >> 32) & 0xffffffff) | (unsigned int)(t1393)));
                t1308 = ((unsigned long)((unsigned int)((-(var587 < 0)))) * (unsigned long)((unsigned int)(var595)));
                t1395 = ((unsigned long)((unsigned int)((-(var588 < 0)))) * (unsigned long)((unsigned int)(var596)));
                t1309 = ((unsigned long)((unsigned int)(var595)) * (unsigned long)((unsigned int)(var587)));
                t1396 = ((unsigned long)((unsigned int)(var596)) * (unsigned long)((unsigned int)(var588)));
                t1310 = ((unsigned long)((unsigned int)((-(var595 < 0)))) * (unsigned long)((unsigned int)(var587)));
                t1397 = ((unsigned long)((unsigned int)((-(var596 < 0)))) * (unsigned long)((unsigned int)(var588)));
                t1038 = (((((unsigned long)(t1308) >> 32) & 0xffffffff) | (unsigned int)(t1308)) + ((((unsigned long)(t1310) >> 32) & 0xffffffff) | (unsigned int)(t1310)));
                t1095 = (((((unsigned long)(t1395) >> 32) & 0xffffffff) | (unsigned int)(t1395)) + ((((unsigned long)(t1397) >> 32) & 0xffffffff) | (unsigned int)(t1397)));
                /* asm: psllq */
                t1039 = (((((unsigned long)(t1038) >> 32) & 0xffffffff) | (unsigned int)(t1038)) + ((((unsigned long)(t1309) >> 32) & 0xffffffff) | (unsigned int)(t1309)));
                t1096 = (((((unsigned long)(t1095) >> 32) & 0xffffffff) | (unsigned int)(t1095)) + ((((unsigned long)(t1396) >> 32) & 0xffffffff) | (unsigned int)(t1396)));
                t1311 = ((unsigned long)((unsigned int)((-(var593 < 0)))) * (unsigned long)((unsigned int)(var601)));
                t1398 = ((unsigned long)((unsigned int)((-(var594 < 0)))) * (unsigned long)((unsigned int)(var602)));
                t1312 = ((unsigned long)((unsigned int)(var601)) * (unsigned long)((unsigned int)(var593)));
                t1399 = ((unsigned long)((unsigned int)(var602)) * (unsigned long)((unsigned int)(var594)));
                t1313 = ((unsigned long)((unsigned int)((-(var601 < 0)))) * (unsigned long)((unsigned int)(var593)));
                t1400 = ((unsigned long)((unsigned int)((-(var602 < 0)))) * (unsigned long)((unsigned int)(var594)));
                t1040 = (((((unsigned long)(t1311) >> 32) & 0xffffffff) | (unsigned int)(t1311)) + ((((unsigned long)(t1313) >> 32) & 0xffffffff) | (unsigned int)(t1313)));
                t1097 = (((((unsigned long)(t1398) >> 32) & 0xffffffff) | (unsigned int)(t1398)) + ((((unsigned long)(t1400) >> 32) & 0xffffffff) | (unsigned int)(t1400)));
                /* asm: psllq */
                t1041 = (((((unsigned long)(t1040) >> 32) & 0xffffffff) | (unsigned int)(t1040)) + ((((unsigned long)(t1312) >> 32) & 0xffffffff) | (unsigned int)(t1312)));
                t1098 = (((((unsigned long)(t1097) >> 32) & 0xffffffff) | (unsigned int)(t1097)) + ((((unsigned long)(t1399) >> 32) & 0xffffffff) | (unsigned int)(t1399)));
                t1314 = ((unsigned long)((unsigned int)((-(var591 < 0)))) * (unsigned long)((unsigned int)(var599)));
                t1401 = ((unsigned long)((unsigned int)((-(var592 < 0)))) * (unsigned long)((unsigned int)(var600)));
                t1315 = ((unsigned long)((unsigned int)(var599)) * (unsigned long)((unsigned int)(var591)));
                t1402 = ((unsigned long)((unsigned int)(var600)) * (unsigned long)((unsigned int)(var592)));
                t1316 = ((unsigned long)((unsigned int)((-(var599 < 0)))) * (unsigned long)((unsigned int)(var591)));
                t1403 = ((unsigned long)((unsigned int)((-(var600 < 0)))) * (unsigned long)((unsigned int)(var592)));
                t1042 = (((((unsigned long)(t1314) >> 32) & 0xffffffff) | (unsigned int)(t1314)) + ((((unsigned long)(t1316) >> 32) & 0xffffffff) | (unsigned int)(t1316)));
                t1099 = (((((unsigned long)(t1401) >> 32) & 0xffffffff) | (unsigned int)(t1401)) + ((((unsigned long)(t1403) >> 32) & 0xffffffff) | (unsigned int)(t1403)));
                /* asm: psllq */
                t1043 = (((((unsigned long)(t1042) >> 32) & 0xffffffff) | (unsigned int)(t1042)) + ((((unsigned long)(t1315) >> 32) & 0xffffffff) | (unsigned int)(t1315)));
                t1100 = (((((unsigned long)(t1099) >> 32) & 0xffffffff) | (unsigned int)(t1099)) + ((((unsigned long)(t1402) >> 32) & 0xffffffff) | (unsigned int)(t1402)));
                var574 = (var574 - (unsigned int)(((unsigned long)(((((unsigned long)(t1039) >> 32) & 0xffffffff) | (unsigned int)(t1039))) >> 16)));
                var575 = (var575 - (unsigned int)(((unsigned long)(((((unsigned long)(t1096) >> 32) & 0xffffffff) | (unsigned int)(t1096))) >> 16)));
                var576 = (var576 - (unsigned int)(((unsigned long)(((((unsigned long)(t1037) >> 32) & 0xffffffff) | (unsigned int)(t1037))) >> 16)));
                var577 = (var577 - (unsigned int)(((unsigned long)(((((unsigned long)(t1094) >> 32) & 0xffffffff) | (unsigned int)(t1094))) >> 16)));
                var579 = (var579 - (unsigned int)(((unsigned long)(((((unsigned long)(t1043) >> 32) & 0xffffffff) | (unsigned int)(t1043))) >> 16)));
                var580 = (var580 - (unsigned int)(((unsigned long)(((((unsigned long)(t1100) >> 32) & 0xffffffff) | (unsigned int)(t1100))) >> 16)));
                var581 = (var581 - (unsigned int)(((unsigned long)(((((unsigned long)(t1041) >> 32) & 0xffffffff) | (unsigned int)(t1041))) >> 16)));
                var582 = (var582 - (unsigned int)(((unsigned long)(((((unsigned long)(t1098) >> 32) & 0xffffffff) | (unsigned int)(t1098))) >> 16)));
                var584 = (var584 + 8);
            } while ((var572 != var584));
            var869 = ((var581 + var576) + (var579 + var574));
            var870 = ((var582 + var577) + (var580 + var575));
            ret = ((unsigned long)((unsigned int)(var870)) | (unsigned long)((unsigned int)(var869)));
            accumulator = (unsigned long)((unsigned int)((var870 + var869)));
            var569 = local_a8;
            var881 = (unsigned long)((unsigned int)(accumulator));
            var1 = local_a8;
            if ((var549 == var557)) {
                goto L_1a30;
            }
        }
        var557 = (unsigned long)((unsigned int)(arg1));
        if (((unsigned long)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) - column))) & 1))) != 0)) {
            goto L_19aa;
        }
        var549 = (unsigned long)((unsigned int)(column));
        goto L_19cd;
    }
    var585 = (long)arg0;
    var881 = (unsigned long)((unsigned int)(accumulator));
    goto L_1a30;
    L_19aa: ;
    var557 = (long)arg0;
    var549 = ((unsigned long)((unsigned int)(column)) + 1);
    accumulator = (unsigned long)((unsigned int)((accumulator - ((unsigned long)(((long)((int)(*(int *)((var569 + column * 4)))) * (long)((int)(arg0[(unsigned long)((unsigned int)((var551 + column)))])))) >> 16))));
    L_19cd: ;
    var894 = local_c8;
    var585 = (long)arg0;
    var881 = (unsigned long)((unsigned int)(accumulator));
    var1 = var569;
    if (((unsigned int)((~column)) == (unsigned int)(local_c8))) {
        goto L_1a30;
    }
    var896 = (var549 + 1);
    var549 = (var549 + local_c0);
    var897 = var896;
    do {
        accumulator = (unsigned long)((unsigned int)((accumulator - (unsigned long)((unsigned int)((((unsigned long)(((long)((int)(*(int *)((var569 + var897 * 4)))) * (long)((int)(*(int *)((var585 + ((unsigned long)((unsigned int)((var549 + 1))) * 4))))))) >> 16) + ((unsigned long)(((long)((int)(*(int *)((var569 + var897 * 4 - 0x4)))) * (long)((int)(*(int *)((var585 + ((unsigned long)((unsigned int)(var549)) * 4))))))) >> 16)))))));
        var911 = (var897 + 2);
        var557 = (unsigned long)((unsigned int)((var894 + var911)));
        var549 = (var549 + 2);
        var897 = var911;
    } while (((unsigned long)((unsigned int)(var557)) != 1));
    var881 = (unsigned long)((unsigned int)(accumulator));
    var1 = var569;
    L_1a30: ;
    var546 = local_100;
    var914 = (long)((int)(*(int *)((var585 + ((unsigned long)((unsigned int)((var554 + local_100))) * 4)))));
    if ((var914 == 0)) {
        goto L_1750;
    }
    var916 = ((long)((int)(var881)) << 16);
    if ((((unsigned long)((var916 | var914)) >> 32) != 0)) {
        var543 = ((long)((((__int128)(long)(((long)(var916) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var916)) / (long)(var914)));
        goto L_1752;
    }
    var543 = ((unsigned int)(((((unsigned long long)(unsigned int)((unsigned long)((unsigned int)(0))) << 32) | (unsigned int)(var916)) / (unsigned int)(var914))));
    goto L_1752;
}

clang -O0

1/1
gaussian_solve pass 143 lines
// glaurung: gaussian_solve @ 0x1100
int32_t gaussian_solve(int32_t * arg0, int32_t arg1, int32_t * arg2) {
    extern int gauss_div_q16(int, int);
    extern int gauss_mul_q16(int, int);
    int stride;
    int pivot;
    int best;
    int row;
    int candidate;
    int current;
    int candidate_magnitude;
    int current_magnitude;
    int column;
    int swap;
    int best_magnitude;
    int factor;
    int accumulator;
    int local_4;
    int local_58;
    int local_5c;
    int var101;
    int var113;
    int var120;
    int var160;
    int var176;
    if ((arg0 != 0)) {
        if ((arg2 != 0)) {
            if ((1 <= (long)(arg1))) {
                if ((((unsigned long)((unsigned int)(arg1)) == 4) | ((long)(arg1) < 4))) {
                    goto L_1149;
                }
            }
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_1149: ;
    stride = ((unsigned int)(arg1) + 1);
    pivot = 0;
    L_1159: ;
    if ((arg1 <= pivot)) {
        goto L_137f;
    }
    best = pivot;
    row = ((unsigned int)(pivot) + 1);
    L_1174: ;
    if ((arg1 <= row)) {
        goto L_1219;
    }
    candidate = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + pivot)))];
    current = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))) + pivot)))];
    if (((long)(candidate) < 0)) {
        local_58 = (0 - candidate);
        goto L_11cb;
    }
    local_58 = candidate;
    L_11cb: ;
    candidate_magnitude = local_58;
    if (((long)(current) < 0)) {
        local_5c = (0 - current);
        goto L_11ee;
    }
    local_5c = current;
    L_11ee: ;
    current_magnitude = local_5c;
    if (((((unsigned int)(candidate_magnitude) == (unsigned int)(current_magnitude)) | (candidate_magnitude < current_magnitude)) == 0)) {
        best = row;
    }
    goto L_120b;
    L_120b: ;
    row = ((unsigned int)(row) + 1);
    goto L_1174;
    L_1219: ;
    if (((unsigned int)(best) == (unsigned int)(pivot))) {
        goto L_12a1;
    }
    column = 0;
    L_122c: ;
    if ((column < stride)) {
        swap = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))) + column)))];
        arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))) + column)))] = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))) + column)))];
        arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))) + column)))] = swap;
        column = ((unsigned int)(column) + 1);
        goto L_122c;
    }
    goto L_12a1;
    L_12a1: ;
    best_magnitude = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))) + pivot)))];
    if (((unsigned long)((unsigned int)(best_magnitude)) == 0)) {
        local_4 = -2;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    row = ((unsigned int)(pivot) + 1);
    L_12d7: ;
    if ((arg1 <= row)) {
        goto L_136c;
    }
    var101 = gauss_div_q16((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + pivot)))])), (unsigned long)((unsigned int)(best_magnitude)));
    factor = var101;
    column = pivot;
    L_1308: ;
    if ((column < stride)) {
        var113 = gauss_mul_q16((unsigned long)((unsigned int)(factor)), (unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))) + column)))])));
        var120 = ((unsigned int)(((unsigned long)((unsigned int)(row)) * stride)) + column);
        arg0[(long)((int)(var120))] = ((unsigned long)((unsigned int)(arg0[(long)((int)(var120))])) - (unsigned long)((unsigned int)(var113)));
        column = ((unsigned int)(column) + 1);
        goto L_1308;
    }
    goto L_135e;
    L_135e: ;
    row = ((unsigned int)(row) + 1);
    goto L_12d7;
    L_136c: ;
    goto L_1371;
    L_1371: ;
    pivot = ((unsigned int)(pivot) + 1);
    goto L_1159;
    L_137f: ;
    row = ((unsigned int)(arg1) - 1);
    L_1388: ;
    if (((long)(row) < 0)) {
        goto L_1431;
    }
    accumulator = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + arg1)))];
    column = ((unsigned int)(row) + 1);
    L_13b2: ;
    if ((column < arg1)) {
        var160 = gauss_mul_q16((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + column)))])), (unsigned long)((unsigned int)(arg2[(long)(column)])));
        accumulator = ((unsigned int)(accumulator) - (unsigned int)(var160));
        column = ((unsigned int)(column) + 1);
        goto L_13b2;
    }
    var176 = gauss_div_q16((unsigned long)((unsigned int)(accumulator)), (unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + row)))])));
    arg2[(long)(row)] = var176;
    row = ((unsigned int)(row) - 1);
    goto L_1388;
    L_1431: ;
    local_4 = arg1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

gcc -O0

1/1
gaussian_solve pass 128 lines
// glaurung: gaussian_solve @ 0x114d
int32_t gaussian_solve(int32_t * arg0, int32_t arg1, int32_t * arg2) {
    extern int gauss_div_q16(int, int);
    extern int gauss_mul_q16(int, int);
    int stride;
    int pivot;
    int best;
    int row;
    int candidate;
    int current;
    int candidate_magnitude;
    int current_magnitude;
    int column;
    int swap;
    int best_magnitude;
    int factor;
    int accumulator;
    long t151;
    long t153;
    int var124;
    int var141;
    int var208;
    long var227;
    int var229;
    if ((arg0 != 0)) {
        if ((arg2 != 0)) {
            if (((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0)) == 0)) {
                if ((((unsigned long)((unsigned int)(arg1)) == 4) | ((long)(arg1) < 4))) {
                    goto L_1189;
                }
            }
        }
    }
    // x86-64 epilogue: restore rbp
    return 0xffffffff;
    L_1189: ;
    stride = ((unsigned int)(arg1) + 1);
    pivot = 0;
    goto L_13eb;
    L_119e: ;
    best = pivot;
    row = ((unsigned int)(pivot) + 1);
    goto L_1223;
    L_11af: ;
    candidate = arg0[(long)((int)(((unsigned long)((unsigned int)(pivot)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))];
    current = arg0[(long)((int)(((unsigned long)((unsigned int)(pivot)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))))))];
    t151 = (-(unsigned long)((unsigned int)(candidate)));
    candidate_magnitude = ((0 <= (long)((int)(t151))) ? t151 : (unsigned long)((unsigned int)(candidate)));
    t153 = (-(unsigned long)((unsigned int)(current)));
    current_magnitude = ((0 <= (long)((int)(t153))) ? t153 : (unsigned long)((unsigned int)(current)));
    if (((((unsigned int)(candidate_magnitude) == (unsigned int)(current_magnitude)) | (candidate_magnitude < current_magnitude)) == 0)) {
        best = row;
    }
    row = (row + 1);
    L_1223: ;
    if ((row < arg1)) {
        goto L_11af;
    }
    if (((unsigned int)(best) == (unsigned int)(pivot))) {
        goto L_12de;
    }
    column = 0;
    goto L_12d2;
    L_1243: ;
    swap = arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))))))];
    arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))))))] = arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))))))];
    arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))))))] = swap;
    column = (column + 1);
    L_12d2: ;
    if ((column < stride)) {
        goto L_1243;
    }
    L_12de: ;
    best_magnitude = arg0[(long)((int)(((unsigned long)((unsigned int)(pivot)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))))))];
    if (((unsigned long)((unsigned int)(best_magnitude)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xfffffffe;
    }
    row = ((unsigned int)(pivot) + 1);
    goto L_13db;
    L_1320: ;
    var124 = gauss_div_q16((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(pivot)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))])), (unsigned long)((unsigned int)(best_magnitude)));
    factor = var124;
    column = pivot;
    goto L_13cf;
    L_1358: ;
    var141 = gauss_mul_q16((unsigned long)((unsigned int)(factor)), (unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))))))])));
    arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))] = ((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))])) - (unsigned long)((unsigned int)(var141)));
    column = (column + 1);
    L_13cf: ;
    if ((column < stride)) {
        goto L_1358;
    }
    row = (row + 1);
    L_13db: ;
    if ((row < arg1)) {
        goto L_1320;
    }
    pivot = (pivot + 1);
    L_13eb: ;
    if ((pivot < arg1)) {
        goto L_119e;
    }
    row = ((unsigned int)(arg1) - 1);
    goto L_14cb;
    L_1405: ;
    accumulator = arg0[(long)((int)(((unsigned long)((unsigned int)(arg1)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))];
    column = ((unsigned int)(row) + 1);
    goto L_147b;
    L_1434: ;
    var208 = gauss_mul_q16((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))])), (unsigned long)((unsigned int)(arg2[(long)(column)])));
    accumulator = (accumulator - var208);
    column = (column + 1);
    L_147b: ;
    if ((column < arg1)) {
        goto L_1434;
    }
    var227 = (long)((((long)(row) * 4) + (long)arg2));
    var229 = gauss_div_q16((unsigned long)((unsigned int)(accumulator)), (unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(row)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))])));
    *(int *)((var227)) = var229;
    row = (row - 1);
    L_14cb: ;
    if ((0 <= (long)(row))) {
        goto L_1405;
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(arg1);
}

gcc -O2

1/1
gaussian_solve pass 233 lines
// glaurung: gaussian_solve @ 0x1100
int32_t gaussian_solve(int32_t * arg0, int32_t arg1, int32_t * arg2) {
    int stride;
    int pivot;
    int row;
    int best;
    int swap;
    int column;
    int accumulator;
    int factor;
    long local_10;
    long local_18;
    long local_20;
    long local_30;
    int local_34;
    long local_48;
    long local_50;
    long local_58;
    long local_60;
    long local_68;
    long local_70;
    int local_74;
    long local_8;
    long local_80;
    long ret;
    long t153;
    long t155;
    long var0;
    long var1;
    long var10;
    long var100;
    long var102;
    long var108;
    long var109;
    long var110;
    long var111;
    long var114;
    long var115;
    long var119;
    long var123;
    int var126;
    long var13;
    long var2;
    long var20;
    long var21;
    long var28;
    long var3;
    long var30;
    long var31;
    long var32;
    int var35;
    long var4;
    long var42;
    int var45;
    int var47;
    long var5;
    long var50;
    long var56;
    long var58;
    long var6;
    long var60;
    long var61;
    long var62;
    long var63;
    long var65;
    long var67;
    long var68;
    long var69;
    int var74;
    long var85;
    long var86;
    long var87;
    long var9;
    long var93;
    long var95;
    long var99;
    local_8 = var0;
    local_10 = var1;
    local_18 = var2;
    local_20 = var3;
    local_30 = var4;
    if ((arg0 == 0)) {
        goto L_1393;
    }
    if ((arg2 == 0)) {
        goto L_1393;
    }
    var5 = (unsigned long)((unsigned int)((arg1 - 1)));
    var6 = (unsigned long)((unsigned int)(arg1));
    local_34 = var5;
    if (((unsigned long)(3) < (unsigned long)((unsigned long)((unsigned int)(var5))))) {
        goto L_1393;
    }
    stride = (unsigned long)((unsigned int)((arg1 + 1)));
    local_58 = var5;
    var9 = (long)arg0;
    var10 = (long)(stride);
    local_74 = 0;
    var13 = ((long)(stride) * 4);
    local_80 = stride;
    local_50 = ((long)(stride) + 1);
    local_60 = (long)(((long)arg0 - var13));
    local_48 = (unsigned int)(arg1);
    local_70 = 0;
    local_68 = (long)((arg0 + 1));
    pivot = 0;
    L_1190: ;
    row = (unsigned long)((unsigned int)((pivot + 1)));
    var20 = (unsigned long)((unsigned int)(pivot));
    var21 = (unsigned long)((unsigned int)(pivot));
    if ((((unsigned int)(var6) == (unsigned int)(row)) | ((long)((int)(var6)) < (long)(row)))) {
        goto L_11f9;
    }
    var28 = (var9 + (((long)((int)(((unsigned long)((unsigned int)(local_74)) + stride))) + (unsigned long)((unsigned int)(pivot))) * 4));
    var30 = (unsigned long)((unsigned int)(row));
    var31 = (unsigned long)((unsigned int)(pivot));
    do {
        var32 = (unsigned long)((unsigned int)(*(int *)((var28))));
        t153 = (-(unsigned long)((unsigned int)(var32)));
        var35 = (((long)((int)(t153)) < 0) ? var32 : t153);
        var42 = (unsigned long)((unsigned int)(*(int *)((var9 + ((long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(stride)) * var31))) + var21))) * 4)))));
        t155 = (-(unsigned long)((unsigned int)(var42)));
        var45 = (((long)((int)(t155)) < 0) ? var42 : t155);
        best = (((((unsigned int)(var35) == (unsigned int)(var45)) | (var35 < var45)) == 0) ? var30 : var31);
        var47 = (var30 + 1);
        var30 = (unsigned long)((unsigned int)(var47));
        var28 = (var28 + var13);
        var31 = (unsigned long)((unsigned int)(best));
    } while (((unsigned int)(var6) != (unsigned int)(var47)));
    if (((unsigned int)(best) != (unsigned int)(pivot))) {
        goto L_12ab;
    }
    L_11f9: ;
    var50 = (long)((int)(*(int *)((local_60 + local_80 * 4))));
    if (((unsigned long)((unsigned int)(var50)) == 0)) {
        goto L_1383;
    }
    if ((pivot == local_58)) {
        goto L_12e7;
    }
    local_70 = (local_70 + var10);
    local_74 = (local_74 + stride);
    var56 = (-var10);
    var58 = (var9 + (local_80 * 4));
    var60 = (local_68 + (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var6)) - var20))) + local_80) * 4));
    L_1248: ;
    var61 = (long)((int)(*(int *)((var58))));
    var62 = var61;
    var63 = (var61 << 16);
    var65 = ((long)((((__int128)(long)(((long)(var63) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var63)) / (long)(var50)));
    if ((((unsigned int)(stride) == (unsigned int)(pivot)) | (stride < pivot))) {
        goto L_1286;
    }
    var67 = (long)((int)(var65));
    var68 = var58;
    goto L_126b;
    L_1268: ;
    var62 = (unsigned long)((unsigned int)(*(int *)((var68))));
    L_126b: ;
    var69 = (long)((int)(*(int *)((var68 + var56 * 4))));
    var68 = (var68 + 4);
    *(int *)((var68 - 0x4)) = (var62 - ((long)((var69 * var67)) >> 16));
    if ((var60 != var68)) {
        goto L_1268;
    }
    L_1286: ;
    var74 = (row + 1);
    row = (unsigned long)((unsigned int)(var74));
    var58 = (var58 + var13);
    var56 = (var56 - var10);
    var60 = (var60 + var13);
    if (((unsigned int)(var6) != (unsigned int)(var74))) {
        goto L_1248;
    }
    local_80 = (local_80 + local_50);
    pivot = (pivot + 1);
    goto L_1190;
    L_12ab: ;
    var85 = (local_68 + ((local_48 + local_70) * 4));
    var86 = ((long)((int)((best * stride))) - local_70);
    var87 = (var9 + (local_70 * 4));
    do {
        swap = (unsigned long)((unsigned int)(*(int *)((var87))));
        *(int *)((var87)) = *(int *)((var87 + var86 * 4));
        *(int *)((var87 + var86 * 4)) = swap;
        var87 = (var87 + 4);
    } while ((var87 != var85));
    goto L_11f9;
    L_12e7: ;
    var93 = (long)arg2;
    var95 = (long)((int)(var6));
    var99 = (long)((((long)arg2 + var13) - 8));
    var100 = ((long)((int)((~(unsigned long)((unsigned int)(stride))))) << 2);
    var102 = (var9 + ((long)((int)(((unsigned long)((unsigned int)((var6 + 2))) * (unsigned long)((unsigned int)(local_34))))) * 4));
    var108 = (var9 + ((long)((int)(((unsigned long)((unsigned int)(local_34)) * stride))) * 4));
    var109 = (unsigned long)((unsigned int)(arg1));
    do {
        var110 = (unsigned long)((unsigned int)(*(int *)((var108 + var95 * 4))));
        var111 = var110;
        if (((((unsigned int)(var6) == (unsigned int)(var109)) | ((long)((int)(var6)) < (long)((int)(var109)))) == 0)) {
            column = (long)((int)(var109));
            accumulator = var110;
            do {
                var114 = (long)((int)(*(int *)((var108 + column * 4))));
                var115 = (long)((int)(*(int *)((var93 + column * 4))));
                column = (column + 1);
                accumulator = (unsigned long)((unsigned int)((accumulator - ((long)((var114 * var115)) >> 16))));
                var111 = (unsigned long)((unsigned int)(accumulator));
            } while (((((unsigned int)(var6) == (unsigned int)(column)) | ((long)((int)(var6)) < (long)(column))) == 0));
        }
        var119 = (unsigned long)((unsigned int)(*(int *)((var102))));
        if (((unsigned long)((unsigned int)(var119)) != 0)) {
            var123 = ((long)((int)(var111)) << 16);
            var119 = ((long)((((__int128)(long)(((long)(var123) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var123)) / (long)((long)((int)(var119)))));
        }
        *(int *)((var99)) = var119;
        var102 = (var102 + var100);
        var99 = (var99 - 4);
        var108 = (var108 - var13);
        var126 = (var109 - 1);
        var109 = (unsigned long)((unsigned int)(var126));
    } while (((unsigned long)((unsigned int)(var126)) != 0));
    ret = (unsigned long)((unsigned int)(var6));
    L_1378: ;
    // x86-64 epilogue: tear down frame
    return ret;
    L_1383: ;
    // x86-64 epilogue: tear down frame
    return 0xfffffffe;
    L_1393: ;
    ret = 0xffffffff;
    goto L_1378;
}

← 213 fixtures