]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Size input line cache based on file size
authorAndi Kleen <ak@gcc.gnu.org>
Thu, 26 Dec 2024 21:05:57 +0000 (13:05 -0800)
committerAndi Kleen <ak@gcc.gnu.org>
Mon, 3 Feb 2025 05:59:22 +0000 (21:59 -0800)
While the input line cache size now tunable it's better if the compiler
auto tunes it. Otherwise large files needing random file access will
still have to search many lines to find the right lines.

Add support for allocating one line anchor per hundred input lines.
This means an overhead of ~235k per 1M input lines on 64bit, which
seems reasonable.

gcc/ChangeLog:

PR preprocessor/118168
* input.cc (file_cache_slot::get_next_line): Implement
dynamic sizing of m_line_record based on input length.
* params.opt: (param_file_cache_lines): Set to 0 to size
dynamically.

gcc/input.cc
gcc/params.opt

index 64cb85eeed0e2ac84b44ed673a24d8ff8659bc21..3416c7cdd732f612c1a3fd0c4b6a9b0a57dfa8c2 100644 (file)
@@ -189,7 +189,7 @@ public:
 
 };
 
-size_t file_cache_slot::line_record_size = 100;
+size_t file_cache_slot::line_record_size = 0;
 
 /* Tune file_cache.  */
 void
@@ -856,8 +856,13 @@ file_cache_slot::get_next_line (char **line, ssize_t *line_len)
       size_t delta = rlen >= 1 ?
        m_line_num - m_line_record[rlen - 1].line_num : 1;
 
+      size_t max_size = line_record_size;
+      /* One anchor per hundred input lines.  */
+      if (max_size == 0)
+       max_size = m_line_num / 100;
+
       /* If we're too far beyond drop half of the lines to rebalance.  */
-      if (rlen == line_record_size && delta >= spacing*2)
+      if (rlen == max_size && delta >= spacing*2)
        {
          size_t j = 0;
          for (size_t i = 1; i < rlen; i += 2)
@@ -867,7 +872,7 @@ file_cache_slot::get_next_line (char **line, ssize_t *line_len)
          spacing *= 2;
        }
 
-      if (rlen < line_record_size && delta >= spacing)
+      if (rlen < max_size && delta >= spacing)
        m_line_record.safe_push
          (file_cache_slot::line_info (m_line_num,
                                       m_line_start_idx,
index 5d234a607c02a3e27fd916366e529551bd257176..d84e35679e6db1fe36293e9f26cccf4ffd3fc91b 100644 (file)
@@ -136,10 +136,10 @@ Maximal estimated growth of function body caused by early inlining of single cal
 
 -param=file-cache-files=
 Common Joined UInteger Var(param_file_cache_files) Init(16) Param
-Max number of files in the file cache.
+Max number of files in the file cache. When 0 this is automatically sized.
 
 -param=file-cache-lines=
-Common Joined UInteger Var(param_file_cache_lines) Init(100) Param
+Common Joined UInteger Var(param_file_cache_lines) Init(0) Param
 Max number of lines to index into file cache.
 
 -param=fsm-scale-path-stmts=