]> git.eshelyaron.com Git - emacs.git/commitdiff
Slight funcall_subr optimisation
authorMattias Engdegård <mattiase@acm.org>
Tue, 21 Nov 2023 10:23:57 +0000 (11:23 +0100)
committerMattias Engdegård <mattiase@acm.org>
Fri, 22 Dec 2023 13:13:23 +0000 (14:13 +0100)
* src/eval.c (funcall_subr): Help the compiler by reducing aliasing
problems, and compensate for a missed-optimisation bug in LLVM where
switches sometimes forget to use variable range information (reported
in https://github.com/llvm/llvm-project/issues/76085).

src/eval.c

index 5c9052cb9abc5b5a07c7cdfd4bc43b92c295148c..b3d3fc3132b9ec64b7f8a39442277157493d4893 100644 (file)
@@ -3033,21 +3033,21 @@ funcall_subr (struct Lisp_Subr *subr, ptrdiff_t numargs, Lisp_Object *args)
   if (numargs >= subr->min_args)
     {
       /* Conforming call to finite-arity subr.  */
-      if (numargs <= subr->max_args
-         && subr->max_args <= 8)
+      ptrdiff_t maxargs = subr->max_args;
+      if (numargs <= maxargs && maxargs <= 8)
        {
          Lisp_Object argbuf[8];
          Lisp_Object *a;
-         if (numargs < subr->max_args)
+         if (numargs < maxargs)
            {
-             eassume (subr->max_args <= ARRAYELTS (argbuf));
+             eassume (maxargs <= ARRAYELTS (argbuf));
              a = argbuf;
              memcpy (a, args, numargs * word_size);
-             memclear (a + numargs, (subr->max_args - numargs) * word_size);
+             memclear (a + numargs, (maxargs - numargs) * word_size);
            }
          else
            a = args;
-         switch (subr->max_args)
+         switch (maxargs)
            {
            case 0:
              return subr->function.a0 ();
@@ -3069,14 +3069,12 @@ funcall_subr (struct Lisp_Subr *subr, ptrdiff_t numargs, Lisp_Object *args)
            case 8:
              return subr->function.a8 (a[0], a[1], a[2], a[3], a[4], a[5],
                                        a[6], a[7]);
-           default:
-             emacs_abort ();   /* Can't happen. */
            }
+         eassume (false);      /* In case the compiler is too stupid.  */
        }
 
       /* Call to n-adic subr.  */
-      if (subr->max_args == MANY
-         || subr->max_args > 8)
+      if (maxargs == MANY || maxargs > 8)
        return subr->function.aMANY (numargs, args);
     }