From: Andi Kleen <a...@gcc.gnu.org> The input machinery to read the source code independent of the lexer has a range of hard coded maximum array sizes that can impact performance. Make them tunable.
input.cc is part of libcommon so it cannot direct access params without a level of indirection. gcc/ChangeLog: PR preprocessor/118168 * input.cc (file_cache::tune): New function. * input.h (class file_cache): Make tunables non const. * params.opt: Add new tunables. * toplev.cc (toplev::main): Initialize input buffer context tunables. --- gcc/input.cc | 18 +++++++++++++++++- gcc/input.h | 4 +++- gcc/params.opt | 8 ++++++++ gcc/toplev.cc | 2 ++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/gcc/input.cc b/gcc/input.cc index cd596d32837..e8a13692418 100644 --- a/gcc/input.cc +++ b/gcc/input.cc @@ -79,6 +79,10 @@ public: void evict (); void set_content (const char *buf, size_t sz); + static void tune(size_t line_record_size_) { + line_record_size = line_record_size_; + } + private: /* These are information used to store a line boundary. */ class line_info @@ -116,7 +120,7 @@ public: bool goto_next_line (); static const size_t buffer_size = 4 * 1024; - static const size_t line_record_size = 100; + static size_t line_record_size; /* The number of time this file has been accessed. This is used to designate which file cache to evict from the cache @@ -189,6 +193,18 @@ public: }; +size_t file_cache_slot::line_record_size = 100; + +/* Tune file_cache. */ +void +file_cache::tune (size_t num_file_slots_, size_t lines) +{ + num_file_slots = num_file_slots_; + file_cache_slot::tune (lines); +} + +size_t file_cache::num_file_slots = 16; + static const char * find_end_of_line (const char *s, size_t len); diff --git a/gcc/input.h b/gcc/input.h index 871cd539d04..9f175985906 100644 --- a/gcc/input.h +++ b/gcc/input.h @@ -161,13 +161,15 @@ class file_cache const char *buffer, size_t sz); + static void tune(size_t num_file_slots_, size_t lines); + private: file_cache_slot *evicted_cache_tab_entry (unsigned *highest_use_count); file_cache_slot *add_file (const char *file_path); file_cache_slot *lookup_file (const char *file_path); private: - static const size_t num_file_slots = 16; + static size_t num_file_slots; file_cache_slot *m_file_slots; input_context m_input_context; }; diff --git a/gcc/params.opt b/gcc/params.opt index 1c88d5212c4..dd8eafb5ea5 100644 --- a/gcc/params.opt +++ b/gcc/params.opt @@ -134,6 +134,14 @@ Maximum size (in bytes) of objects tracked bytewise by dead store elimination. Common Joined UInteger Var(param_early_inlining_insns) Init(6) Optimization Param Maximal estimated growth of function body caused by early inlining of single call. +-param=file-cache-files= +Common Joined UInteger Var(param_file_cache_files) Init(16) Param +Max number of files in the file cache. + +-param=file-cache-lines= +Common Joined UInteger Var(param_file_cache_lines) Init(100) Param +Max number of lines to index into file cache. + -param=fsm-scale-path-stmts= Common Joined UInteger Var(param_fsm_scale_path_stmts) Init(2) IntegerRange(1, 10) Param Optimization Scale factor to apply to the number of statements in a threading path crossing a loop backedge when comparing to max-jump-thread-duplication-stmts. diff --git a/gcc/toplev.cc b/gcc/toplev.cc index 5f19ebb5cf2..639b89ae230 100644 --- a/gcc/toplev.cc +++ b/gcc/toplev.cc @@ -2333,6 +2333,8 @@ toplev::main (int argc, char **argv) UNKNOWN_LOCATION, global_dc, targetm.target_option.override); + file_cache::tune (param_file_cache_files, param_file_cache_lines); + handle_common_deferred_options (); init_local_tick (); -- 2.47.0