From 8eb6e937c4c5aa4c86142f37f1455637f7e8a20a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Tue, 5 Mar 2019 12:10:18 +0100
Subject: Optimize the '*' operator when multiplying two small integers

---
 erts/emulator/beam/arith_instrs.tab | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/erts/emulator/beam/arith_instrs.tab b/erts/emulator/beam/arith_instrs.tab
index 574fceec5b..5f23b2c168 100644
--- a/erts/emulator/beam/arith_instrs.tab
+++ b/erts/emulator/beam/arith_instrs.tab
@@ -116,6 +116,17 @@ increment.execute(IncrementVal, Dst) {
 i_times(Fail, Op1, Op2, Dst) {
     Eterm op1 = $Op1;
     Eterm op2 = $Op2;
+#ifdef HAVE_OVERFLOW_CHECK_BUILTINS
+    if (ERTS_LIKELY(is_both_small(op1, op2))) {
+        Sint a = signed_val(op1);
+        Sint b = signed_val(op2);
+        Sint res;
+        if (ERTS_LIKELY(!__builtin_mul_overflow(a, b, &res) && IS_SSMALL(res))) {
+            $Dst = make_small(res);
+            $NEXT0();
+        }
+    }
+#endif
     $OUTLINED_ARITH_2($Fail, mixed_times, BIF_stimes_2, op1, op2, $Dst);
 }
 
-- 
cgit v1.2.3