Fixture 219

rust iterator chains

Rust · 7 functions · 2 lanes · 6 of 14 function-lanes behave identically

2 of 2 lanes have a function that returns a different result after decompilation: rustc-O0 (0/7), rustc-O2 (6/7).

Iterator adapter chains — the single most idiomatic Rust codegen shape, and one none of 166_*..171_* covers.

WHY IT IS ITS OWN PROBLEM. values.iter().filter(..).map(..).sum() is not a library call at the machine level. Each adapter is a distinct zero-sized (or closure-sized) type, next() is monomorphized per chain, and the optimiser then fuses the whole pipeline into ONE loop — usually with the bounds check elided, the closure inlined, and the Option discriminant folded into the loop's exit test. What reaches the decompiler is a loop whose induction variable, bound and body all came from different source constructs.

At -O0 none of that fusion happens: every adapter is a real struct, every next() is a real call returning an Option<T> by value, and the chain is a stack of nested calls. So the two lanes test opposite things — O0 tests whether a deep call chain over small aggregates is recovered, O2 tests whether the fused loop is recognised as a loop rather than as goto soup.

169_rust_slices_bounds covers indexing a slice and the panic branch a bounds check inserts; 166_rust_generics covers monomorphization of a generic function. Neither builds an adapter chain, so neither reaches the Iterator trait's associated-type machinery or the closure environments the adapters carry.

Every function takes and returns plain integers so the harness can drive it through the same differential as the C fixtures, and every input is bounded in-source so no arithmetic can overflow (Rust panics on overflow in debug, which would make the two lanes disagree for reasons unrelated to recovery).

tests/decompiler_fixtures/src/219_rust_iterator_chains.rs source
//! Iterator adapter chains — the single most idiomatic Rust codegen shape, and
//! one none of `166_*`..`171_*` covers.
//!
//! WHY IT IS ITS OWN PROBLEM. `values.iter().filter(..).map(..).sum()` is not a
//! library call at the machine level. Each adapter is a distinct zero-sized (or
//! closure-sized) type, `next()` is monomorphized per chain, and the optimiser
//! then fuses the whole pipeline into ONE loop — usually with the bounds check
//! elided, the closure inlined, and the `Option` discriminant folded into the
//! loop's exit test. What reaches the decompiler is a loop whose induction
//! variable, bound and body all came from different source constructs.
//!
//! At `-O0` none of that fusion happens: every adapter is a real struct, every
//! `next()` is a real call returning an `Option<T>` by value, and the chain is
//! a stack of nested calls. So the two lanes test opposite things — `O0` tests
//! whether a deep call chain over small aggregates is recovered, `O2` tests
//! whether the fused loop is recognised as a loop rather than as goto soup.
//!
//! `169_rust_slices_bounds` covers indexing a slice and the panic branch a
//! bounds check inserts; `166_rust_generics` covers monomorphization of a
//! generic function. Neither builds an adapter chain, so neither reaches the
//! `Iterator` trait's associated-type machinery or the closure environments the
//! adapters carry.
//!
//! Every function takes and returns plain integers so the harness can drive it
//! through the same differential as the C fixtures, and every input is bounded
//! in-source so no arithmetic can overflow (Rust panics on overflow in debug,
//! which would make the two lanes disagree for reasons unrelated to recovery).

/// A filter/map/sum pipeline over a slice built in-function.
#[no_mangle]
pub extern "C" fn iter_filter_map_sum(count: i32) -> i64 {
    if count < 0 || count > 64 {
        return -1;
    }
    let values: Vec<i64> = (0..count as i64).collect();
    values
        .iter()
        .filter(|v| **v % 3 != 0)
        .map(|v| v * 2)
        .sum::<i64>()
}

/// `enumerate` + `fold`: the index and the accumulator are both loop-carried,
/// and the closure captures nothing.
#[no_mangle]
pub extern "C" fn iter_enumerate_fold(count: i32) -> i64 {
    if count < 0 || count > 64 {
        return -1;
    }
    (0..count as i64)
        .enumerate()
        .fold(0i64, |acc, (i, v)| acc + (i as i64) * v)
}

/// `take_while` / `skip_while`: the exit condition is a closure rather than a
/// comparison against the length, so the fused loop's bound is data-dependent.
#[no_mangle]
pub extern "C" fn iter_take_skip(count: i32, limit: i32) -> i64 {
    if count < 0 || count > 64 || limit < 0 || limit > 64 {
        return -1;
    }
    let lim = limit as i64;
    (0..count as i64)
        .skip_while(|v| *v < lim / 2)
        .take_while(|v| *v < lim)
        .sum::<i64>()
}

/// `zip` of two ranges: two induction variables advanced together, with the
/// shorter one deciding the trip count.
#[no_mangle]
pub extern "C" fn iter_zip_dot(a_len: i32, b_len: i32) -> i64 {
    if a_len < 0 || a_len > 32 || b_len < 0 || b_len > 32 {
        return -1;
    }
    (0..a_len as i64)
        .zip((0..b_len as i64).map(|v| v * 3))
        .map(|(x, y)| x * y)
        .sum::<i64>()
}

/// `rev` + `chain`: a reversed range concatenated with a forward one, which
/// fuses into a single loop with two phases.
#[no_mangle]
pub extern "C" fn iter_rev_chain(count: i32) -> i64 {
    if count < 0 || count > 32 {
        return -1;
    }
    let n = count as i64;
    (0..n).rev().chain(0..n).map(|v| v + 1).sum::<i64>()
}

/// A closure that CAPTURES a local, so the adapter's environment is a real
/// field rather than a zero-sized type.
#[no_mangle]
pub extern "C" fn iter_capturing_closure(count: i32, scale: i32) -> i64 {
    if count < 0 || count > 64 {
        return -1;
    }
    let factor = (scale & 7) as i64 + 1;
    (0..count as i64).map(|v| v * factor).sum::<i64>()
}

/// CONTROL: the same arithmetic as `iter_filter_map_sum`, written as an
/// explicit loop. If this fails too, the defect is in loop recovery rather than
/// in the adapter chain.
#[no_mangle]
pub extern "C" fn explicit_loop_control(count: i32) -> i64 {
    if count < 0 || count > 64 {
        return -1;
    }
    let mut total: i64 = 0;
    let mut i: i64 = 0;
    while i < count as i64 {
        if i % 3 != 0 {
            total += i * 2;
        }
        i += 1;
    }
    total
}

Recovered C

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

rustc -O0

0/7
explicit_loop_control fail 82 lines
// glaurung: explicit_loop_control @ 0xc970
long explicit_loop_control(int arg0) {
    extern long __unknown(long, ...);
    extern long _ZN4core9panicking5panic17hf516d800ede7db8cE(const char *, int, long);
    long local_10;
    long local_18;
    long local_20;
    long local_30;
    long local_38;
    long local_40;
    long local_48;
    long of_11;
    long t172;
    long var17;
    long var28;
    long var32;
    long var36;
    long var40;
    if ((0 <= (long)(arg0))) {
        if ((((unsigned long)((unsigned int)(arg0)) == 64) | ((long)(arg0) < 64))) {
            goto L_c995;
        }
    }
    local_20 = -1;
    goto L_c9e6;
    L_c995: ;
    local_18 = 0;
    local_10 = 0;
    L_c9a7: ;
    if (((long)(arg0) <= local_10)) {
        local_20 = local_18;
        goto L_c9e6;
    }
    local_30 = local_10;
    if (0) {
        goto L_ca07;
    }
    goto L_c9f0;
    L_c9e6: ;
    // x86-64 epilogue: tear down frame
    return local_20;
    L_c9f0: ;
    if ((((long)((((__int128)(long)(((long)(local_30) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(local_30)) % (long)(3))) == 0)) {
        goto L_ca25;
    }
    goto L_ca3f;
    L_ca07: ;
    var17 = _ZN4core9panicking5panic17hf516d800ede7db8cE((const char *)("attempt to calculate the remainder with overflowattempt to divide with overflow/build/rustc-0KzTm9/rustc-1.75.0+dfsg0ubuntu1~bpo0/library/core/src/io/borrowed_buf.rs"), 48, 0x5c648);
    /* asm: ud2 */
    L_ca25: ;
    local_38 = (local_10 + 1);
    if ((local_10 == 0x7fffffffffffffff)) {
        goto L_cac3;
    }
    goto L_cab4;
    L_ca3f: ;
    of_11 = __unknown(0);
    local_40 = (2 * local_10);
    if (((unsigned long)((unsigned char)((of_11 & 1))) == 0)) {
        t172 = (local_40 < 0);
        var28 = (local_40 + local_18);
        local_48 = var28;
        if (((t172 == (local_18 < 0)) && ((var28 < 0) != t172))) {
            goto L_ca96;
        }
        goto L_ca8b;
    }
    var32 = _ZN4core9panicking5panic17hf516d800ede7db8cE((const char *)("attempt to multiply with overflowassertion failed: 0 < pointee_size && pointee_size <= isize::MAX as usize/build/rustc-0KzTm9/rustc-1.75.0+dfsg0ubuntu1~bpo0/library/core/src/ptr/const_ptr.rstests/decompiler_fixtures/src/219_rust_iterator_chains.rs"), 33, 0x5c660);
    /* asm: ud2 */
    L_ca8b: ;
    local_18 = local_48;
    goto L_ca25;
    L_ca96: ;
    var36 = _ZN4core9panicking5panic17hf516d800ede7db8cE((const char *)("attempt to add with overflowcapacity overflow"), 28, 0x5c678);
    /* asm: ud2 */
    L_cab4: ;
    local_10 = local_38;
    goto L_c9a7;
    L_cac3: ;
    var40 = _ZN4core9panicking5panic17hf516d800ede7db8cE((const char *)("attempt to add with overflowcapacity overflow"), 28, 0x5c690);
    /* asm: ud2 */
}
iter_capturing_closure fail 39 lines
// glaurung: iter_capturing_closure @ 0xc860
__attribute__((no_stack_protector)) void * iter_capturing_closure(int arg0, int arg1) {
    extern long * _ZN4core4iter6traits8iterator8Iterator3map17hde4dc045362ab810E(long *, long);
    extern long _ZN4core4iter6traits8iterator8Iterator3sum17hb75d6f28197c35f8E(long);
    extern long _ZN4core9panicking5panic17hf516d800ede7db8cE(const char *, int, long);
    void * local_10;
    long local_20;
    unsigned char local_40[32];
    unsigned char local_58[24];
    long * var17;
    long var19;
    long var4;
    long var9;
    if (((long)(arg0) < 0)) {
        *(long *)((&local_58[0] + 16)) = -1;
        // x86-64 epilogue: tear down frame
        return (void *)(*(long *)((&local_58[0] + 16)));
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 64) | ((long)(arg0) < 64)) == 0)) {
        *(long *)((&local_58[0] + 16)) = -1;
        // x86-64 epilogue: tear down frame
        return (void *)(*(long *)((&local_58[0] + 16)));
    }
    var4 = (long)((int)(((unsigned long)((unsigned int)(arg1)) & 7)));
    *(long *)(&local_58[0]) = (var4 + 1);
    if ((var4 == 0x7fffffffffffffff)) {
        var9 = _ZN4core9panicking5panic17hf516d800ede7db8cE((const char *)("attempt to add with overflowcapacity overflow"), 28, 0x5c618);
        /* asm: ud2 */
    }
    *(long *)(&local_40[0]) = *(long *)(&local_58[0]);
    local_20 = 0;
    arg0 = (long)(arg0);
    local_10 = &local_40[0];
    var17 = _ZN4core4iter6traits8iterator8Iterator3map17hde4dc045362ab810E((long *)((&local_40[0] + 8)), local_20);
    var19 = _ZN4core4iter6traits8iterator8Iterator3sum17hb75d6f28197c35f8E((long)((&local_40[0] + 8)));
    *(long *)((&local_58[0] + 16)) = var19;
    // x86-64 epilogue: tear down frame
    return (void *)(*(long *)((&local_58[0] + 16)));
}
iter_enumerate_fold fail 23 lines
// glaurung: iter_enumerate_fold @ 0xc320
__attribute__((no_stack_protector)) long iter_enumerate_fold(int arg0) {
    extern long _ZN110__LT_core__iter__adapters__enumerate__Enumerate_LT_I_GT__u20_as_u20_core__iter__traits__iterator__Iterator_GT_4fold17h4114548f52c4f889E(long *, long, long);
    extern long * _ZN4core4iter6traits8iterator8Iterator9enumerate17h3095843608fa7d86E(long *);
    long local_18;
    unsigned char local_30[24];
    long local_38;
    long * var5;
    long var9;
    if (((long)(arg0) < 0)) {
        local_38 = -1;
        return local_38;
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 64) | ((long)(arg0) < 64)) == 0)) {
        local_38 = -1;
        return local_38;
    }
    local_18 = 0;
    var5 = _ZN4core4iter6traits8iterator8Iterator9enumerate17h3095843608fa7d86E((long *)(&local_30[0]));
    var9 = ((long (*)(long *, long))_ZN110__LT_core__iter__adapters__enumerate__Enumerate_LT_I_GT__u20_as_u20_core__iter__traits__iterator__Iterator_GT_4fold17h4114548f52c4f889E)((long *)(&local_30[0]), 0);
    local_38 = var9;
    return local_38;
}
iter_filter_map_sum fail 63 lines
// glaurung: iter_filter_map_sum @ 0xc130
__attribute__((no_stack_protector)) long iter_filter_map_sum(int arg0) {
    extern __attribute__((noreturn)) long _Unwind_Resume(long);
    extern void _ZN4core3ptr47drop_in_place_LT_alloc__vec__Vec_LT_i64_GT__GT_17h81e75c93a94a142fE(char *);
    extern long _ZN4core4iter6traits8iterator8Iterator3map17h56fd618795889620E(long, long);
    extern long _ZN4core4iter6traits8iterator8Iterator3sum17h7bd50d744520d893E(long);
    extern long _ZN4core4iter6traits8iterator8Iterator6filter17h151b964cb9555a16E(long, long);
    extern long _ZN4core4iter6traits8iterator8Iterator7collect17h4f16a4b15cfb43a0E(long);
    extern long _ZN4core5slice29__LT_impl_u20__u5b_T_u5d__GT_4iter17h2485b0a6b67547bdE(long);
    extern long _ZN72__LT_alloc__vec__Vec_LT_T_C_A_GT__u20_as_u20_core__ops__deref__Deref_GT_5deref17he1a73aa67b1bd198E(char *);
    long local_28;
    unsigned char local_40[24];
    long local_48;
    long local_58;
    long local_60;
    char * local_68;
    long local_70;
    long local_78;
    long local_80;
    long local_88;
    long local_90;
    long local_98;
    long local_a0;
    long stack_1;
    long var11;
    long var13;
    long var15;
    long var18;
    long var26;
    long var4;
    long var6;
    long var8;
    if (((long)(arg0) < 0)) {
        local_48 = -1;
        return local_48;
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 64) | ((long)(arg0) < 64)) == 0)) {
        local_48 = -1;
        return local_48;
    }
    local_28 = 0;
    var4 = arg0;
    local_68 = (char *)&local_40[0];
    var6 = ((long (*)(void))_ZN4core4iter6traits8iterator8Iterator7collect17h4f16a4b15cfb43a0E)();
    var8 = _ZN72__LT_alloc__vec__Vec_LT_T_C_A_GT__u20_as_u20_core__ops__deref__Deref_GT_5deref17he1a73aa67b1bd198E(local_68);
    local_60 = var4;
    local_58 = var8;
    var11 = _ZN4core5slice29__LT_impl_u20__u5b_T_u5d__GT_4iter17h2485b0a6b67547bdE(local_58);
    local_78 = var4;
    local_70 = var11;
    var13 = _ZN4core4iter6traits8iterator8Iterator6filter17h151b964cb9555a16E(local_70, local_78);
    local_88 = var4;
    local_80 = var13;
    var15 = _ZN4core4iter6traits8iterator8Iterator3map17h56fd618795889620E(local_80, local_88);
    local_98 = var4;
    local_90 = var15;
    var18 = _ZN4core4iter6traits8iterator8Iterator3sum17h7bd50d744520d893E(local_90);
    local_a0 = var18;
    local_48 = local_a0;
    _ZN4core3ptr47drop_in_place_LT_alloc__vec__Vec_LT_i64_GT__GT_17h81e75c93a94a142fE((char *)(&local_40[0]));
    return local_48;
    var26 = _Unwind_Resume(stack_1);
}
iter_rev_chain fail 38 lines
// glaurung: iter_rev_chain @ 0xc740
__attribute__((no_stack_protector)) long iter_rev_chain(int arg0) {
    extern long _ZN4core4iter6traits8iterator8Iterator3map17h6cea881a55727224E(void *, void *);
    extern long _ZN4core4iter6traits8iterator8Iterator3rev17hfee0d77d03730ed0E(long);
    extern long _ZN4core4iter6traits8iterator8Iterator3sum17h05637f725b64149bE(long);
    extern long _ZN4core4iter6traits8iterator8Iterator5chain17h4d2fc625a131d47bE(long, long);
    long local_18;
    long local_20;
    long local_30;
    unsigned char local_60[48];
    long local_8;
    unsigned char local_90[48];
    long local_98;
    long local_a8;
    long var11;
    long var13;
    long var4;
    long var9;
    if (((long)(arg0) < 0)) {
        local_98 = -1;
        return local_98;
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 32) | ((long)(arg0) < 32)) == 0)) {
        local_98 = -1;
        return local_98;
    }
    local_a8 = arg0;
    local_8 = arg0;
    local_30 = 0;
    var4 = _ZN4core4iter6traits8iterator8Iterator3rev17hfee0d77d03730ed0E(local_30);
    local_20 = 0;
    local_18 = local_a8;
    var9 = _ZN4core4iter6traits8iterator8Iterator5chain17h4d2fc625a131d47bE((long)(&local_60[0]), var4);
    var11 = _ZN4core4iter6traits8iterator8Iterator3map17h6cea881a55727224E(&local_90[0], &local_60[0]);
    var13 = _ZN4core4iter6traits8iterator8Iterator3sum17h05637f725b64149bE((long)(&local_90[0]));
    local_98 = var13;
    return local_98;
}
iter_take_skip fail 39 lines
// glaurung: iter_take_skip @ 0xc430
__attribute__((no_stack_protector)) long iter_take_skip(int arg0, int arg1) {
    extern void * _ZN4core4iter6traits8iterator8Iterator10skip_while17h10b4ba602941cb8cE(void *, long);
    extern void * _ZN4core4iter6traits8iterator8Iterator10take_while17h20cca70e7d95fe5bE(void *, long *);
    extern long _ZN4core4iter6traits8iterator8Iterator3sum17h6fa8a4be83dc39ffE(long);
    void * local_10;
    void * local_18;
    long local_28;
    unsigned char local_80[88];
    long local_88;
    void * var10;
    void * var14;
    long var16;
    if (((long)(arg0) < 0)) {
        local_88 = -1;
        return local_88;
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 64) | ((long)(arg0) < 64)) == 0)) {
        local_88 = -1;
        return local_88;
    }
    if (((long)(arg1) < 0)) {
        local_88 = -1;
        return local_88;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 64) | ((long)(arg1) < 64)) == 0)) {
        local_88 = -1;
        return local_88;
    }
    *(long *)(&local_80[0]) = arg1;
    local_28 = 0;
    local_18 = &local_80[0];
    var10 = _ZN4core4iter6traits8iterator8Iterator10skip_while17h10b4ba602941cb8cE((void *)((&local_80[0] + 56)), local_28);
    local_10 = &local_80[0];
    var14 = _ZN4core4iter6traits8iterator8Iterator10take_while17h20cca70e7d95fe5bE((void *)((&local_80[0] + 8)), (long *)((&local_80[0] + 56)));
    var16 = _ZN4core4iter6traits8iterator8Iterator3sum17h6fa8a4be83dc39ffE((long)((&local_80[0] + 8)));
    local_88 = var16;
    return local_88;
}
iter_zip_dot fail 42 lines
// glaurung: iter_zip_dot @ 0xc5b0
__attribute__((no_stack_protector)) unsigned long iter_zip_dot(int arg0, int arg1) {
    extern long _ZN4core4iter6traits8iterator8Iterator3map17h3aa73b453481c54dE(void *, void *);
    extern long _ZN4core4iter6traits8iterator8Iterator3map17h7891a5c3358937fdE(long, long);
    extern long _ZN4core4iter6traits8iterator8Iterator3sum17h4bc48659a7086dd9E(long);
    extern long _ZN4core4iter6traits8iterator8Iterator3zip17he32a5393bf22341aE(long, long);
    long local_18;
    long local_28;
    unsigned char local_60[56];
    unsigned char local_98[56];
    unsigned char local_a8[16];
    long var13;
    long var15;
    long var17;
    long var7;
    if (((long)(arg0) < 0)) {
        *(long *)((&local_a8[0] + 8)) = -1;
        return *(long *)((&local_a8[0] + 8));
    }
    if (((((unsigned long)((unsigned int)(arg0)) == 32) | ((long)(arg0) < 32)) == 0)) {
        *(long *)((&local_a8[0] + 8)) = -1;
        return *(long *)((&local_a8[0] + 8));
    }
    if (((long)(arg1) < 0)) {
        *(long *)((&local_a8[0] + 8)) = -1;
        return *(long *)((&local_a8[0] + 8));
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 32) | ((long)(arg1) < 32)) == 0)) {
        *(long *)((&local_a8[0] + 8)) = -1;
        return *(long *)((&local_a8[0] + 8));
    }
    local_28 = 0;
    arg0 = (long)(arg0);
    local_18 = 0;
    arg1 = (long)(arg1);
    var7 = _ZN4core4iter6traits8iterator8Iterator3map17h7891a5c3358937fdE(local_18, (long)(arg1));
    var13 = _ZN4core4iter6traits8iterator8Iterator3zip17he32a5393bf22341aE((long)(&local_60[0]), local_28);
    var15 = _ZN4core4iter6traits8iterator8Iterator3map17h3aa73b453481c54dE(&local_98[0], &local_60[0]);
    var17 = _ZN4core4iter6traits8iterator8Iterator3sum17h4bc48659a7086dd9E((long)(&local_98[0]));
    *(long *)((&local_a8[0] + 8)) = var17;
    return *(long *)((&local_a8[0] + 8));
}

rustc -O2

6/7
explicit_loop_control pass 91 lines
// glaurung: explicit_loop_control @ 0x7310
unsigned int explicit_loop_control(int arg0) {
    long local_10;
    long local_8;
    long ret;
    long var1;
    long var10;
    long var11;
    long var12;
    long var13;
    long var18;
    long var19;
    long var23;
    long var27;
    long var29;
    long var30;
    long var32;
    long var35;
    long var38;
    long var39;
    long var4;
    long var40;
    long var44;
    long var45;
    long var47;
    long var5;
    long var6;
    long var7;
    var1 = -1;
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg0))))) {
        return var1;
    }
    if (((unsigned long)((unsigned int)(arg0)) == 0)) {
        return 0;
    }
    var4 = (unsigned long)((unsigned int)(arg0));
    var5 = -0x5555555555555555LL;
    if (((unsigned long)((unsigned int)(arg0)) != 1)) {
        local_8 = var6;
        local_10 = var7;
        var10 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var4)) & -2)));
        var11 = -1;
        var12 = 1;
        var13 = 2;
        var18 = 0;
        var19 = 0;
        do {
            var23 = ((unsigned long)(((unsigned __int128)(unsigned long)(var12) * (unsigned __int128)(unsigned long)(var5)) >> 64));
            var27 = ((unsigned long)(((unsigned long)(((unsigned __int128)(unsigned long)(var19) * (unsigned __int128)(unsigned long)(var5)) >> 64))) >> 1);
            var29 = 0;
            if (((var27 + (var27 * 2)) != var19)) {
                var29 = (var13 - 2);
            }
            var30 = ((unsigned long)(var23) >> 1);
            var32 = 0;
            if ((((var30 + (var30 * 2)) + var11) != 0)) {
                var32 = var13;
            }
            var35 = ((var18 + var29) + var32);
            var19 = (var19 + 2);
            var11 = (var11 - 2);
            var12 = (var12 + 2);
            var13 = (var13 + 4);
            var18 = var35;
        } while ((var10 != var19));
        var38 = var35;
        var1 = var35;
        if (((unsigned long)((unsigned char)((var4 & 1))) == 0)) {
            return var1;
        }
        var39 = (var5 * var19);
        var40 = (var19 + var19);
        var44 = (((unsigned long)(0x5555555555555556) <= (unsigned long)(var39)) ? var40 : 0);
        var45 = (var35 + var44);
        return var45;
    } else {
        var47 = 0;
        var29 = ret;
        var38 = 0;
        var19 = 0;
        if (((unsigned long)((unsigned char)((var4 & 1))) != 0)) {
            var39 = (var5 * var19);
            var40 = (var19 + var19);
            var44 = (((unsigned long)(0x5555555555555556) <= (unsigned long)(var39)) ? var40 : 0);
            var45 = (var38 + var44);
            var1 = var45;
            return var45;
        }
        return var47;
    }
}
iter_capturing_closure pass 16 lines
// glaurung: iter_capturing_closure @ 0x72d0
unsigned long iter_capturing_closure(int arg0, unsigned int arg1) {
    long ret;
    long t60;
    long t61;
    ret = -1;
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg0))))) {
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg0)) == 0)) {
        return 0;
    }
    t60 = ((unsigned long)((unsigned int)(arg0)) - 1);
    t61 = ((unsigned long)((unsigned int)(arg0)) - 2);
    return ((((unsigned long)((unsigned int)(arg0)) + (((unsigned long)(((unsigned long)(((unsigned __int128)(unsigned long)(t60) * (unsigned __int128)(unsigned long)(t61)) >> 64))) << 63) | ((unsigned long)((t60 * t61)) >> 1))) - 1) * ((unsigned long)((unsigned int)((arg1 & 7))) + 1));
}
iter_enumerate_fold pass 24 lines
// glaurung: iter_enumerate_fold @ 0x71a0
unsigned long iter_enumerate_fold(unsigned long arg0) {
    long ret;
    long t60;
    long t61;
    long var13;
    long var4;
    long var7;
    long var8;
    ret = -1;
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg0))))) {
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg0)) == 0)) {
        return 0;
    }
    t60 = ((unsigned long)((unsigned int)(arg0)) - 1);
    t61 = ((unsigned long)((unsigned int)(arg0)) - 2);
    var4 = (t60 * t61);
    var7 = ((unsigned long)(((unsigned __int128)(unsigned long)(t60) * (unsigned __int128)(unsigned long)(t61)) >> 64));
    var8 = ((unsigned long)((unsigned int)(arg0)) - 3);
    var13 = (((unsigned long)(var7) << 63) | ((unsigned long)(var4) >> 1));
    return ((((unsigned long)((unsigned int)(arg0)) + (var13 + (var13 * 2))) - 1) + (0x5555555555555556 * (((unsigned long)((unsigned int)((((unsigned long)(((unsigned __int128)(unsigned long)(var4) * (unsigned __int128)(unsigned long)(var8)) >> 64)) + (unsigned long)((unsigned int)((var8 * var7)))))) << 63) | ((unsigned long)((var4 * var8)) >> 1))));
}
iter_filter_map_sum fail 148 lines
// glaurung: iter_filter_map_sum @ 0x6ff0
static unsigned char glaurung_global_57c40[16] __attribute__((aligned(16)));
static unsigned char glaurung_global_57c70[16] __attribute__((aligned(16)));
static unsigned char glaurung_global_57e70[16] __attribute__((aligned(16)));
unsigned int iter_filter_map_sum(int arg0) {
    extern unsigned char glaurung_global_57c40[16];
    extern unsigned char glaurung_global_57c70[16];
    extern unsigned char glaurung_global_57e70[16];
    long t110;
    long t113;
    long var0;
    long var1;
    long var17;
    int var18;
    int var19;
    long var2;
    int var20;
    int var21;
    long var23;
    int var24;
    int var25;
    int var26;
    int var27;
    long var3;
    long var34;
    long var39;
    long var41;
    long var51;
    long var55;
    long var58;
    long var59;
    long var6;
    long var60;
    long var63;
    long var64;
    long var65;
    long var67;
    long var68;
    long var69;
    long var7;
    long var74;
    long var79;
    long var9;
    var0 = -1;
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg0))))) {
        goto L_70f5;
    }
    var1 = (unsigned long)((unsigned int)(arg0));
    if (((unsigned long)((unsigned int)(arg0)) != 0)) {
        var2 = (unsigned long)((unsigned int)(var1));
        var3 = ((unsigned long)((unsigned int)(var1)) * 8);
        var6 = ((long (*)(long, int))(*(long *)(&glaurung_global_57c40[0])))(var3, 8);
        var7 = var6;
        if ((var6 == 0)) {
            goto L_7184;
        }
        if (((unsigned long)(2) <= (unsigned long)((unsigned long)((unsigned int)(var1))))) {
            goto L_704b;
        }
        var9 = 0;
        goto L_7090;
    }
    var0 = 0;
    goto L_70f5;
    L_704b: ;
    var9 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) & -2)));
    var17 = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) >> 1))) << 4);
    var18 = 0;
    var19 = 0;
    var20 = 1;
    var21 = 0;
    var23 = 0;
    var24 = 2;
    var25 = 0;
    var26 = 2;
    var27 = 0;
    do {
        *(int *)((var7 + var23)) = var18;
        *(int *)((var7 + var23 + 0x4)) = var19;
        *(int *)((var7 + var23 + 0x8)) = var20;
        *(int *)((var7 + var23 + 0xc)) = var21;
        t110 = (((unsigned long)((unsigned int)(var19)) | (unsigned long)((unsigned int)(var18))) + ((unsigned long)((unsigned int)(var25)) | (unsigned long)((unsigned int)(var24))));
        var18 = (unsigned int)(t110);
        var19 = (((unsigned long)(t110) >> 32) & 0xffffffff);
        t113 = (((unsigned long)((unsigned int)(var21)) | (unsigned long)((unsigned int)(var20))) + ((unsigned long)((unsigned int)(var27)) | (unsigned long)((unsigned int)(var26))));
        var20 = (unsigned int)(t113);
        var21 = (((unsigned long)(t113) >> 32) & 0xffffffff);
        var23 = (var23 + 16);
    } while ((var17 != var23));
    if ((var9 == var2)) {
        goto L_709c;
    }
    L_7090: ;
    *(long *)((var7 + var9 * 8)) = var9;
    var9 = (var9 + 1);
    if ((var2 != var9)) {
        goto L_7090;
    }
    L_709c: ;
    if (((unsigned long)((unsigned int)(var1)) != 1)) {
        goto L_7101;
    }
    var34 = 0;
    var39 = 0;
    L_70a6: ;
    if (((unsigned long)((unsigned char)((var2 & 1))) != 0)) {
        var41 = *(long *)((var7 + var39 * 8));
        var34 = (var34 + (((unsigned long)(0x5555555555555555) <= (unsigned long)((0x2aaaaaaaaaaaaaaa + (-0x5555555555555555LL * var41)))) ? (var41 + var41) : 0));
    }
    var51 = ((long (*)(long, long, int))(*(long *)(&glaurung_global_57c70[0])))(var7, var3, 8);
    var0 = var34;
    L_70f5: ;
    // x86-64 epilogue: tear down frame
    return var0;
    L_7101: ;
    var55 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) & -2)));
    var58 = -0x5555555555555555LL;
    var59 = 0x2aaaaaaaaaaaaaaa;
    var60 = 0x5555555555555555;
    var63 = 0;
    var64 = 0;
    goto L_7143;
    L_7130: ;
    var68 = ((var63 + var65) + var67);
    var39 = (var64 + 2);
    var34 = var68;
    var63 = var68;
    var64 = var39;
    if ((var55 == var39)) {
        goto L_70a6;
    }
    L_7143: ;
    var69 = *(long *)((var7 + var64 * 8));
    var65 = 0;
    if (((unsigned long)(var60) <= (unsigned long)(((var69 * var58) + var59)))) {
        var65 = (var69 + var69);
    }
    var74 = *(long *)((var7 + var64 * 8 + 0x8));
    var67 = 0;
    if (((unsigned long)(((var74 * var58) + var59)) < (unsigned long)(var60))) {
        goto L_7130;
    }
    var67 = (var74 + var74);
    goto L_7130;
    L_7184: ;
    var79 = ((long (*)(int, long))(*(long *)(&glaurung_global_57e70[0])))(8, var3);
    /* asm: ud2 */
}
iter_rev_chain pass 12 lines
// glaurung: iter_rev_chain @ 0x72b0
unsigned long iter_rev_chain(int arg0) {
    long ret;
    ret = -1;
    if (((unsigned long)(32) < (unsigned long)((unsigned long)((unsigned int)(arg0))))) {
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg0)) == 0)) {
        return 0;
    }
    return (((unsigned long)((unsigned int)(arg0)) + 1) * (unsigned long)((unsigned int)(arg0)));
}
iter_take_skip pass 48 lines
// glaurung: iter_take_skip @ 0x7200
unsigned long iter_take_skip(unsigned int arg0, int arg1) {
    long ret;
    long var1;
    long var10;
    long var11;
    long var12;
    long var5;
    long var8;
    ret = -1;
    if (((unsigned long)(arg0) <= (unsigned long)(64))) {
        ret = -1;
        if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
            return ret;
        }
        var1 = (unsigned long)(arg0);
        var5 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) >> 1)));
        ret = 0;
        if (((unsigned long)(arg0) <= (unsigned long)(var5))) {
            return ret;
        }
        var8 = (unsigned long)((unsigned int)(arg1));
        ret = 0;
        if (((unsigned long)((unsigned long)((unsigned int)(arg1))) <= (unsigned long)(var5))) {
            return ret;
        }
        var11 = (var5 + 1);
        ret = var5;
        if (((unsigned long)(arg0) <= (unsigned long)(var11))) {
            return ret;
        }
        var10 = var5;
        while (1) {
            ret = var10;
            if ((var8 == var11)) {
                break;
            }
            var10 = (var10 + var11);
            var12 = (var11 + 1);
            var11 = var12;
            ret = var10;
            if ((var1 == var12)) {
                break;
            }
        }
    }
    return ret;
}
iter_zip_dot pass 25 lines
// glaurung: iter_zip_dot @ 0x7260
long iter_zip_dot(int arg0, int arg1) {
    long t61;
    long var0;
    int var1;
    long var10;
    long var5;
    long var8;
    var0 = -1;
    if (((unsigned long)((unsigned long)((unsigned int)(arg0))) <= (unsigned long)(32))) {
        if (((unsigned long)(32) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
            return var0;
        }
        var1 = (((unsigned long)((unsigned long)((unsigned int)(arg0))) < (unsigned long)((unsigned long)((unsigned int)(arg1)))) ? arg0 : arg1);
        if (((unsigned long)((unsigned int)(var1)) == 0)) {
            return 0;
        }
        var5 = ((unsigned long)((unsigned int)(var1)) - 1);
        t61 = ((unsigned long)((unsigned int)(var1)) - 2);
        var8 = (var5 * t61);
        var10 = (((unsigned long)(((unsigned long)(((unsigned __int128)(unsigned long)(var5) * (unsigned __int128)(unsigned long)(t61)) >> 64))) << 63) | ((unsigned long)(var8) >> 1));
        var0 = (((((unsigned long)((unsigned int)(var1)) - 3) * var8) & -2) + ((var10 + (var10 * 8)) + (var5 + (var5 * 2))));
    }
    return var0;
}

← 213 fixtures