From 42c61ab91045b0f0941b4c49036026a7c627b5a3 Mon Sep 17 00:00:00 2001 From: Simonas Kazlauskas Date: Thu, 26 Feb 2026 16:02:39 +0200 Subject: [PATCH] use a more optimal loop implementation In platform-tools v1.53 inlining decisions of Iterator::next prevent LLVM from optimizing this loop into an unrolled index-based version of it. So where in 1.51 we'd see ```asm INLINE_MEMMOVE($from, $to, 32 bytes) jeq $length, 1, exit INLINE_MEMMOVE($from, $to, 32 bytes) jeq $length, 2, exit ... ``` In 1.53 we'd instead get a much more CU-heavy pointer-comparison based loop instead. ```asm lsh64 $index, 3 ldxdw r4, [r1 + 0] add64 r1, $index INLINE_MEMMOVE($from, $to, 32) ldxdw r6, [r10 - 48] jeq r1, r2, exit ; ... ``` Since we want an index-based loop here for optimal results, might as well write it that way directly instead of relying on optimizations to trigger. Co-authored-by: Lucas Ste <38472950+LucasSte@users.noreply.github.com> --- .../program/src/processor/shared/initialize_multisig.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pinocchio/program/src/processor/shared/initialize_multisig.rs b/pinocchio/program/src/processor/shared/initialize_multisig.rs index 84d1945c..9e099dd9 100644 --- a/pinocchio/program/src/processor/shared/initialize_multisig.rs +++ b/pinocchio/program/src/processor/shared/initialize_multisig.rs @@ -66,8 +66,9 @@ pub fn process_initialize_multisig( return Err(TokenError::InvalidNumberOfRequiredSigners.into()); } - for (i, signer_info) in remaining.iter().enumerate() { - multisig.signers[i] = *signer_info.key(); + #[expect(clippy::needless_range_loop)] // CU use is better with index-based loop + for i in 0..remaining.len() { + multisig.signers[i] = *remaining[i].key(); } multisig.set_initialized(true);