This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
optimising yyparse: avoid a < 0 check
authorDavid Mitchell <davem@iabyn.com>
Sat, 3 Dec 2016 14:08:56 +0000 (14:08 +0000)
committerDavid Mitchell <davem@iabyn.com>
Mon, 5 Dec 2016 11:54:03 +0000 (11:54 +0000)
casting to unsigned allows (0 <= yyn <= YYLAST) to be done in a single
conditional.

perly.c

diff --git a/perly.c b/perly.c
index d20e4e3..ac6112a 100644 (file)
--- a/perly.c
+++ b/perly.c
@@ -355,9 +355,11 @@ Perl_yyparse (pTHX_ int gramtype)
     }
 
     /* If the proper action on seeing token YYTOKEN is to reduce or to
-         detect an error, take that action.  */
+     * detect an error, take that action.
+     * Casting yyn to unsigned allows a >=0 test to be included as
+     * part of the  <=YYLAST test for speed */
     yyn += yytoken;
-    if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    if ((unsigned int)yyn > YYLAST || yycheck[yyn] != yytoken)
        goto yydefault;
     yyn = yytable[yyn];
     if (yyn <= 0) {