From f189e5dc1020db9b41e77488d6290d6e7f032b13 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Mattias=20Engdeg=C3=A5rd?= <mattiase@acm.org>
Date: Tue, 17 Mar 2020 13:18:14 +0100
Subject: [PATCH] Don't generate useless range table entries for ASCII chars

In multibyte regexps, each ASCII char or range in a character
alternative produces a nonsense range table entry in addition to the
correct bits in the ASCII bitmap.  Those entries do not match anything
but waste space and time.

* src/regex-emacs.c (regex_compile): Don't generate reversed intervals.
---
 src/regex-emacs.c | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/src/regex-emacs.c b/src/regex-emacs.c
index 694431c95e2..0ae004e4636 100644
--- a/src/regex-emacs.c
+++ b/src/regex-emacs.c
@@ -2113,17 +2113,20 @@ regex_compile (re_char *pattern, ptrdiff_t size,
 			if (CHAR_BYTE8_P (c1))
 			  c = BYTE8_TO_CHAR (128);
 		      }
-		    if (CHAR_BYTE8_P (c))
-		      {
-			c = CHAR_TO_BYTE8 (c);
-			c1 = CHAR_TO_BYTE8 (c1);
-			for (; c <= c1; c++)
-			  SET_LIST_BIT (c);
-		      }
-		    else if (multibyte)
-		      SETUP_MULTIBYTE_RANGE (range_table_work, c, c1);
-		    else
-		      SETUP_UNIBYTE_RANGE (range_table_work, c, c1);
+                    if (c <= c1)
+                      {
+                        if (CHAR_BYTE8_P (c))
+                          {
+                            c = CHAR_TO_BYTE8 (c);
+                            c1 = CHAR_TO_BYTE8 (c1);
+                            for (; c <= c1; c++)
+                              SET_LIST_BIT (c);
+                          }
+                        else if (multibyte)
+                          SETUP_MULTIBYTE_RANGE (range_table_work, c, c1);
+                        else
+                          SETUP_UNIBYTE_RANGE (range_table_work, c, c1);
+                      }
 		  }
 	      }
 
-- 
2.39.5