diff --git a/gcc/input.cc b/gcc/input.cc
index 64cb85eeed0e2ac84b44ed673a24d8ff8659bc21..3416c7cdd732f612c1a3fd0c4b6a9b0a57dfa8c2 100644
--- a/gcc/input.cc
+++ b/gcc/input.cc
@@ -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,
diff --git a/gcc/params.opt b/gcc/params.opt
index 5d234a607c02a3e27fd916366e529551bd257176..d84e35679e6db1fe36293e9f26cccf4ffd3fc91b 100644
--- a/gcc/params.opt
+++ b/gcc/params.opt
@@ -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=