Skip to main content

nexus_rt/codegen_audit/
stress.rs

1//! Stress and pathological codegen audit cases.
2//!
3//! Category 25 from the assembly audit plan. These test the limits of
4//! LLVM's inlining and optimization budgets under extreme pipeline/DAG
5//! depth, width, and complexity.
6
7#![allow(clippy::type_complexity)]
8#![allow(unused_variables)]
9// Stress tests intentionally pass large types by value to audit stack codegen.
10#![allow(clippy::large_types_passed_by_value)]
11
12use super::helpers::*;
13use crate::dag::{DagArmSeed, DagBuilder};
14use crate::pipeline::PipelineBuilder;
15use crate::{Handler, IntoHandler, World};
16
17// ═══════════════════════════════════════════════════════════════════
18// 25.1: 30-step linear pipeline
19// ═══════════════════════════════════════════════════════════════════
20
21#[inline(never)]
22pub fn stress_pipe_30_steps(world: &mut World, input: u64) -> u64 {
23    let reg = world.registry();
24    let mut p = PipelineBuilder::<u64>::new()
25        .then(add_one, &reg)
26        .then(double, &reg)
27        .then(add_three, &reg)
28        .then(square, &reg)
29        .then(sub_ten, &reg)
30        .then(shr_one, &reg)
31        .then(xor_mask, &reg)
32        .then(add_seven, &reg)
33        .then(triple, &reg)
34        .then(add_forty_two, &reg)
35        // 11-20
36        .then(add_one, &reg)
37        .then(double, &reg)
38        .then(add_three, &reg)
39        .then(square, &reg)
40        .then(sub_ten, &reg)
41        .then(shr_one, &reg)
42        .then(xor_mask, &reg)
43        .then(add_seven, &reg)
44        .then(triple, &reg)
45        .then(add_forty_two, &reg)
46        // 21-30
47        .then(add_one, &reg)
48        .then(double, &reg)
49        .then(add_three, &reg)
50        .then(square, &reg)
51        .then(sub_ten, &reg)
52        .then(shr_one, &reg)
53        .then(xor_mask, &reg)
54        .then(add_seven, &reg)
55        .then(triple, &reg)
56        .then(add_forty_two, &reg);
57    p.run(world, input)
58}
59
60// ═══════════════════════════════════════════════════════════════════
61// 25.2: 50-step linear pipeline
62// ═══════════════════════════════════════════════════════════════════
63
64#[inline(never)]
65pub fn stress_pipe_50_steps(world: &mut World, input: u64) -> u64 {
66    let reg = world.registry();
67    let mut p = PipelineBuilder::<u64>::new()
68        .then(add_one, &reg)
69        .then(double, &reg)
70        .then(add_three, &reg)
71        .then(square, &reg)
72        .then(sub_ten, &reg)
73        .then(shr_one, &reg)
74        .then(xor_mask, &reg)
75        .then(add_seven, &reg)
76        .then(triple, &reg)
77        .then(add_forty_two, &reg)
78        // 11-20
79        .then(add_one, &reg)
80        .then(double, &reg)
81        .then(add_three, &reg)
82        .then(square, &reg)
83        .then(sub_ten, &reg)
84        .then(shr_one, &reg)
85        .then(xor_mask, &reg)
86        .then(add_seven, &reg)
87        .then(triple, &reg)
88        .then(add_forty_two, &reg)
89        // 21-30
90        .then(add_one, &reg)
91        .then(double, &reg)
92        .then(add_three, &reg)
93        .then(square, &reg)
94        .then(sub_ten, &reg)
95        .then(shr_one, &reg)
96        .then(xor_mask, &reg)
97        .then(add_seven, &reg)
98        .then(triple, &reg)
99        .then(add_forty_two, &reg)
100        // 31-40
101        .then(add_one, &reg)
102        .then(double, &reg)
103        .then(add_three, &reg)
104        .then(square, &reg)
105        .then(sub_ten, &reg)
106        .then(shr_one, &reg)
107        .then(xor_mask, &reg)
108        .then(add_seven, &reg)
109        .then(triple, &reg)
110        .then(add_forty_two, &reg)
111        // 41-50
112        .then(add_one, &reg)
113        .then(double, &reg)
114        .then(add_three, &reg)
115        .then(square, &reg)
116        .then(sub_ten, &reg)
117        .then(shr_one, &reg)
118        .then(xor_mask, &reg)
119        .then(add_seven, &reg)
120        .then(triple, &reg)
121        .then(add_forty_two, &reg);
122    p.run(world, input)
123}
124
125// ═══════════════════════════════════════════════════════════════════
126// 25.3: all combinator types in one chain
127// ═══════════════════════════════════════════════════════════════════
128
129#[inline(never)]
130pub fn stress_pipe_all_combinators(world: &mut World, input: u64) -> u64 {
131    let reg = world.registry();
132
133    fn log_error(_err: u32) {}
134
135    let tee_side = DagArmSeed::<u64>::new().then(ref_consume, &reg);
136
137    let on_true = PipelineBuilder::<u64>::new().then(double, &reg);
138    let on_false = PipelineBuilder::<u64>::new().then(add_one, &reg);
139
140    let mut p = PipelineBuilder::<u64>::new()
141        .then(add_one, &reg) // then
142        .tap(|_x: &u64| {}, &reg) // tap
143        .tee(tee_side) // tee
144        .guard(|x: &u64| *x > 0, &reg) // guard
145        .filter(|x: &u64| *x < 10000, &reg) // filter
146        .inspect(|_x: &u64| {}, &reg) // inspect (Option)
147        .on_none(|| {}, &reg) // on_none
148        .ok_or(0u32) // ok_or
149        .map(double, &reg) // map (Result)
150        .inspect(|_x: &u64| {}, &reg) // inspect (Result)
151        .inspect_err(|_e: &u32| {}, &reg) // inspect_err
152        .map_err(|e: u32| e, &reg) // map_err
153        .catch(log_error, &reg) // catch
154        .unwrap_or(0) // unwrap_or (Option)
155        .then(add_three, &reg) // then again
156        .then(is_even, &reg) // bool
157        .and(|| true, &reg) // and
158        .or(|| false, &reg) // or
159        .not() // not
160        .xor(|| true, &reg) // xor
161        .then(|b: bool| if b { 100u64 } else { 0u64 }, &reg) // then (was switch)
162        .route(|x: &u64| *x > 50, &reg, on_true, on_false); // route
163    p.run(world, input)
164}
165
166// ═══════════════════════════════════════════════════════════════════
167// 25.6: repeated type transitions
168// ═══════════════════════════════════════════════════════════════════
169
170#[inline(never)]
171pub fn stress_pipe_transition_chain(world: &mut World, input: u64) -> u64 {
172    let reg = world.registry();
173
174    fn log_error(_err: u32) {}
175
176    // T → Option → Result → Option → T → Option → Result → Option → T
177    let mut p = PipelineBuilder::<u64>::new()
178        .then(|x: u64| x, &reg)
179        // Cycle 1: T → Option → Result → Option → T
180        .guard(|x: &u64| *x > 0, &reg)
181        .ok_or(0u32)
182        .catch(log_error, &reg)
183        .unwrap_or(0)
184        // Cycle 2: T → Option → Result → Option → T
185        .guard(|x: &u64| *x > 0, &reg)
186        .ok_or(0u32)
187        .catch(log_error, &reg)
188        .unwrap_or(0)
189        .then(add_one, &reg);
190    p.run(world, input)
191}
192
193// ═══════════════════════════════════════════════════════════════════
194// 25.7: 4-deep nested route (16 leaf paths)
195// ═══════════════════════════════════════════════════════════════════
196
197#[inline(never)]
198pub fn stress_pipe_route_4_deep(world: &mut World, input: u64) -> u64 {
199    let reg = world.registry();
200
201    // 16 leaf arms
202    let l1 = PipelineBuilder::<u64>::new().then(add_one, &reg);
203    let l2 = PipelineBuilder::<u64>::new().then(double, &reg);
204    let l3 = PipelineBuilder::<u64>::new().then(add_three, &reg);
205    let l4 = PipelineBuilder::<u64>::new().then(triple, &reg);
206    let l5 = PipelineBuilder::<u64>::new().then(add_seven, &reg);
207    let l6 = PipelineBuilder::<u64>::new().then(square, &reg);
208    let l7 = PipelineBuilder::<u64>::new().then(sub_ten, &reg);
209    let l8 = PipelineBuilder::<u64>::new().then(shr_one, &reg);
210
211    // Level 3 (4 routes)
212    let r3a =
213        PipelineBuilder::<u64>::new()
214            .then(|x: u64| x, &reg)
215            .route(|x: &u64| *x > 10, &reg, l1, l2);
216    let r3b =
217        PipelineBuilder::<u64>::new()
218            .then(|x: u64| x, &reg)
219            .route(|x: &u64| *x > 20, &reg, l3, l4);
220    let r3c =
221        PipelineBuilder::<u64>::new()
222            .then(|x: u64| x, &reg)
223            .route(|x: &u64| *x > 30, &reg, l5, l6);
224    let r3d =
225        PipelineBuilder::<u64>::new()
226            .then(|x: u64| x, &reg)
227            .route(|x: &u64| *x > 40, &reg, l7, l8);
228
229    // Level 2 (2 routes)
230    let r2a = PipelineBuilder::<u64>::new().then(|x: u64| x, &reg).route(
231        |x: &u64| *x > 50,
232        &reg,
233        r3a,
234        r3b,
235    );
236    let r2b = PipelineBuilder::<u64>::new().then(|x: u64| x, &reg).route(
237        |x: &u64| *x > 60,
238        &reg,
239        r3c,
240        r3d,
241    );
242
243    // Level 1 (top)
244    let mut p = PipelineBuilder::<u64>::new().then(|x: u64| x, &reg).route(
245        |x: &u64| *x > 100,
246        &reg,
247        r2a,
248        r2b,
249    );
250    p.run(world, input)
251}
252
253// ═══════════════════════════════════════════════════════════════════
254// 25.9: DAG fork + route mix
255// ═══════════════════════════════════════════════════════════════════
256
257#[inline(never)]
258pub fn stress_dag_fork_route_mix(world: &mut World, input: u64) {
259    let reg = world.registry();
260
261    let on_true = DagArmSeed::<u64>::new().then(ref_double, &reg);
262    let on_false = DagArmSeed::<u64>::new().then(ref_triple, &reg);
263
264    let mut d = DagBuilder::<u64>::new()
265        .root(add_one, &reg)
266        .fork()
267        .arm(|a| {
268            a.then(ref_add_one, &reg)
269                .route(|x: &u64| *x > 50, &reg, on_true, on_false)
270        })
271        .arm(|a| a.then(ref_add_seven, &reg))
272        .arm(|a| a.then(ref_square, &reg))
273        .merge(merge_3, &reg)
274        .then(ref_consume, &reg)
275        .build();
276    d.run(world, input);
277}
278
279// ═══════════════════════════════════════════════════════════════════
280// 25.10: 30-step batch pipeline
281// ═══════════════════════════════════════════════════════════════════
282
283#[inline(never)]
284pub fn stress_batch_pipe_30_steps(world: &mut World) {
285    let reg = world.registry();
286    let mut bp = PipelineBuilder::<u64>::new()
287        .then(add_one, &reg)
288        .then(double, &reg)
289        .then(add_three, &reg)
290        .then(square, &reg)
291        .then(sub_ten, &reg)
292        .then(shr_one, &reg)
293        .then(xor_mask, &reg)
294        .then(add_seven, &reg)
295        .then(triple, &reg)
296        .then(add_forty_two, &reg)
297        .then(add_one, &reg)
298        .then(double, &reg)
299        .then(add_three, &reg)
300        .then(square, &reg)
301        .then(sub_ten, &reg)
302        .then(shr_one, &reg)
303        .then(xor_mask, &reg)
304        .then(add_seven, &reg)
305        .then(triple, &reg)
306        .then(add_forty_two, &reg)
307        .then(add_one, &reg)
308        .then(double, &reg)
309        .then(add_three, &reg)
310        .then(square, &reg)
311        .then(sub_ten, &reg)
312        .then(shr_one, &reg)
313        .then(xor_mask, &reg)
314        .then(add_seven, &reg)
315        .then(triple, &reg)
316        .then(add_forty_two, &reg)
317        .then(consume_val, &reg)
318        .build_batch(64);
319    bp.input_mut().extend(0..64);
320    bp.run(world);
321}
322
323// ═══════════════════════════════════════════════════════════════════
324// 25.11: batch DAG with nested forks
325// ═══════════════════════════════════════════════════════════════════
326
327#[inline(never)]
328pub fn stress_batch_dag_nested(world: &mut World) {
329    let reg = world.registry();
330    let mut bd = DagBuilder::<u64>::new()
331        .root(add_one, &reg)
332        .fork()
333        .arm(|a| {
334            a.then(ref_double, &reg)
335                .fork()
336                .arm(|b| b.then(ref_add_one, &reg))
337                .arm(|b| b.then(ref_triple, &reg))
338                .merge(merge_add, &reg)
339        })
340        .arm(|a| a.then(ref_add_seven, &reg))
341        .merge(merge_add, &reg)
342        .then(ref_consume, &reg)
343        .build_batch(64);
344    bd.input_mut().extend(0..64);
345    bd.run(world);
346}
347
348// ═══════════════════════════════════════════════════════════════════
349// 25.13: large type (4096-byte value)
350// ═══════════════════════════════════════════════════════════════════
351
352#[inline(never)]
353pub fn stress_pipe_large_type(world: &mut World, input: u64) -> [u8; 4096] {
354    fn make_large(x: u64) -> [u8; 4096] {
355        let mut arr = [0u8; 4096];
356        arr[0] = x as u8;
357        arr
358    }
359
360    fn touch_large(x: [u8; 4096]) -> [u8; 4096] {
361        let mut out = x;
362        out[1] = out[0].wrapping_add(1);
363        out
364    }
365
366    let reg = world.registry();
367    let mut p = PipelineBuilder::<u64>::new()
368        .then(make_large, &reg)
369        .then(touch_large, &reg)
370        .then(touch_large, &reg);
371    p.run(world, input)
372}
373
374// ═══════════════════════════════════════════════════════════════════
375// 25.14: many closures (10 closure-based combinators)
376// ═══════════════════════════════════════════════════════════════════
377
378#[inline(never)]
379pub fn stress_pipe_many_closures(world: &mut World, input: u64) -> u64 {
380    let reg = world.registry();
381    let mut p = PipelineBuilder::<u64>::new()
382        .then(|x: u64| x, &reg)
383        .guard(|x: &u64| *x > 0, &reg)
384        .filter(|x: &u64| *x < 10000, &reg)
385        .filter(|x: &u64| *x > 5, &reg)
386        .inspect(|_x: &u64| {}, &reg)
387        .on_none(|| {}, &reg)
388        .map(double, &reg)
389        .filter(|x: &u64| *x < 50000, &reg)
390        .filter(|x: &u64| *x > 1, &reg)
391        .inspect(|_x: &u64| {}, &reg)
392        .unwrap_or_else(|| 0, &reg)
393        .then(add_one, &reg);
394    p.run(world, input)
395}
396
397// ═══════════════════════════════════════════════════════════════════
398// 25.15: DAG wide fork (4x4 = 16 leaves, 2 levels)
399// ═══════════════════════════════════════════════════════════════════
400
401#[inline(never)]
402pub fn stress_dag_wide_fork(world: &mut World, input: u64) {
403    let reg = world.registry();
404    let mut d = DagBuilder::<u64>::new()
405        .root(add_one, &reg)
406        .fork()
407        .arm(|a| {
408            a.then(ref_double, &reg)
409                .fork()
410                .arm(|b| b.then(ref_add_one, &reg))
411                .arm(|b| b.then(ref_triple, &reg))
412                .arm(|b| b.then(ref_add_seven, &reg))
413                .arm(|b| b.then(ref_xor_mask, &reg))
414                .merge(merge_4, &reg)
415        })
416        .arm(|a| {
417            a.then(ref_triple, &reg)
418                .fork()
419                .arm(|b| b.then(ref_square, &reg))
420                .arm(|b| b.then(ref_shr_one, &reg))
421                .arm(|b| b.then(ref_sub_ten, &reg))
422                .arm(|b| b.then(ref_add_forty_two, &reg))
423                .merge(merge_4, &reg)
424        })
425        .arm(|a| {
426            a.then(ref_add_seven, &reg)
427                .fork()
428                .arm(|b| b.then(ref_double, &reg))
429                .arm(|b| b.then(ref_add_three, &reg))
430                .arm(|b| b.then(ref_triple, &reg))
431                .arm(|b| b.then(ref_add_one, &reg))
432                .merge(merge_4, &reg)
433        })
434        .arm(|a| {
435            a.then(ref_xor_mask, &reg)
436                .fork()
437                .arm(|b| b.then(ref_shr_one, &reg))
438                .arm(|b| b.then(ref_sub_ten, &reg))
439                .arm(|b| b.then(ref_square, &reg))
440                .arm(|b| b.then(ref_add_forty_two, &reg))
441                .merge(merge_4, &reg)
442        })
443        .merge(merge_4, &reg)
444        .then(ref_consume, &reg)
445        .build();
446    d.run(world, input);
447}
448
449// ═══════════════════════════════════════════════════════════════════
450// 25.16: sequential splat operations
451// ═══════════════════════════════════════════════════════════════════
452
453#[inline(never)]
454pub fn stress_pipe_splat_chain(world: &mut World, input: u64) -> u64 {
455    let reg = world.registry();
456    // split → splat → add → split → splat → add (two cycles)
457    let mut p = PipelineBuilder::<u64>::new()
458        .then(split_u64, &reg)
459        .splat()
460        .then(splat_add, &reg)
461        .then(split_u64, &reg)
462        .splat()
463        .then(splat_add, &reg);
464    p.run(world, input)
465}
466
467// ═══════════════════════════════════════════════════════════════════
468// 25.17: dedup in batch
469// ═══════════════════════════════════════════════════════════════════
470
471#[inline(never)]
472pub fn stress_pipe_dedup_in_batch(world: &mut World) {
473    let reg = world.registry();
474    let mut bp = PipelineBuilder::<u64>::new()
475        .then(add_one, &reg)
476        .dedup()
477        .map(double, &reg)
478        .unwrap_or(0)
479        .then(consume_val, &reg)
480        .build_batch(64);
481    bp.input_mut().extend(0..64);
482    bp.run(world);
483}
484
485// ═══════════════════════════════════════════════════════════════════
486// 25.18: tee inside a route arm
487// ═══════════════════════════════════════════════════════════════════
488
489#[inline(never)]
490pub fn stress_pipe_tee_in_route(world: &mut World, input: u64) -> u64 {
491    let reg = world.registry();
492
493    let tee_side = DagArmSeed::<u64>::new()
494        .then(ref_add_one, &reg)
495        .then(ref_double, &reg)
496        .then(ref_consume, &reg);
497
498    let arm_t = PipelineBuilder::<u64>::new()
499        .then(double, &reg)
500        .tee(tee_side)
501        .then(add_three, &reg);
502
503    let arm_f = PipelineBuilder::<u64>::new().then(add_one, &reg);
504
505    let mut p = PipelineBuilder::<u64>::new().then(|x: u64| x, &reg).route(
506        |x: &u64| *x > 100,
507        &reg,
508        arm_t,
509        arm_f,
510    );
511    p.run(world, input)
512}
513
514// ═══════════════════════════════════════════════════════════════════
515// 25.19: pipeline kitchen sink
516// ═══════════════════════════════════════════════════════════════════
517
518#[inline(never)]
519pub fn stress_mixed_everything(world: &mut World, input: u64) {
520    let reg = world.registry();
521
522    fn log_error(_err: u32) {}
523
524    let tee_side = DagArmSeed::<u64>::new().then(ref_consume, &reg);
525
526    let on_true = PipelineBuilder::<u64>::new().then(double, &reg);
527    let on_false = PipelineBuilder::<u64>::new().then(add_one, &reg);
528
529    let handler = consume_val.into_handler(&reg);
530
531    let mut p = PipelineBuilder::<u64>::new()
532        .then(add_one, &reg)
533        .tap(|_x: &u64| {}, &reg)
534        .tee(tee_side)
535        .guard(|x: &u64| *x > 0, &reg)
536        .map(double, &reg)
537        .filter(|x: &u64| *x < 100_000, &reg)
538        .ok_or(0u32)
539        .map(add_three, &reg)
540        .catch(log_error, &reg)
541        .unwrap_or(0)
542        .route(|x: &u64| *x > 50, &reg, on_true, on_false)
543        .then(split_u64, &reg)
544        .splat()
545        .then(splat_add, &reg)
546        .dispatch(handler);
547    p.run(world, input);
548}