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).
//! 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/7explicit_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/7explicit_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;
}