From d564e3cb9e17202105471f9f60f84ef2a1638e42 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Thu, 31 Jul 2025 17:55:33 -0300 Subject: [PATCH 01/11] Add types freqs to MetaDataStorage --- src/metadata.rs | 22 ++++++++++++++++++++++ src/types.rs | 1 + 2 files changed, 23 insertions(+) diff --git a/src/metadata.rs b/src/metadata.rs index e33656b0cf..f740277a8d 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -14,6 +14,14 @@ use std::{ collections::{hash_map::Entry, HashMap}, }; +use cairo_lang_sierra::{ + extensions::core::{CoreLibfunc, CoreType, CoreTypeConcrete}, + ids::ConcreteTypeId, + program_registry::ProgramRegistry, +}; + +use crate::debug::type_to_name; + pub mod auto_breakpoint; pub mod debug_utils; pub mod drop_overrides; @@ -32,6 +40,7 @@ pub mod trace_dump; #[derive(Debug)] pub struct MetadataStorage { entries: HashMap>, + types_freqs: HashMap<(String, String), usize>, // KEY = (declared_id, concrete_type) } impl MetadataStorage { @@ -110,6 +119,19 @@ impl MetadataStorage { .downcast_mut::() .expect("the given type does not match the actual") } + + pub fn increment_frequency( + &mut self, + type_id: &ConcreteTypeId, + concrete_type: &CoreTypeConcrete, + registry: &ProgramRegistry, + ) { + let type_id_str = format!("{}", type_id); + let type_name = type_to_name(registry, concrete_type); + let tuple_key = (type_id_str, type_name); + + *self.types_freqs.entry(tuple_key).or_insert(0) += 1; + } } #[cfg(feature = "with-debug-utils")] diff --git a/src/types.rs b/src/types.rs index 0cdd6c840c..e103aa1f35 100644 --- a/src/types.rs +++ b/src/types.rs @@ -159,6 +159,7 @@ impl TypeBuilder for CoreTypeConcrete { metadata: &mut MetadataStorage, self_ty: &ConcreteTypeId, ) -> Result, Self::Error> { + metadata.increment_frequency(self_ty, &self, registry); match self { Self::Array(info) => self::array::build( context, From 1965b9ed8fc2ac220db03247cd9a5b4700c73586 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Fri, 1 Aug 2025 11:17:21 -0300 Subject: [PATCH 02/11] Refactor of stat and add it to Statistics --- src/executor/contract.rs | 6 +++++- src/metadata.rs | 26 ++++++++------------------ src/statistics.rs | 2 ++ src/types.rs | 2 +- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/executor/contract.rs b/src/executor/contract.rs index cebb976115..ec7a15a48b 100644 --- a/src/executor/contract.rs +++ b/src/executor/contract.rs @@ -214,7 +214,9 @@ impl AotContractExecutor { // Compile the Sierra program. let NativeModule { - module, registry, .. + module, + registry, + metadata, } = context.compile( program, true, @@ -247,6 +249,8 @@ impl AotContractExecutor { *stats.sierra_libfunc_frequency.entry(name).or_insert(0) += 1; } } + + stats.sierra_declared_types_freq = metadata.types_frequencies(); } // Generate mappings between the entry point's selectors and their function indexes. diff --git a/src/metadata.rs b/src/metadata.rs index f740277a8d..e7ad95bbae 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -11,16 +11,10 @@ use std::{ any::{Any, TypeId}, - collections::{hash_map::Entry, HashMap}, + collections::{hash_map::Entry, BTreeMap, HashMap}, }; -use cairo_lang_sierra::{ - extensions::core::{CoreLibfunc, CoreType, CoreTypeConcrete}, - ids::ConcreteTypeId, - program_registry::ProgramRegistry, -}; - -use crate::debug::type_to_name; +use cairo_lang_sierra::ids::ConcreteTypeId; pub mod auto_breakpoint; pub mod debug_utils; @@ -40,7 +34,7 @@ pub mod trace_dump; #[derive(Debug)] pub struct MetadataStorage { entries: HashMap>, - types_freqs: HashMap<(String, String), usize>, // KEY = (declared_id, concrete_type) + types_freqs: BTreeMap, // KEY = (declared_id, concrete_type) } impl MetadataStorage { @@ -120,17 +114,13 @@ impl MetadataStorage { .expect("the given type does not match the actual") } - pub fn increment_frequency( - &mut self, - type_id: &ConcreteTypeId, - concrete_type: &CoreTypeConcrete, - registry: &ProgramRegistry, - ) { + pub fn increment_frequency(&mut self, type_id: &ConcreteTypeId) { let type_id_str = format!("{}", type_id); - let type_name = type_to_name(registry, concrete_type); - let tuple_key = (type_id_str, type_name); + *self.types_freqs.entry(type_id_str).or_insert(0) += 1; + } - *self.types_freqs.entry(tuple_key).or_insert(0) += 1; + pub fn types_frequencies(&self) -> BTreeMap { + self.types_freqs.clone() } } diff --git a/src/statistics.rs b/src/statistics.rs index 18dadb910c..8a69bfb6b8 100644 --- a/src/statistics.rs +++ b/src/statistics.rs @@ -16,6 +16,8 @@ pub struct Statistics { pub sierra_func_count: Option, /// Number of statements for each distinct libfunc. pub sierra_libfunc_frequency: BTreeMap, + /// Number of times a Sierra declared type was built + pub sierra_declared_types_freq: BTreeMap, /// Number of MLIR operations generated. pub mlir_operation_count: Option, /// Number of MLIR operations generated for each distinct libfunc. diff --git a/src/types.rs b/src/types.rs index e103aa1f35..4a145c7b21 100644 --- a/src/types.rs +++ b/src/types.rs @@ -159,7 +159,7 @@ impl TypeBuilder for CoreTypeConcrete { metadata: &mut MetadataStorage, self_ty: &ConcreteTypeId, ) -> Result, Self::Error> { - metadata.increment_frequency(self_ty, &self, registry); + metadata.increment_frequency(self_ty); match self { Self::Array(info) => self::array::build( context, From 0afa007324c16863254e5de768182d99affe8cb5 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Tue, 5 Aug 2025 10:43:08 -0300 Subject: [PATCH 03/11] Improve key format --- src/metadata.rs | 4 ++-- src/types.rs | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/metadata.rs b/src/metadata.rs index e7ad95bbae..779e7d3733 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -114,8 +114,8 @@ impl MetadataStorage { .expect("the given type does not match the actual") } - pub fn increment_frequency(&mut self, type_id: &ConcreteTypeId) { - let type_id_str = format!("{}", type_id); + pub fn increment_frequency(&mut self, type_id: &ConcreteTypeId, type_name: String) { + let type_id_str = format!("{},{}", type_id, type_name); *self.types_freqs.entry(type_id_str).or_insert(0) += 1; } diff --git a/src/types.rs b/src/types.rs index 4a145c7b21..5df47b2ee4 100644 --- a/src/types.rs +++ b/src/types.rs @@ -3,6 +3,7 @@ //! Contains type generation stuff (aka. conversion from Sierra to MLIR types). use crate::{ + debug::type_to_name, error::Error as CoreTypeBuilderError, libfuncs::LibfuncHelper, metadata::MetadataStorage, @@ -159,7 +160,7 @@ impl TypeBuilder for CoreTypeConcrete { metadata: &mut MetadataStorage, self_ty: &ConcreteTypeId, ) -> Result, Self::Error> { - metadata.increment_frequency(self_ty); + metadata.increment_frequency(self_ty, type_to_name(registry, self)); match self { Self::Array(info) => self::array::build( context, From 3ad35476a7b66718efe6f547d84e05a52f8fc1c7 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Tue, 5 Aug 2025 10:48:39 -0300 Subject: [PATCH 04/11] Minor changes --- src/executor/contract.rs | 1 - src/metadata.rs | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/executor/contract.rs b/src/executor/contract.rs index ec7a15a48b..43aa91687d 100644 --- a/src/executor/contract.rs +++ b/src/executor/contract.rs @@ -249,7 +249,6 @@ impl AotContractExecutor { *stats.sierra_libfunc_frequency.entry(name).or_insert(0) += 1; } } - stats.sierra_declared_types_freq = metadata.types_frequencies(); } diff --git a/src/metadata.rs b/src/metadata.rs index 779e7d3733..6fa2500297 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -9,13 +9,12 @@ //! - Pass extra compilation info to the libfunc generators (ex. //! [TailRecursionMeta](self::tail_recursion)). +use cairo_lang_sierra::ids::ConcreteTypeId; use std::{ any::{Any, TypeId}, collections::{hash_map::Entry, BTreeMap, HashMap}, }; -use cairo_lang_sierra::ids::ConcreteTypeId; - pub mod auto_breakpoint; pub mod debug_utils; pub mod drop_overrides; From 1ec120ddbbef558470a2feca777e09dc4119d177 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Tue, 5 Aug 2025 11:25:17 -0300 Subject: [PATCH 05/11] Clippy --- src/metadata.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/metadata.rs b/src/metadata.rs index 6fa2500297..360a8fd086 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -128,6 +128,7 @@ impl Default for MetadataStorage { fn default() -> Self { let mut metadata = Self { entries: Default::default(), + types_freqs: Default::default(), }; metadata.insert(debug_utils::DebugUtils::default()); From 83db8a4b7f800fd2e62c4edf5e5a62cf14385146 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Tue, 5 Aug 2025 12:55:41 -0300 Subject: [PATCH 06/11] Refactor of types_freqs We need to use an option so we dont count the frequencies of the types everytime and only when we want to keep stats. This is needed so we dont have a stack overflow. --- src/executor/contract.rs | 6 +++++- src/metadata.rs | 20 ++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/executor/contract.rs b/src/executor/contract.rs index 43aa91687d..c70d657077 100644 --- a/src/executor/contract.rs +++ b/src/executor/contract.rs @@ -249,7 +249,11 @@ impl AotContractExecutor { *stats.sierra_libfunc_frequency.entry(name).or_insert(0) += 1; } } - stats.sierra_declared_types_freq = metadata.types_frequencies(); + + match metadata.types_freqs { + Some(freqs_map) => stats.sierra_declared_types_freq = freqs_map.clone(), + None => todo!(), + } } // Generate mappings between the entry point's selectors and their function indexes. diff --git a/src/metadata.rs b/src/metadata.rs index 360a8fd086..69d77ebe96 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -33,12 +33,19 @@ pub mod trace_dump; #[derive(Debug)] pub struct MetadataStorage { entries: HashMap>, - types_freqs: BTreeMap, // KEY = (declared_id, concrete_type) + pub types_freqs: Option>, // We need an option so we do not use this big map every time, only when needed } impl MetadataStorage { /// Create an empty metadata container. pub fn new() -> Self { + Self { + entries: Default::default(), + types_freqs: None, + } + } + + pub fn new_with_types_freqs() -> Self { Self::default() } @@ -113,13 +120,14 @@ impl MetadataStorage { .expect("the given type does not match the actual") } + /// If the metadata contains the hashmap used to store the frequencies of the types, + /// then we update the entry. If its not present, we don't do anything. pub fn increment_frequency(&mut self, type_id: &ConcreteTypeId, type_name: String) { let type_id_str = format!("{},{}", type_id, type_name); - *self.types_freqs.entry(type_id_str).or_insert(0) += 1; - } - pub fn types_frequencies(&self) -> BTreeMap { - self.types_freqs.clone() + if let Some(freqs) = self.types_freqs.as_mut() { + *freqs.entry(type_id_str).or_insert(0) += 1; + } } } @@ -128,7 +136,7 @@ impl Default for MetadataStorage { fn default() -> Self { let mut metadata = Self { entries: Default::default(), - types_freqs: Default::default(), + types_freqs: None, }; metadata.insert(debug_utils::DebugUtils::default()); From 04d81ec0c7a1cf39bfb9eff663233c2152891520 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Thu, 7 Aug 2025 09:12:42 -0300 Subject: [PATCH 07/11] Revert "Refactor of types_freqs" This reverts commit 83db8a4b7f800fd2e62c4edf5e5a62cf14385146. --- src/executor/contract.rs | 6 +----- src/metadata.rs | 20 ++++++-------------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/executor/contract.rs b/src/executor/contract.rs index c70d657077..43aa91687d 100644 --- a/src/executor/contract.rs +++ b/src/executor/contract.rs @@ -249,11 +249,7 @@ impl AotContractExecutor { *stats.sierra_libfunc_frequency.entry(name).or_insert(0) += 1; } } - - match metadata.types_freqs { - Some(freqs_map) => stats.sierra_declared_types_freq = freqs_map.clone(), - None => todo!(), - } + stats.sierra_declared_types_freq = metadata.types_frequencies(); } // Generate mappings between the entry point's selectors and their function indexes. diff --git a/src/metadata.rs b/src/metadata.rs index 69d77ebe96..360a8fd086 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -33,19 +33,12 @@ pub mod trace_dump; #[derive(Debug)] pub struct MetadataStorage { entries: HashMap>, - pub types_freqs: Option>, // We need an option so we do not use this big map every time, only when needed + types_freqs: BTreeMap, // KEY = (declared_id, concrete_type) } impl MetadataStorage { /// Create an empty metadata container. pub fn new() -> Self { - Self { - entries: Default::default(), - types_freqs: None, - } - } - - pub fn new_with_types_freqs() -> Self { Self::default() } @@ -120,14 +113,13 @@ impl MetadataStorage { .expect("the given type does not match the actual") } - /// If the metadata contains the hashmap used to store the frequencies of the types, - /// then we update the entry. If its not present, we don't do anything. pub fn increment_frequency(&mut self, type_id: &ConcreteTypeId, type_name: String) { let type_id_str = format!("{},{}", type_id, type_name); + *self.types_freqs.entry(type_id_str).or_insert(0) += 1; + } - if let Some(freqs) = self.types_freqs.as_mut() { - *freqs.entry(type_id_str).or_insert(0) += 1; - } + pub fn types_frequencies(&self) -> BTreeMap { + self.types_freqs.clone() } } @@ -136,7 +128,7 @@ impl Default for MetadataStorage { fn default() -> Self { let mut metadata = Self { entries: Default::default(), - types_freqs: None, + types_freqs: Default::default(), }; metadata.insert(debug_utils::DebugUtils::default()); From cc4b9435035cd7bc5930941f3ceb85c5ce9d6e60 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Thu, 7 Aug 2025 09:14:33 -0300 Subject: [PATCH 08/11] Use u64 instead of usize --- src/metadata.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/metadata.rs b/src/metadata.rs index 360a8fd086..b2479c4477 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -33,7 +33,7 @@ pub mod trace_dump; #[derive(Debug)] pub struct MetadataStorage { entries: HashMap>, - types_freqs: BTreeMap, // KEY = (declared_id, concrete_type) + types_freqs: BTreeMap, // KEY = (declared_id, concrete_type) } impl MetadataStorage { @@ -118,7 +118,7 @@ impl MetadataStorage { *self.types_freqs.entry(type_id_str).or_insert(0) += 1; } - pub fn types_frequencies(&self) -> BTreeMap { + pub fn types_frequencies(&self) -> BTreeMap { self.types_freqs.clone() } } From 01a5239522a0bfd1ae36bd60005854965eac07af Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Thu, 7 Aug 2025 09:24:36 -0300 Subject: [PATCH 09/11] Change forgotten usize --- src/statistics.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/statistics.rs b/src/statistics.rs index 8a69bfb6b8..74d91a3d72 100644 --- a/src/statistics.rs +++ b/src/statistics.rs @@ -17,7 +17,7 @@ pub struct Statistics { /// Number of statements for each distinct libfunc. pub sierra_libfunc_frequency: BTreeMap, /// Number of times a Sierra declared type was built - pub sierra_declared_types_freq: BTreeMap, + pub sierra_declared_types_freq: BTreeMap, /// Number of MLIR operations generated. pub mlir_operation_count: Option, /// Number of MLIR operations generated for each distinct libfunc. From b8284bd31c5b312939447eb30e44f402da359cc7 Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Tue, 26 Aug 2025 09:15:56 -0300 Subject: [PATCH 10/11] Use u64 as key instead of using a String --- src/metadata.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/metadata.rs b/src/metadata.rs index b2479c4477..76a477b569 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -33,7 +33,8 @@ pub mod trace_dump; #[derive(Debug)] pub struct MetadataStorage { entries: HashMap>, - types_freqs: BTreeMap, // KEY = (declared_id, concrete_type) + /// Number of times each declared type is built + types_freqs: BTreeMap, } impl MetadataStorage { @@ -114,8 +115,7 @@ impl MetadataStorage { } pub fn increment_frequency(&mut self, type_id: &ConcreteTypeId, type_name: String) { - let type_id_str = format!("{},{}", type_id, type_name); - *self.types_freqs.entry(type_id_str).or_insert(0) += 1; + *self.types_freqs.entry(type_id.id).or_insert(0) += 1; } pub fn types_frequencies(&self) -> BTreeMap { From f46c0daabab71012dae5e464eb0901209b0dd12d Mon Sep 17 00:00:00 2001 From: Diego Civini Date: Tue, 26 Aug 2025 09:29:29 -0300 Subject: [PATCH 11/11] Fix errors --- src/metadata.rs | 4 ++-- src/statistics.rs | 2 +- src/types.rs | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/metadata.rs b/src/metadata.rs index 76a477b569..b57ed2a61f 100644 --- a/src/metadata.rs +++ b/src/metadata.rs @@ -114,11 +114,11 @@ impl MetadataStorage { .expect("the given type does not match the actual") } - pub fn increment_frequency(&mut self, type_id: &ConcreteTypeId, type_name: String) { + pub fn increment_frequency(&mut self, type_id: &ConcreteTypeId) { *self.types_freqs.entry(type_id.id).or_insert(0) += 1; } - pub fn types_frequencies(&self) -> BTreeMap { + pub fn types_frequencies(&self) -> BTreeMap { self.types_freqs.clone() } } diff --git a/src/statistics.rs b/src/statistics.rs index 74d91a3d72..7d91d8142f 100644 --- a/src/statistics.rs +++ b/src/statistics.rs @@ -17,7 +17,7 @@ pub struct Statistics { /// Number of statements for each distinct libfunc. pub sierra_libfunc_frequency: BTreeMap, /// Number of times a Sierra declared type was built - pub sierra_declared_types_freq: BTreeMap, + pub sierra_declared_types_freq: BTreeMap, /// Number of MLIR operations generated. pub mlir_operation_count: Option, /// Number of MLIR operations generated for each distinct libfunc. diff --git a/src/types.rs b/src/types.rs index 501e235f44..ed5e2411d6 100644 --- a/src/types.rs +++ b/src/types.rs @@ -3,7 +3,6 @@ //! Contains type generation stuff (aka. conversion from Sierra to MLIR types). use crate::{ - debug::type_to_name, error::Error as CoreTypeBuilderError, libfuncs::LibfuncHelper, metadata::MetadataStorage, @@ -161,7 +160,7 @@ impl TypeBuilder for CoreTypeConcrete { metadata: &mut MetadataStorage, self_ty: &ConcreteTypeId, ) -> Result, Self::Error> { - metadata.increment_frequency(self_ty, type_to_name(registry, self)); + metadata.increment_frequency(self_ty); match self { Self::Array(info) => self::array::build( context,