diff --git a/libcpp/charset.cc b/libcpp/charset.cc
index 79072877cbf747aea7a3fbfac6ce0495825d43ae..fd57f6139804612d41311ebda684d13ff8c0c3d4 100644
--- a/libcpp/charset.cc
+++ b/libcpp/charset.cc
@@ -3093,7 +3093,7 @@ _cpp_convert_input (cpp_reader *pfile, const char *input_charset,
   struct cset_converter input_cset;
   struct _cpp_strbuf to;
   unsigned char *buffer;
-  size_t pad;
+  size_t pad = CPP_BUFFER_PADDING;
 
   input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset);
   if (input_cset.func == convert_no_conversion)
@@ -3130,11 +3130,6 @@ _cpp_convert_input (cpp_reader *pfile, const char *input_charset,
 	}
     }
 
-#ifdef HAVE_SSSE3
-  pad = 64;
-#else
-  pad = 16;
-#endif
   /* Resize buffer if we allocated substantially too much, or if we
      don't have enough space for the following padding, which allows
      search_line_fast to use (possibly misaligned) vector loads.  */
diff --git a/libcpp/files.cc b/libcpp/files.cc
index 3775091d259eec3a73c8c71c847ba60d0e8092c9..fc66b9c3d73add260f1809aec16ab7bffa1ef65f 100644
--- a/libcpp/files.cc
+++ b/libcpp/files.cc
@@ -732,11 +732,7 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file, location_t loc,
        the majority of C source files.  */
     size = 8 * 1024;
 
-#ifdef HAVE_SSSE3
-  pad = 64;
-#else
-  pad = 16;
-#endif
+  pad = CPP_BUFFER_PADDING;
   /* The '+ PAD' here is space for the final '\n' and PAD-1 bytes of padding,
      allowing search_line_fast to use (possibly misaligned) vector loads.  */
   buf = XNEWVEC (uchar, size + pad);
diff --git a/libcpp/internal.h b/libcpp/internal.h
index a20215c57095359e7ff275988979c9fcf7430c9b..ad0a5d5d4e34e5d3b22df7b65c3797616cf1616c 100644
--- a/libcpp/internal.h
+++ b/libcpp/internal.h
@@ -322,6 +322,13 @@ struct _cpp_line_note
   unsigned int type;
 };
 
+/* Tail padding required by search_line_fast alternatives.  */
+#ifdef HAVE_SSSE3
+#define CPP_BUFFER_PADDING 64
+#else
+#define CPP_BUFFER_PADDING 16
+#endif
+
 /* Represents the contents of a file cpplib has read in.  */
 struct cpp_buffer
 {
diff --git a/libcpp/lex.cc b/libcpp/lex.cc
index f2d47d112b921763c2a7a1ff38e7ac2192601f9b..7f0f8d07735b7c2c881877bbf27022b5bc43230e 100644
--- a/libcpp/lex.cc
+++ b/libcpp/lex.cc
@@ -359,8 +359,8 @@ search_line_ssse3 (const uchar *s, const uchar *end ATTRIBUTE_UNUSED)
                 "host character encoding is ASCII");
 
   v16qi d1, d2, t1, t2;
-  /* Unaligned loads.  Reading beyond the final newline is safe,
-     since files.cc:read_file_guts pads the allocation.  */
+  /* Unaligned loads, potentially using padding after the final newline.  */
+  static_assert (CPP_BUFFER_PADDING >= 64, "");
   d1 = *(const v16qi_u *)s;
   d2 = *(const v16qi_u *)(s + 16);
   unsigned m1, m2, found;