Hi, Sergey! Thanks for the patch! LGTM -- Best regards, Maxim Kokryashkin     >Вторник, 31 октября 2023, 15:49 +03:00 от Sergey Kaplun : >  >From: Mike Pall > >Reported by XmiliaH. > >(cherry-picked from commit 7b994e0ee0399caf6319865bbac88ddf62129a36) > >Fold optimization x - (-0) ==> x is INVALID for x = -0 in FP arithmetic. >Its result is -0 instead of +0. This patch allows only x - (+0) ==> x >optimization. > >Sergey Kaplun: >* added the description and the test for the problem > >Part of tarantool/tarantool#9145 >--- > >Branch: https://github.com/tarantool/luajit/tree/skaplun/lj-783-fix-fold-x-0 >Tarantool PR: https://github.com/tarantool/tarantool/pull/9320 >Related Issues: >* https://github.com/tarantool/tarantool/issues/9145 >* https://github.com/LuaJIT/LuaJIT/pull/783 > > src/lj_opt_fold.c | 3 +-- > test/tarantool-tests/lj-783-fold--0.test.lua | 28 ++++++++++++++++++++ > 2 files changed, 29 insertions(+), 2 deletions(-) > create mode 100644 test/tarantool-tests/lj-783-fold--0.test.lua > >diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c >index 09e6c87b..944a9ecc 100644 >--- a/src/lj_opt_fold.c >+++ b/src/lj_opt_fold.c >@@ -1005,8 +1005,7 @@ LJFOLDF(simplify_numadd_xneg) > LJFOLD(SUB any KNUM) > LJFOLDF(simplify_numsub_k) > { >- lua_Number n = knumright; >- if (n == 0.0) /* x - (+-0) ==> x */ >+ if (ir_knum(fright)->u64 == 0) /* x - (+0) ==> x */ >     return LEFTFOLD; >   return NEXTFOLD; > } >diff --git a/test/tarantool-tests/lj-783-fold--0.test.lua b/test/tarantool-tests/lj-783-fold--0.test.lua >new file mode 100644 >index 00000000..d6b4b493 >--- /dev/null >+++ b/test/tarantool-tests/lj-783-fold--0.test.lua >@@ -0,0 +1,28 @@ >+local tap = require('tap') >+ >+-- Test file to demonstrate LuaJIT's incorrect fold optimization >+-- x - (-0) ==> x. >+-- See also https://github.com/LuaJIT/LuaJIT/issues/783 . >+local test = tap.test('lj-783-fold--0'):skipcond({ >+ ['Test requires JIT enabled'] = not jit.status(), >+}) >+ >+test:plan(2) >+ >+-- XXX: Use the variable to avoid folding during parsing. >+local minus_zero = -0 >+local results = {} >+ >+jit.opt.start('hotloop=1') >+ >+for i = 1, 4 do >+ results[i] = tostring(minus_zero - (-0)) >+end >+ >+-- Fold optimization x - (-0) ==> x is INVALID for x = -0 in FP >+-- arithmetic. Its result is -0 instead of +0. >+ >+test:is(results[1], '0', 'correct VM value for -0 - (-0)') >+test:samevalues(results, '-0 folding in simplify_numsub_k') >+ >+test:done(true) >-- >2.42.0