Fixture 165

bitstream reader

C · 5 functions · 4 lanes · 16 of 20 function-lanes behave identically

2 of 4 lanes have a function that returns a different result after decompilation: clang-O2 (3/5), gcc-O2 (3/5).

A bit-level cursor: MSB-first, fields of arbitrary width laid end to end with no byte alignment between them, exactly as in H.264/AV1 headers, LoRaWAN and ZigBee PHY frames, DEFLATE-style codes and most register-packed firmware telemetry. Bit 0 is the most significant bit of byte 0; a 13-bit field starting at bit 3 occupies the low 5 bits of byte 0, all of byte 1, and does not touch byte 2.

Two readers compute the same thing on purpose: - the bit-at-a-time loop, which is what a naive implementation looks like; - the windowed reader, which touches ceil((skew + width) / 8) bytes, accumulates them into a 32-bit window, and extracts with one shift and one mask. bit165_cross_check asserts they agree, so a decompilation that recovers one of them wrongly is caught even when it looks self-consistent.

Why this stresses a decompiler: the windowed reader's three derived quantities -- skew = bit_off & 7, need = (skew + width + 7) >> 3, and trailing = need * 8 - skew - width -- are pure arithmetic on the cursor, they get folded and re-associated hard by the optimiser, and a decompiler that emits an algebraically *plausible* rearrangement (say, 8 - skew rather than the trailing count, or >> 3 where the source rounded up) still yields correct answers for every byte-aligned field and wrong ones for exactly the fields that cross a byte boundary. That is a bug class that survives every similarity metric and every eyeball, and it is only visible by execution.

UB notes: width is clamped to [1, 24] so no shift count ever reaches 32 and the window can never overflow 32 bits; bit_off is range-checked against limit * 8 BEFORE bit_off + width is formed, so that sum cannot overflow; limit is clamped to [0, 16] first. Every buffer index is derived from an already-validated bit range.

tests/decompiler_fixtures/src/165_bitstream_reader.c source
/* 165_bitstream_reader.c
 *
 * A bit-level cursor: MSB-first, fields of arbitrary width laid end to end with
 * no byte alignment between them, exactly as in H.264/AV1 headers, LoRaWAN and
 * ZigBee PHY frames, DEFLATE-style codes and most register-packed firmware
 * telemetry. Bit 0 is the most significant bit of byte 0; a 13-bit field
 * starting at bit 3 occupies the low 5 bits of byte 0, all of byte 1, and does
 * not touch byte 2.
 *
 * Two readers compute the same thing on purpose:
 *   - the bit-at-a-time loop, which is what a naive implementation looks like;
 *   - the windowed reader, which touches ceil((skew + width) / 8) bytes,
 *     accumulates them into a 32-bit window, and extracts with one shift and
 *     one mask.
 * `bit165_cross_check` asserts they agree, so a decompilation that recovers one
 * of them wrongly is caught even when it looks self-consistent.
 *
 * Why this stresses a decompiler: the windowed reader's three derived
 * quantities -- `skew = bit_off & 7`, `need = (skew + width + 7) >> 3`, and
 * `trailing = need * 8 - skew - width` -- are pure arithmetic on the cursor,
 * they get folded and re-associated hard by the optimiser, and a decompiler
 * that emits an algebraically *plausible* rearrangement (say, `8 - skew` rather
 * than the trailing count, or `>> 3` where the source rounded up) still yields
 * correct answers for every byte-aligned field and wrong ones for exactly the
 * fields that cross a byte boundary. That is a bug class that survives every
 * similarity metric and every eyeball, and it is only visible by execution.
 *
 * UB notes: width is clamped to [1, 24] so no shift count ever reaches 32 and
 * the window can never overflow 32 bits; `bit_off` is range-checked against
 * `limit * 8` BEFORE `bit_off + width` is formed, so that sum cannot overflow;
 * `limit` is clamped to [0, 16] first. Every buffer index is derived from an
 * already-validated bit range.
 */
#include <stddef.h>
#include <stdint.h>

#define BIT165_MAX_BUF     16
#define BIT165_MAX_WIDTH   24
#define BIT165_FRAME_BYTES 5
#define BIT165_BAD         0xFFFFFFFFu
#define BIT165_SYNC        0x5u

/* Clamp a caller length into [0, BIT165_MAX_BUF] before any arithmetic. */
static int32_t bit165_clamp(int32_t n) {
    if (n < 0) {
        return 0;
    }
    if (n > BIT165_MAX_BUF) {
        return BIT165_MAX_BUF;
    }
    return n;
}

/* 1 iff a `width`-bit field at `bit_off` lies wholly inside `limit` bytes.
 * `limit` is pre-clamped, so `limit * 8` is at most 128 and the `bit_off`
 * range check below makes `bit_off + width` safe to form. */
static int32_t bit165_fits(int32_t limit, int32_t bit_off, int32_t width) {
    int32_t total_bits = limit * 8;

    if (width < 1 || width > BIT165_MAX_WIDTH) {
        return 0;
    }
    if (bit_off < 0 || bit_off > total_bits) {
        return 0;
    }
    return (bit_off + width <= total_bits) ? 1 : 0;
}

/* Reference reader: one bit per iteration, MSB first. */
static uint32_t bit165_pull_bitwise(const uint8_t *buf, int32_t bit_off,
                                    int32_t width) {
    uint32_t acc = 0;
    int32_t i;

    for (i = 0; i < width; i++) {
        int32_t at = bit_off + i;
        uint32_t bit = ((uint32_t)buf[at >> 3] >> (7 - (at & 7))) & 1u;
        acc = (acc << 1) | bit;
    }
    return acc;
}

/* Windowed reader: gather the touched bytes, then one shift and one mask.
 * `need` is at most 4 for width <= 24, so the window holds at most 32 bits. */
static uint32_t bit165_pull_windowed(const uint8_t *buf, int32_t bit_off,
                                     int32_t width) {
    int32_t base = bit_off >> 3;
    int32_t skew = bit_off & 7;
    int32_t need = (skew + width + 7) >> 3;
    int32_t trailing = need * 8 - skew - width;
    uint32_t window = 0;
    int32_t i;

    for (i = 0; i < need; i++) {
        window = (window << 8) | (uint32_t)buf[base + i];
    }
    return (window >> trailing) & ((1u << width) - 1u);
}

/* Write `width` bits of `value`, MSB first, at `bit_off`. The caller must have
 * validated the range with bit165_fits. */
static void bit165_poke(uint8_t *buf, int32_t bit_off, int32_t width,
                        uint32_t value) {
    int32_t i;

    for (i = 0; i < width; i++) {
        int32_t at = bit_off + width - 1 - i;
        int32_t shift = 7 - (at & 7);
        uint32_t bit = (value >> i) & 1u;
        uint32_t byte = (uint32_t)buf[at >> 3];

        if (bit != 0u) {
            byte |= (1u << shift);
        } else {
            byte &= ~(1u << shift);
        }
        buf[at >> 3] = (uint8_t)(byte & 0xFFu);
    }
}

/* Read one field. Returns 0xFFFFFFFF on rejection, which no accepted read can
 * produce because width is capped at 24 bits. */
__attribute__((noinline)) uint32_t
bit165_read_bits(const uint8_t *buf, int32_t len, int32_t bit_off,
                 int32_t width) {
    int32_t limit = bit165_clamp(len);

    if (buf == NULL) {
        return BIT165_BAD;
    }
    if (!bit165_fits(limit, bit_off, width)) {
        return BIT165_BAD;
    }
    return bit165_pull_windowed(buf, bit_off, width);
}

/* 1 when both readers agree, 0 when they disagree, negative when the request
 * is out of range. */
__attribute__((noinline)) int32_t
bit165_cross_check(const uint8_t *buf, int32_t len, int32_t bit_off,
                   int32_t width) {
    int32_t limit = bit165_clamp(len);

    if (buf == NULL) {
        return -1;
    }
    if (!bit165_fits(limit, bit_off, width)) {
        return -2;
    }
    return (bit165_pull_bitwise(buf, bit_off, width) ==
            bit165_pull_windowed(buf, bit_off, width))
               ? 1
               : 0;
}

/* Pull consecutive `width`-bit fields until the buffer or the sink runs out.
 * Returns how many fields were produced. */
__attribute__((noinline)) int32_t
bit165_read_sequence(const uint8_t *buf, int32_t len, int32_t width,
                     int32_t *out, int32_t out_len) {
    int32_t limit = bit165_clamp(len);
    int32_t room = bit165_clamp(out_len);
    int32_t field_bits = width;
    int32_t count = 0;
    int32_t bit_off = 0;

    if (buf == NULL || out == NULL) {
        return -1;
    }
    if (field_bits < 1) {
        field_bits = 1;
    }
    if (field_bits > BIT165_MAX_WIDTH) {
        field_bits = BIT165_MAX_WIDTH;
    }
    while (count < room && bit165_fits(limit, bit_off, field_bits)) {
        out[count] = (int32_t)bit165_pull_windowed(buf, bit_off, field_bits);
        count++;
        bit_off += field_bits;
    }
    return count;
}

/* Lay out a 5-byte frame: 3-bit sync at bit 0, a 13-bit field at bit 3 (which
 * ends exactly on the byte-2 boundary), and a 19-bit field at bit 16 (which
 * ends 5 bits into byte 4). Returns the byte sum of the frame. */
__attribute__((noinline)) int32_t
bit165_write_frame(uint8_t *out, int32_t out_len, uint32_t small,
                   uint32_t large) {
    int32_t room = bit165_clamp(out_len);
    int32_t sum = 0;
    int32_t i;

    if (out == NULL) {
        return -1;
    }
    if (room < BIT165_FRAME_BYTES) {
        return -2;
    }
    for (i = 0; i < BIT165_FRAME_BYTES; i++) {
        out[i] = 0;
    }
    bit165_poke(out, 0, 3, BIT165_SYNC);
    bit165_poke(out, 3, 13, small);
    bit165_poke(out, 16, 19, large);
    for (i = 0; i < BIT165_FRAME_BYTES; i++) {
        sum += (int32_t)out[i];
    }
    return sum;
}

/* Write a frame into a local and read every field back: 1 for the sync, 2 for
 * the 13-bit field, 4 for the 19-bit field, 8 when both readers agree on the
 * boundary-crossing one. A perfect roundtrip returns 15. */
__attribute__((noinline)) int32_t
bit165_roundtrip(uint32_t small, uint32_t large) {
    uint8_t frame[BIT165_MAX_BUF];
    int32_t result = 0;
    int32_t rc;
    int32_t i;

    for (i = 0; i < BIT165_MAX_BUF; i++) {
        frame[i] = 0;
    }
    rc = bit165_write_frame(frame, BIT165_FRAME_BYTES, small, large);
    if (rc < 0) {
        return rc;
    }
    if (bit165_read_bits(frame, BIT165_FRAME_BYTES, 0, 3) == BIT165_SYNC) {
        result += 1;
    }
    if (bit165_read_bits(frame, BIT165_FRAME_BYTES, 3, 13) ==
        (small & 0x1FFFu)) {
        result += 2;
    }
    if (bit165_read_bits(frame, BIT165_FRAME_BYTES, 16, 19) ==
        (large & 0x7FFFFu)) {
        result += 4;
    }
    if (bit165_cross_check(frame, BIT165_FRAME_BYTES, 3, 13) == 1) {
        result += 8;
    }
    return result;
}

Recovered C

Generated by glaurung decompile --style decbench at b47f6b43. baseline.json records the result after recompiling the C and calling it beside the original with seeded inputs.

clang -O2

3/5
bit165_cross_check pass 129 lines
// glaurung: bit165_cross_check @ 0x11f0
int32_t bit165_cross_check(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    int total_bits;
    unsigned int acc;
    int i;
    int skew;
    int need;
    int at;
    int base;
    unsigned int bit;
    int limit;
    int trailing;
    unsigned int window;
    long ret;
    long var1;
    long var101;
    long var105;
    long var107;
    long var110;
    long var112;
    long var114;
    long var12;
    long var120;
    long var122;
    long var123;
    long var128;
    long var15;
    long var2;
    long var32;
    long var49;
    int var53;
    long var55;
    long var56;
    int var61;
    long var81;
    long var87;
    int var89;
    long var90;
    long var93;
    var1 = (((long)(arg1) < 16) ? arg1 : 16);
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    var2 = (unsigned long)((unsigned int)(arg3));
    ret = 0xfffffffe;
    if (((unsigned long)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg3)) - 25)))) < (unsigned long)(0xffffffe8))) {
        return ret;
    }
    if (((long)(arg2) < 0)) {
        return ret;
    }
    total_bits = (unsigned long)((unsigned int)((((0 <= (long)((int)(var1))) ? var1 : 0) << 3)));
    if ((total_bits < arg2)) {
        return ret;
    }
    if (((unsigned long)((unsigned long)((unsigned int)(total_bits))) < (unsigned long)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg3)) + arg2)))))) {
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg3)) != 1)) {
        var12 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) & -2)));
        acc = 0;
        var15 = (unsigned long)((unsigned int)(arg2));
        i = 0;
        do {
            var32 = (unsigned long)((unsigned int)((var15 + 1)));
            var49 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned char)(arg0[(long)((int)(((int)(var15) >> 3)))]))) >> ((~((unsigned long)((unsigned int)(var15)) & 255)) & 7)))) & 1)));
            acc = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var49 + var49))) + (acc * 4)))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned char)(arg0[(long)((int)(((int)(var32) >> 3)))]))) >> ((~(var32 & 255)) & 7)))) & 1))))));
            var53 = (i + 2);
            i = (unsigned long)((unsigned int)(var53));
            var15 = (unsigned long)((unsigned int)((var15 + 2)));
        } while (((unsigned int)(var12) != (unsigned int)(var53)));
        var55 = (unsigned long)((unsigned int)((acc + acc)));
        var56 = (unsigned long)(acc);
        if (((unsigned long)((unsigned char)((var2 & 1))) == 0)) {
            goto L_12e5;
        }
        goto L_12c0;
    } else {
        var55 = 0;
        i = 0;
        if (((unsigned long)((unsigned char)((var2 & 1))) != 0)) {
            L_12c0: ;
            var61 = (i + arg2);
            var56 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned char)(arg0[(long)((int)(((int)(var61) >> 3)))]))) >> ((unsigned long)((unsigned int)(((~((unsigned long)((unsigned int)(var61)) & 255)) & 7))) & 31)))) & 1))) | var55)));
        } else {
            var56 = var81;
        }
    }
    L_12e5: ;
    skew = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) & 7)));
    var87 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((skew + var2))) + 7)));
    var89 = ((unsigned int)(skew) + var2);
    var90 = (unsigned long)((unsigned int)(var89));
    if ((((unsigned long)((unsigned int)(var89)) == 0) | ((long)((int)(var89)) < 0))) {
        var93 = 0;
    } else {
        need = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var87)) >> 3)));
        var101 = (long)((int)(((int)(arg2) >> 3)));
        var105 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(need)) & 3)));
        if (((unsigned long)(3) <= (unsigned long)((need - 1)))) {
            var107 = (unsigned long)((unsigned int)((need & -4)));
            var110 = 0;
            do {
                var110 = (var110 + 4);
            } while ((var107 != var110));
            var112 = (unsigned long)((unsigned int)(*(int *)(((var110 + (var101 + (long)arg0)) - 4))));
            var114 = (unsigned int)(((((((unsigned int)(var112) & 255) << 24) | ((((unsigned int)(var112) >> 8) & 255) << 16)) | ((((unsigned int)(var112) >> 16) & 255) << 8)) | (((unsigned int)(var112) >> 24) & 255)));
        } else {
            var110 = 0;
            var114 = 0;
        }
        skew = var110;
        var93 = var114;
        if ((var105 != 0)) {
            var120 = (long)(((long)arg0 + (var110 + var101)));
            var122 = 0;
            var123 = var114;
            while ((var105 != var122)) {
                var128 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var123 << 8))) | (unsigned int)((unsigned char)(*(char *)((var120 + var122)))))));
                var122 = (var122 + 1);
                var123 = var128;
                skew = var122;
                var93 = var128;
            }
        }
    }
    // x86-64 epilogue: tear down frame
    return ((unsigned int)(var56) == (unsigned int)(((~(unsigned long)((unsigned int)((0xffffffff << ((unsigned long)((unsigned int)(var2)) & 31))))) & (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var93)) >> ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var87 & 248))) - var90))) & 31)))))));
}
bit165_read_bits pass 60 lines
// glaurung: bit165_read_bits @ 0x1130
uint32_t bit165_read_bits(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    int total_bits;
    int skew;
    int base;
    int i;
    int limit;
    int trailing;
    unsigned int window;
    long ret;
    long var0;
    long var15;
    int var17;
    long var18;
    long var2;
    long var22;
    int var24;
    long var25;
    long var31;
    long var37;
    var0 = (unsigned long)((unsigned int)(arg3));
    var2 = (((long)(arg1) < 16) ? arg1 : 16);
    ret = 0xffffffff;
    if ((arg0 == 0)) {
        return ret;
    }
    if (((unsigned long)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg3)) - 25)))) < (unsigned long)(0xffffffe8))) {
        return ret;
    }
    if (((long)(arg2) < 0)) {
        return ret;
    }
    total_bits = (unsigned long)((unsigned int)((((0 <= (long)((int)(var2))) ? var2 : 0) << 3)));
    if ((total_bits < arg2)) {
        return ret;
    }
    if (((unsigned long)((unsigned long)((unsigned int)(total_bits))) < (unsigned long)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg3)) + arg2)))))) {
        return ret;
    }
    skew = (unsigned long)((unsigned int)((arg2 & 7)));
    var15 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(skew)) + (unsigned long)((unsigned int)(arg3)))));
    var17 = ((unsigned int)((skew + (unsigned long)((unsigned int)(arg3)))) + 7);
    var18 = (unsigned long)((unsigned int)(var17));
    var22 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var17)) >> 3)));
    base = ((unsigned long)((unsigned int)(arg2)) >> 3);
    var24 = (unsigned int)((unsigned char)(*(char *)(((long)arg0 + base))));
    var25 = (unsigned long)((unsigned int)(var24));
    if (((unsigned long)((unsigned int)(var22)) != 1)) {
        var31 = (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((base + (long)arg0 + 0x1)))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var24)) << 8))))));
        var25 = var31;
        if (((unsigned long)((unsigned int)(var22)) != 2)) {
            var37 = (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((base + (long)arg0 + 0x2)))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var31)) << 8))))));
            var25 = var37;
            if (((unsigned long)((unsigned int)(var22)) != 3)) {
                var25 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var37 << 8))) | (unsigned int)((unsigned char)(*(char *)((base + (long)arg0 + 0x3)))))));
            }
        }
    }
    return (unsigned int)(((~(unsigned long)((unsigned int)((0xffffffff << ((unsigned long)((unsigned int)(var0)) & 31))))) & (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var25)) >> ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var18 & 248))) - var15))) & 31))))));
}
bit165_read_sequence pass 103 lines
// glaurung: bit165_read_sequence @ 0x1390
int32_t bit165_read_sequence(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t * arg3, int32_t arg4) {
    int field_bits;
    int count;
    int base;
    int bit_off;
    int i;
    int limit;
    int skew;
    int total_bits;
    int trailing;
    unsigned int window;
    long ret;
    long var1;
    long var17;
    long var18;
    long var19;
    long var24;
    long var25;
    long var27;
    long var29;
    long var33;
    long var39;
    long var4;
    long var42;
    int var47;
    int var5;
    long var51;
    int var53;
    long var59;
    long var6;
    long var65;
    long var7;
    long var8;
    int var9;
    var1 = ((16 <= (long)(arg1)) ? 16 : arg1);
    var4 = ((0 <= (long)((int)(var1))) ? var1 : 0);
    var5 = (((long)(arg4) < 16) ? arg4 : 16);
    var6 = 0xffffffff;
    ret = 0xffffffff;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    var7 = (long)arg3;
    ret = var6;
    if ((arg3 == 0)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    var8 = 1;
    var9 = ((((unsigned long)((unsigned int)(arg2)) == 0) | ((long)(arg2) < 0)) ? 1 : arg2);
    field_bits = (((unsigned long)((unsigned long)((unsigned int)(var9))) < (unsigned long)(24)) ? var9 : 24);
    if ((((unsigned long)((unsigned int)(arg4)) == 0) | ((long)(arg4) < 0))) {
        // x86-64 epilogue: tear down frame
        return 0;
    }
    var17 = (unsigned long)((unsigned int)((var4 << 3)));
    var18 = (~(unsigned long)((unsigned int)((0xffffffff << ((unsigned long)((unsigned int)(field_bits)) & 31)))));
    var19 = ((2 <= (long)((int)(var5))) ? var5 : var8);
    var24 = 0;
    var25 = 0;
    goto L_1428;
    L_1410: ;
    *(int *)((var7 + var25 * 4)) = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var33)) >> ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var27 & 120))) - var29))) & 31)))) & var18);
    count = (var25 + 1);
    var25 = (unsigned long)((unsigned int)(count));
    ret = var19;
    if ((var19 == count)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    L_1428: ;
    var39 = (unsigned long)((unsigned int)(var24));
    var24 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var24)) + field_bits)));
    if (((unsigned long)((unsigned long)((unsigned int)(var17))) < (unsigned long)((unsigned long)((unsigned int)(var24))))) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(var25);
    }
    var42 = (unsigned long)((unsigned int)((var39 & 7)));
    var29 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var42)) + field_bits)));
    var47 = ((unsigned int)((var42 + field_bits)) + 7);
    var27 = (unsigned long)((unsigned int)(var47));
    var51 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var47)) >> 3)));
    base = ((unsigned long)((unsigned int)(var39)) >> 3);
    var53 = (unsigned int)((unsigned char)(*(char *)(((long)arg0 + base))));
    var33 = (unsigned long)((unsigned int)(var53));
    if (((unsigned long)((unsigned int)(var51)) == 1)) {
        goto L_1410;
    }
    var59 = (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((base + (long)arg0 + 0x1)))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var53)) << 8))))));
    var33 = var59;
    if (((unsigned long)((unsigned int)(var51)) == 2)) {
        goto L_1410;
    }
    var65 = (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((base + (long)arg0 + 0x2)))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var59)) << 8))))));
    var33 = var65;
    if (((unsigned long)((unsigned int)(var51)) == 3)) {
        goto L_1410;
    }
    var33 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var65 << 8))) | (unsigned int)((unsigned char)(*(char *)((base + (long)arg0 + 0x3)))))));
    goto L_1410;
}
bit165_roundtrip fail 43 lines
// glaurung: bit165_roundtrip @ 0x1590
__attribute__((no_stack_protector)) int32_t bit165_roundtrip(uint32_t arg0, uint32_t arg1) {
    extern int bit165_cross_check(char *, int, int, int);
    extern unsigned int bit165_read_bits(char *, int, int, int);
    extern int bit165_write_frame(char *, int, unsigned int, unsigned int);
    int rc;
    int i;
    int result;
    unsigned char local_38[56];
    long rsp;
    long var0;
    long var1;
    unsigned int var10;
    long var15;
    unsigned int var16;
    long var21;
    unsigned int var22;
    long var27;
    int var28;
    int var7;
    // x86-64 prologue: save callee registers, frame 40 bytes
    rsp = (rsp - 16);
    var0 = (unsigned long)(arg1);
    var1 = (unsigned long)(arg0);
    *(int *)(&local_38[0]) = 0;
    *(int *)((&local_38[0] + 4)) = 0;
    *(int *)((&local_38[0] + 8)) = 0;
    *(int *)((&local_38[0] + 12)) = 0;
    var7 = bit165_write_frame((char *)(rsp), 5, arg0, arg1);
    rc = (unsigned long)((unsigned int)(var7));
    if ((0 <= (long)((int)(var7)))) {
        var10 = bit165_read_bits((char *)(&local_38[0]), 5, 0, 3);
        var15 = (var10 == 5);
        var16 = bit165_read_bits((char *)(&local_38[0]), 5, 3, 13);
        var21 = ((var16 != (unsigned long)((unsigned int)((var1 & 0x1fff)))) ? var15 : (unsigned long)((unsigned int)((var15 + 2))));
        var22 = bit165_read_bits((char *)(&local_38[0]), 5, 16, 19);
        var27 = ((var22 != (unsigned long)((unsigned int)((var0 & 0x7ffff)))) ? var21 : (unsigned long)((unsigned int)((var21 + 4))));
        var28 = bit165_cross_check((char *)(&local_38[0]), 5, 3, 13);
        rc = (((unsigned long)((unsigned int)(var28)) != 1) ? var27 : (unsigned long)((unsigned int)((var27 + 8))));
    }
    // x86-64 epilogue: restore callee registers
    return rc;
}
bit165_write_frame fail 55 lines
// glaurung: bit165_write_frame @ 0x14a0
int32_t bit165_write_frame(uint8_t * arg0, int32_t arg1, uint32_t arg2, uint32_t arg3) {
    extern long __unknown(long, ...);
    int i;
    int sum;
    long ret;
    long var1;
    long var10;
    int var18;
    long var2;
    long var20;
    long var21;
    long var23;
    int var24;
    long var29;
    int var37;
    long var4;
    int var47;
    int var48;
    int var5;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    ret = 0xfffffffe;
    if (((long)(arg1) < 5)) {
        return ret;
    }
    *(int *)(((long)arg0 + 0x1)) = 0;
    *(signed char *)(((long)arg0)) = -96;
    var1 = 0;
    var2 = 15;
    do {
        var4 = ((unsigned long)((unsigned int)(var2)) >> 3);
        var5 = (unsigned int)((unsigned char)(*(char *)(((long)arg0 + var4))));
        var10 = ((~((unsigned long)((unsigned int)(var2)) & 255)) & 7);
        *(signed char *)(((long)arg0 + var4)) = ((((unsigned long)(arg2) >> (var1 & 31)) & 1) ? (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var5)) | ((unsigned int)(1) << (var10 & 31))))) : (unsigned long)((unsigned int)((var5 & (~((unsigned int)(1) << (var10 & 31)))))));
        var1 = (unsigned long)((unsigned int)((var1 + 1)));
        var18 = (var2 - 1);
        var2 = (unsigned long)((unsigned int)(var18));
    } while (((unsigned long)((unsigned int)(var18)) != 2));
    var20 = 0;
    var21 = 34;
    do {
        var23 = ((unsigned long)((unsigned int)(var21)) >> 3);
        var24 = (unsigned int)((unsigned char)(*(char *)(((long)arg0 + var23))));
        var29 = ((~((unsigned long)((unsigned int)(var21)) & 255)) & 7);
        *(signed char *)(((long)arg0 + var23)) = ((((unsigned long)(arg3) >> (var20 & 31)) & 1) ? (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var24)) | ((unsigned int)(1) << (var29 & 31))))) : (unsigned long)((unsigned int)((var24 & (~((unsigned int)(1) << (var29 & 31)))))));
        var20 = (unsigned long)((unsigned int)((var20 + 1)));
        var37 = (var21 - 1);
        var21 = (unsigned long)((unsigned int)(var37));
    } while (((unsigned long)((unsigned int)(var37)) != 15));
    var47 = __unknown(0);
    var48 = __unknown(0);
    return (unsigned int)(((unsigned long)((unsigned int)(((((unsigned int)((unsigned short)((((unsigned int)(var48) >> 16) & 0xffff))) | ((unsigned int)(0) << 16)) + ((unsigned int)((unsigned short)((((unsigned int)(var47) >> 16) & 0xffff))) | ((unsigned int)(0) << 16))) + (((unsigned int)((unsigned short)(var48)) | ((unsigned int)(0) << 16)) + ((unsigned int)((unsigned short)(var47)) | ((unsigned int)(0) << 16)))))) + (unsigned int)((unsigned char)(*(char *)(((long)arg0 + 0x4))))));
}

gcc -O2

3/5
bit165_cross_check pass 49 lines
// glaurung: bit165_cross_check @ 0x1240
int32_t bit165_cross_check(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    extern unsigned int bit165_pull_windowed(char *, int, int);
    unsigned int acc;
    int at;
    long ret;
    long var0;
    long var1;
    long var10;
    long var11;
    long var14;
    long var15;
    long var16;
    int var19;
    long var34;
    unsigned int var35;
    long var4;
    long var8;
    var0 = (unsigned long)((unsigned int)(arg2));
    var1 = (unsigned long)((unsigned int)(arg3));
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    ret = 0xfffffffe;
    if (((unsigned long)(23) < (unsigned long)((unsigned long)((unsigned int)((arg3 - 1)))))) {
        return ret;
    }
    var4 = (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0) ? 16 : arg1);
    var8 = (unsigned long)((unsigned int)(arg2));
    var10 = (unsigned long)((unsigned int)(((((long)((int)(var4)) < 0) ? 0 : var4) << 3)));
    if (((unsigned long)((unsigned long)((unsigned int)(var10))) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        return ret;
    }
    var11 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg2)) + arg3)));
    if (((long)((int)(var10)) < (long)((int)(var11)))) {
        return ret;
    }
    var14 = 0;
    do {
        var15 = (unsigned long)((unsigned int)(var8));
        var16 = (unsigned long)((unsigned int)(var8));
        var19 = (var8 + 1);
        var8 = (unsigned long)((unsigned int)(var19));
        var34 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var14 + var14))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((unsigned char)(arg0[(long)((int)(((int)(var15) >> 3)))]))) >> ((unsigned long)((unsigned int)(((~var16) & 7))) & 31)))) & 1))))));
        var14 = var34;
    } while (((unsigned int)(var11) != (unsigned int)(var19)));
    var35 = bit165_pull_windowed((char *)(arg0), (unsigned long)((unsigned int)(var0)), (unsigned long)((unsigned int)(var1)));
    return ((unsigned int)(var35) == (unsigned int)(var34));
}
bit165_read_bits fail 22 lines
// glaurung: bit165_read_bits @ 0x11f0
unsigned int bit165_read_bits(char * arg0, int arg1, int arg2, int arg3, long arg4, long arg5) {
    extern unsigned int bit165_pull_windowed(char *, int, int, int, long, long);
    unsigned int ret;
    long var10;
    long var5;
    if ((arg0 != 0)) {
        if (((unsigned long)(23) < (unsigned long)((unsigned long)((unsigned int)((arg3 - 1)))))) {
            return 0xffffffff;
        }
        var5 = (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0) ? 16 : (unsigned long)((unsigned int)(arg1)));
        var10 = (unsigned long)((unsigned int)(((((long)((int)(var5)) < 0) ? 0 : var5) << 3)));
        if (((unsigned long)((unsigned long)((unsigned int)(var10))) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
            return 0xffffffff;
        }
        if (((long)((int)(((unsigned long)((unsigned int)(arg2)) + (unsigned long)((unsigned int)(arg3))))) <= (long)((int)(var10)))) {
            ret = bit165_pull_windowed(arg0, arg1, arg2, arg3, arg4, arg5);
            return ret;
        }
    }
    return 0xffffffff;
}
bit165_read_sequence pass 79 lines
// glaurung: bit165_read_sequence @ 0x12d0
int32_t bit165_read_sequence(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t * arg3, int32_t arg4) {
    extern unsigned int bit165_pull_windowed(char *, int, int);
    int room;
    int field_bits;
    int total_bits;
    int count;
    int bit_off;
    long local_10;
    long local_18;
    long local_20;
    long local_30;
    long local_8;
    long ret;
    long var1;
    long var10;
    int var11;
    long var2;
    long var22;
    long var25;
    long var3;
    char * var30;
    unsigned int var36;
    int var38;
    long var6;
    long var7;
    long var8;
    local_8 = var1;
    local_10 = var2;
    var3 = (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0) ? 16 : arg1);
    local_18 = var6;
    local_20 = var7;
    var8 = (((long)((int)(var3)) < 0) ? 0 : var3);
    local_30 = var10;
    var11 = ((((unsigned long)((unsigned int)(arg4)) == 16) | ((long)(arg4) < 16)) ? arg4 : 16);
    room = (((long)((int)(var11)) < 0) ? 0 : (unsigned long)((unsigned int)(var11)));
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return 0xffffffff;
    }
    var22 = (long)arg3;
    if ((arg3 == 0)) {
        // x86-64 epilogue: tear down frame
        return 0xffffffff;
    }
    var25 = ((((unsigned long)((unsigned int)(arg2)) == 24) | ((long)(arg2) < 24)) ? arg2 : 24);
    field_bits = ((((unsigned long)((unsigned int)(var25)) == 0) | ((long)((int)(var25)) < 0)) ? 1 : var25);
    if ((((unsigned long)((unsigned int)(arg4)) == 0) | ((long)(arg4) < 0))) {
        // x86-64 epilogue: tear down frame
        return 0;
    }
    total_bits = (unsigned long)((unsigned int)((var8 * 8)));
    if (((((unsigned int)(field_bits) == (unsigned int)(total_bits)) | (field_bits < total_bits)) == 0)) {
        // x86-64 epilogue: tear down frame
        return 0;
    }
    var30 = (char *)arg0;
    count = 1;
    bit_off = 0;
    while (1) {
        var36 = bit165_pull_windowed(var30, (unsigned long)((unsigned int)(bit_off)), (unsigned long)((unsigned int)(field_bits)));
        *(int *)((var22 + count * 4 - 0x4)) = var36;
        ret = (unsigned long)((unsigned int)(count));
        if (((((unsigned int)(room) == (unsigned int)(count)) | (room < count)) != 0)) {
            break;
        }
        var38 = (bit_off + field_bits);
        bit_off = (unsigned long)((unsigned int)(var38));
        if ((total_bits < var38)) {
            break;
        }
        count = (count + 1);
        if (((long)(total_bits) < (long)((int)((field_bits + bit_off))))) {
            break;
        }
    }
    // x86-64 epilogue: tear down frame
    return ret;
}
bit165_roundtrip fail 58 lines
// glaurung: bit165_roundtrip @ 0x1480
__attribute__((no_stack_protector)) int32_t bit165_roundtrip(uint32_t arg0, uint32_t arg1) {
    extern int bit165_cross_check(char *, int, int, int);
    extern unsigned int bit165_read_bits(char *, int, int, int);
    extern int bit165_write_frame(char *, int, unsigned int, unsigned int);
    int i;
    int rc;
    int result;
    long rbp;
    long rsp;
    long stack_2;
    unsigned char stack_5[16];
    int var13;
    long var16;
    unsigned int var18;
    long var23;
    long var25;
    unsigned int var26;
    long var30;
    unsigned int var31;
    long var41;
    int var43;
    long var7;
    long var9;
    rsp = (rsp - 8);
    rsp = (rsp - 8);
    var7 = (unsigned long)(arg1);
    rsp = (rsp - 8);
    stack_2 = rbp;
    rsp = (rsp - 8);
    var9 = (unsigned long)(arg0);
    rsp = (rsp - 40);
    // stack canary: save guard to %stack_4
    rbp = rsp;
    *(int *)(&stack_5[0]) = 0;
    *(int *)((&stack_5[0] + 4)) = 0;
    *(int *)((&stack_5[0] + 8)) = 0;
    *(int *)((&stack_5[0] + 12)) = 0;
    var13 = ((int (*)(char *))bit165_write_frame)((char *)(rsp));
    var16 = (unsigned long)((unsigned int)(var13));
    if ((0 <= (long)((int)(var13)))) {
        var18 = bit165_read_bits((char *)(rbp), 5, 0, 3);
        var23 = (var18 == 5);
        var25 = (unsigned long)((unsigned int)((var9 & 0x1fff)));
        var26 = bit165_read_bits((char *)(rbp), 5, 3, 13);
        var30 = ((var26 == (unsigned long)((unsigned int)(var25))) ? (unsigned long)((unsigned int)((var23 + 2))) : var23);
        var31 = bit165_read_bits((char *)(rbp), 5, 16, 19);
        var41 = ((var31 == (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var7)) & 0x7ffff)))) ? (unsigned long)((unsigned int)((var30 + 4))) : var30);
        var43 = ((int (*)(void))bit165_cross_check)();
        var16 = (((unsigned long)((unsigned int)(var43)) == 1) ? (unsigned long)((unsigned int)((var41 + 8))) : var41);
    }
    // stack-canary check
    rsp = (rsp + 40);
    rsp = (rsp + 8);
    rbp = stack_2;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(var16);
}
bit165_write_frame pass 76 lines
// glaurung: bit165_write_frame @ 0x1390
int32_t bit165_write_frame(uint8_t * arg0, int32_t arg1, uint32_t arg2, uint32_t arg3) {
    int i;
    unsigned int byte;
    int sum;
    int at;
    unsigned int bit;
    int shift;
    long ret;
    long var0;
    long var1;
    long var19;
    long var25;
    int var33;
    int var36;
    int var39;
    int var4;
    int var40;
    long var41;
    int var5;
    long var54;
    long var60;
    int var61;
    int var68;
    int var71;
    long var72;
    long var75;
    long var76;
    int var77;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    if ((((unsigned long)((unsigned int)(arg1)) == 4) | ((long)(arg1) < 4))) {
        return 0xfffffffe;
    }
    var0 = (unsigned long)(arg2);
    var1 = (unsigned long)(arg3);
    var4 = 15;
    var5 = 1;
    *(int *)(((long)arg0 + 0x1)) = 0;
    *(signed char *)(((long)arg0)) = -96;
    i = 0;
    do {
        var19 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var5)) << ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(i)) & 7))) & 31))));
        var25 = (long)(((long)((int)(((int)(((unsigned long)((unsigned int)(var4)) - i)) >> 3))) + (long)arg0));
        byte = (unsigned int)((unsigned char)(*(char *)((var25))));
        var33 = ((unsigned int)(((unsigned long)((unsigned int)(var0)) >> ((unsigned long)((unsigned int)(i)) & 31))) & 1);
        var36 = (i + 1);
        i = (unsigned long)((unsigned int)(var36));
        *(signed char *)((var25)) = (((unsigned long)((unsigned int)(var33)) != 0) ? (unsigned long)((unsigned int)((byte | var19))) : (unsigned long)((unsigned int)(((~var19) & byte))));
    } while (((unsigned long)((unsigned int)(var36)) != 13));
    var39 = 34;
    var40 = 1;
    var41 = 0;
    do {
        var54 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var40)) << ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var41 - 35))) & 7))) & 31))));
        var60 = (long)(((long)((int)(((int)(((unsigned long)((unsigned int)(var39)) - var41)) >> 3))) + (long)arg0));
        var61 = (unsigned int)((unsigned char)(*(char *)((var60))));
        var68 = ((unsigned int)(((unsigned long)((unsigned int)(var1)) >> ((unsigned long)((unsigned int)(var41)) & 31))) & 1);
        var71 = (var41 + 1);
        var41 = (unsigned long)((unsigned int)(var71));
        *(signed char *)((var60)) = (((unsigned long)((unsigned int)(var68)) != 0) ? (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var61)) | var54))) : (unsigned long)((unsigned int)(((~var54) & var61))));
    } while (((unsigned long)((unsigned int)(var71)) != 19));
    var72 = (long)((arg0 + 5));
    var75 = 0;
    var76 = (long)arg0;
    do {
        var77 = (unsigned int)((unsigned char)(*(char *)((var76))));
        var76 = (var76 + 1);
        sum = (var75 + var77);
        ret = (unsigned long)((unsigned int)(sum));
        var75 = (unsigned long)((unsigned int)(sum));
    } while ((var76 != var72));
    // x86-64 epilogue: tear down frame
    return ret;
}

clang -O0

5/5
bit165_cross_check pass 29 lines
// glaurung: bit165_cross_check @ 0x1310
int32_t bit165_cross_check(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    extern int bit165_clamp(int);
    extern int bit165_fits(int, int, int);
    extern unsigned int bit165_pull_bitwise(char *, int, int);
    extern unsigned int bit165_pull_windowed(char *, int, int);
    int limit;
    int local_24;
    int var0;
    int var2;
    unsigned int var4;
    unsigned int var6;
    // x86-64 prologue: save rbp, frame 48 bytes
    var0 = bit165_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var0;
    if ((arg0 != 0)) {
        var2 = bit165_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
        if (((unsigned long)((unsigned int)(var2)) != 0)) {
            var4 = bit165_pull_bitwise((char *)(arg0), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
            local_24 = var4;
            var6 = bit165_pull_windowed((char *)(arg0), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
            return (unsigned int)(((unsigned int)(local_24) == (unsigned int)(var6)) ? 1 : 0);
        } else {
            return (unsigned int)(-2);
        }
    } else {
        return (unsigned int)(-1);
    }
}
bit165_read_bits pass 24 lines
// glaurung: bit165_read_bits @ 0x1130
uint32_t bit165_read_bits(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    extern int bit165_clamp(int);
    extern int bit165_fits(int, int, int);
    extern unsigned int bit165_pull_windowed(char *, int, int);
    int limit;
    int var0;
    int var2;
    unsigned int var4;
    // x86-64 prologue: save rbp, frame 32 bytes
    var0 = bit165_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var0;
    if ((arg0 != 0)) {
        var2 = bit165_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
        if (((unsigned long)((unsigned int)(var2)) != 0)) {
            var4 = bit165_pull_windowed((char *)(arg0), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
            return (unsigned int)(var4);
        } else {
            return (unsigned int)(-1);
        }
    } else {
        return (unsigned int)(-1);
    }
}
bit165_read_sequence pass 56 lines
// glaurung: bit165_read_sequence @ 0x1430
int32_t bit165_read_sequence(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t * arg3, int32_t arg4) {
    extern int bit165_clamp(int);
    extern int bit165_fits(int, int, int);
    extern unsigned int bit165_pull_windowed(char *, int, int);
    int limit;
    int room;
    int field_bits;
    int count;
    int bit_off;
    signed char local_39;
    int local_4;
    int var0;
    unsigned int var14;
    int var2;
    int var8;
    var0 = bit165_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var0;
    var2 = bit165_clamp((unsigned long)((unsigned int)(arg4)));
    room = var2;
    field_bits = arg2;
    count = 0;
    bit_off = 0;
    if ((arg0 != 0)) {
        if ((arg3 != 0)) {
            goto L_1496;
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_1496: ;
    if (((long)(field_bits) < 1)) {
        field_bits = 1;
    }
    if (((((unsigned long)((unsigned int)(field_bits)) == 24) | ((long)(field_bits) < 24)) == 0)) {
        field_bits = 24;
    }
    goto L_14bd;
    L_14bd: ;
    local_39 = 0;
    if ((count < room)) {
        var8 = bit165_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(bit_off)), (unsigned long)((unsigned int)(field_bits)));
        local_39 = ((unsigned long)((unsigned int)(var8)) != 0);
    }
    if (((unsigned long)((unsigned char)((local_39 & 1))) != 0)) {
        var14 = bit165_pull_windowed((char *)(arg0), (unsigned long)((unsigned int)(bit_off)), (unsigned long)((unsigned int)(field_bits)));
        arg3[(long)(count)] = var14;
        count = ((unsigned int)(count) + 1);
        bit_off = ((unsigned int)(field_bits) + bit_off);
        goto L_14bd;
    }
    local_4 = count;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
bit165_roundtrip pass 43 lines
// glaurung: bit165_roundtrip @ 0x1710
__attribute__((no_stack_protector)) int32_t bit165_roundtrip(uint32_t arg0, uint32_t arg1) {
    extern int bit165_cross_check(char *, int, int, int);
    extern unsigned int bit165_read_bits(char *, int, int, int);
    extern int bit165_write_frame(char *, int, unsigned int, unsigned int);
    int result;
    int i;
    int rc;
    unsigned char local_20[16];
    unsigned int var12;
    unsigned int var20;
    int var28;
    int var4;
    unsigned int var7;
    // x86-64 prologue: save rbp, frame 48 bytes
    result = 0;
    for (i = 0; ((long)(i) < 16); i++) {
        *(signed char *)((&local_20[0] + (long)(i))) = 0;
    }
    var4 = bit165_write_frame((char *)(&local_20[0]), 5, arg0, arg1);
    rc = var4;
    if ((0 <= (long)(rc))) {
        var7 = bit165_read_bits((char *)(&local_20[0]), 5, 0, 3);
        if ((var7 == 5)) {
            result = ((unsigned int)(result) + 1);
        }
        var12 = bit165_read_bits((char *)(&local_20[0]), 5, 3, 13);
        if ((var12 == (unsigned long)((unsigned int)((arg0 & 0x1fff))))) {
            result = ((unsigned int)(result) + 2);
        }
        var20 = bit165_read_bits((char *)(&local_20[0]), 5, 16, 19);
        if ((var20 == (unsigned long)((unsigned int)((arg1 & 0x7ffff))))) {
            result = ((unsigned int)(result) + 4);
        }
        var28 = bit165_cross_check((char *)(&local_20[0]), 5, 3, 13);
        if (((unsigned long)((unsigned int)(var28)) == 1)) {
            result = ((unsigned int)(result) + 8);
        }
        return (unsigned int)(result);
    } else {
        return (unsigned int)(rc);
    }
}
bit165_write_frame pass 31 lines
// glaurung: bit165_write_frame @ 0x1540
int32_t bit165_write_frame(uint8_t * arg0, int32_t arg1, uint32_t arg2, uint32_t arg3) {
    extern int bit165_clamp(int);
    extern void bit165_poke(char *, int, int, unsigned int);
    int room;
    int sum;
    int i;
    int var0;
    // x86-64 prologue: save rbp, frame 48 bytes
    var0 = bit165_clamp((unsigned long)((unsigned int)(arg1)));
    room = var0;
    sum = 0;
    if ((arg0 != 0)) {
        if ((5 <= (long)(room))) {
            for (i = 0; ((long)(i) < 5); i++) {
                arg0[i] = 0;
            }
            bit165_poke((char *)(arg0), 0, 3, 5);
            bit165_poke((char *)(arg0), 3, 13, arg2);
            bit165_poke((char *)(arg0), 16, 19, arg3);
            for (i = 0; ((long)(i) < 5); i++) {
                sum = ((unsigned int)((unsigned char)(arg0[i])) + sum);
            }
            return (unsigned int)(sum);
        } else {
            return (unsigned int)(-2);
        }
    } else {
        return (unsigned int)(-1);
    }
}

gcc -O0

5/5
bit165_cross_check pass 29 lines
// glaurung: bit165_cross_check @ 0x1433
int32_t bit165_cross_check(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    extern int bit165_clamp(int);
    extern int bit165_fits(int, int, int);
    extern unsigned int bit165_pull_bitwise(char *, int, int);
    extern unsigned int bit165_pull_windowed(char *, int, int);
    int limit;
    int var1;
    long var11;
    unsigned int var14;
    int var5;
    unsigned int var9;
    // x86-64 prologue: save rbp, frame 8 bytes
    var1 = bit165_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var1;
    if ((arg0 != 0)) {
        var5 = bit165_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
        if (((unsigned long)((unsigned int)(var5)) != 0)) {
            var9 = bit165_pull_bitwise((char *)(arg0), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
            var11 = (unsigned long)(var9);
            var14 = bit165_pull_windowed((char *)(arg0), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
            return ((unsigned int)(var11) == (unsigned int)(var14));
        } else {
            return 0xfffffffe;
        }
    } else {
        return 0xffffffff;
    }
}
bit165_read_bits pass 24 lines
// glaurung: bit165_read_bits @ 0x13cc
uint32_t bit165_read_bits(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t arg3) {
    extern int bit165_clamp(int);
    extern int bit165_fits(int, int, int);
    extern unsigned int bit165_pull_windowed(char *, int, int);
    int limit;
    int var1;
    int var5;
    unsigned int var9;
    // x86-64 prologue: save rbp, frame 40 bytes
    var1 = bit165_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var1;
    if ((arg0 != 0)) {
        var5 = bit165_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
        if (((unsigned long)((unsigned int)(var5)) != 0)) {
            var9 = bit165_pull_windowed((char *)(arg0), (unsigned long)((unsigned int)(arg2)), (unsigned long)((unsigned int)(arg3)));
            return var9;
        } else {
            return 0xffffffff;
        }
    } else {
        return 0xffffffff;
    }
}
bit165_read_sequence pass 49 lines
// glaurung: bit165_read_sequence @ 0x14bd
int32_t bit165_read_sequence(const uint8_t * arg0, int32_t arg1, int32_t arg2, int32_t * arg3, int32_t arg4) {
    extern int bit165_clamp(int);
    extern int bit165_fits(int, int, int);
    extern unsigned int bit165_pull_windowed(char *, int, int);
    int limit;
    int room;
    int field_bits;
    int count;
    int bit_off;
    int var1;
    int var10;
    unsigned int var14;
    int var4;
    // x86-64 prologue: save rbp, frame 64 bytes
    var1 = bit165_clamp((unsigned long)((unsigned int)(arg1)));
    limit = var1;
    var4 = bit165_clamp((unsigned long)((unsigned int)(arg4)));
    room = var4;
    field_bits = arg2;
    count = 0;
    bit_off = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((arg3 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((((unsigned long)((unsigned int)(field_bits)) == 0) | ((long)(field_bits) < 0)) != 0)) {
        field_bits = 1;
    }
    if (((((unsigned long)((unsigned int)(field_bits)) == 24) | ((long)(field_bits) < 24)) == 0)) {
        field_bits = 24;
    }
    while ((count < room)) {
        var10 = bit165_fits((unsigned long)((unsigned int)(limit)), (unsigned long)((unsigned int)(bit_off)), (unsigned long)((unsigned int)(field_bits)));
        if (((unsigned long)((unsigned int)(var10)) == 0)) {
            break;
        }
        var14 = bit165_pull_windowed((char *)(arg0), (unsigned long)((unsigned int)(bit_off)), (unsigned long)((unsigned int)(field_bits)));
        arg3[(long)(count)] = var14;
        count = (count + 1);
        bit_off = (bit_off + (unsigned int)(field_bits));
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(count);
}
bit165_roundtrip pass 52 lines
// glaurung: bit165_roundtrip @ 0x1682
int32_t bit165_roundtrip(uint32_t arg0, uint32_t arg1) {
    extern __attribute__((noreturn)) void __stack_chk_fail(void);
    extern int bit165_cross_check(char *, int, int, int);
    extern unsigned int bit165_read_bits(char *, int, int, int);
    extern int bit165_write_frame(char *, int, unsigned int, unsigned int);
    int result;
    int i;
    int rc;
    unsigned char local_20[16];
    long local_8;
    long ret;
    unsigned int var12;
    unsigned int var18;
    int var24;
    int var6;
    unsigned int var9;
    // x86-64 prologue: save rbp, frame 64 bytes
    local_8 = (long)(0x28);
    result = 0;
    for (i = 0; ((((unsigned long)((unsigned int)(i)) == 15) | ((long)(i) < 15)) != 0); i++) {
        *(signed char *)((&local_20[0] + (long)(i))) = 0;
    }
    var6 = bit165_write_frame((char *)(&local_20[0]), 5, arg0, arg1);
    rc = var6;
    if ((0 <= (long)(rc))) {
        var9 = bit165_read_bits((char *)(&local_20[0]), 5, 0, 3);
        if ((var9 == 5)) {
            result = (result + 1);
        }
        var12 = bit165_read_bits((char *)(&local_20[0]), 5, 3, 13);
        if ((var12 == (unsigned long)((unsigned int)((arg0 & 0x1fff))))) {
            result = (result + 2);
        }
        var18 = bit165_read_bits((char *)(&local_20[0]), 5, 16, 19);
        if ((var18 == (unsigned long)((unsigned int)((arg1 & 0x7ffff))))) {
            result = (result + 4);
        }
        var24 = bit165_cross_check((char *)(&local_20[0]), 5, 3, 13);
        if (((unsigned long)((unsigned int)(var24)) == 1)) {
            result = (result + 8);
        }
        ret = (unsigned long)((unsigned int)(result));
    } else {
        ret = (unsigned long)((unsigned int)(rc));
    }
    if ((local_8 != 0x28)) {
        __stack_chk_fail();
    }
    // x86-64 epilogue: restore rbp
    return ret;
}
bit165_write_frame pass 31 lines
// glaurung: bit165_write_frame @ 0x1592
int32_t bit165_write_frame(uint8_t * arg0, int32_t arg1, uint32_t arg2, uint32_t arg3) {
    extern int bit165_clamp(int);
    extern void bit165_poke(char *, int, int, unsigned int);
    int room;
    int sum;
    int i;
    int var1;
    // x86-64 prologue: save rbp, frame 40 bytes
    var1 = bit165_clamp((unsigned long)((unsigned int)(arg1)));
    room = var1;
    sum = 0;
    if ((arg0 != 0)) {
        if (((((unsigned long)((unsigned int)(room)) == 4) | ((long)(room) < 4)) == 0)) {
            for (i = 0; ((((unsigned long)((unsigned int)(i)) == 4) | ((long)(i) < 4)) != 0); i++) {
                arg0[i] = 0;
            }
            bit165_poke((char *)(arg0), 0, 3, 5);
            bit165_poke((char *)(arg0), 3, 13, arg2);
            bit165_poke((char *)(arg0), 16, 19, arg3);
            for (i = 0; ((((unsigned long)((unsigned int)(i)) == 4) | ((long)(i) < 4)) != 0); i++) {
                sum = (sum + (unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[i])) & 255))));
            }
            return (unsigned int)(sum);
        } else {
            return 0xfffffffe;
        }
    } else {
        return 0xffffffff;
    }
}

← 213 fixtures