Tarantool development patches archive
 help / color / mirror / Atom feed
From: Maxim Kokryashkin via Tarantool-patches <tarantool-patches@dev.tarantool.org>
To: Sergey Kaplun <skaplun@tarantool.org>
Cc: tarantool-patches@dev.tarantool.org
Subject: Re: [Tarantool-patches] [PATCH luajit 1/2] Optimize table.new() with constant args to (sinkable) IR_TNEW.
Date: Wed, 31 Jan 2024 12:20:37 +0300	[thread overview]
Message-ID: <rsimxjijirspekk4yaxn7vl2rp67fgjqx57kihaj5uymopc76d@5khe4fysq724> (raw)
In-Reply-To: <8abb9f75b9f4b8459a6495fedb40da7da5334c9c.1706104777.git.skaplun@tarantool.org>

Hi, Sergey!
Thanks for the patch!

Very thorough testing!

LGTM, except for a minor comment below.

On Wed, Jan 24, 2024 at 05:11:08PM +0300, Sergey Kaplun wrote:
> From: Mike Pall <mike>
>
> Thanks to Peter Cawley.
>
> (cherry picked from commit d1236a4caa999b29e774ef5103df3b424d821d9b)
>
> This patch adds optimization for calls of `table.new()` with constant
> argument refs when asize is in the proper range (i.e., is less than IR
> operand width). The call is replaced with IR TNEW. This opens up
> opportunities for other optimizations in the pipeline.
>
> Sergey Kaplun:
> * added the description and the test for the feature
>
> Part of tarantool/tarantool#9595

<snipped>

> diff --git a/test/tarantool-tests/lj-1128-table-new-opt-tnew.test.lua b/test/tarantool-tests/lj-1128-table-new-opt-tnew.test.lua
> new file mode 100644
> index 00000000..805e6de6
> --- /dev/null
> +++ b/test/tarantool-tests/lj-1128-table-new-opt-tnew.test.lua
> @@ -0,0 +1,112 @@
> +local tap = require('tap')
> +local test = tap.test('lj-1128-table-new-opt-tnew'):skipcond({
> +  ['Test requires JIT enabled'] = not jit.status(),
> +  ['Disabled on *BSD due to #4819'] = jit.os == 'BSD',
> +})
> +
> +-- Test LuaJIT optimization when a call to the `lj_tab_new_ah()`
> +-- is replaced with the corresponding TNEW IR.
> +-- See also https://github.com/LuaJIT/LuaJIT/issues/1128.
> +
> +local jparse = require('utils').jit.parse
> +
> +-- API follows the semantics of `lua_createtable()`.
> +local table_new = require('table.new')
> +
> +-- `hbits` for different `hsizes`, see <lj_tab.h> for details.
> +local HBITS = {
> +  [1] = 1,
> +  [3] = 2,
> +}
> +
> +-- XXX: Avoid any other traces compilation due to hotcount
> +-- collisions for predictable results.
> +jit.off()
> +jit.flush()
> +
> +test:plan(10)
> +
> +jit.on()
> +jit.opt.start('hotloop=1')
> +jparse.start('i')
> +
> +local anchor
> +
> +for _ = 1, 4 do
> +  anchor = table_new(1, 1)
> +end
> +
> +local traces = jparse.finish()
> +jit.off()
> +
> +test:ok(type(anchor) == 'table', 'base result')
I would prefer the assertions for the type to have different
descritions for each test case. This way it is easier to tell
which test you need to focus on, if one of them fails. Here
and below.
> +test:ok(traces[1]:has_ir(('TNEW.*#2.*#%d'):format(HBITS[1])), 'base IR value')
> +
> +jit.flush()
> +jit.on()
> +-- XXX: Reset hotcounters.
> +jit.opt.start('hotloop=1')
> +jparse.start('i')
> +
> +for _ = 1, 4 do
> +  anchor = table_new(0, 0)
> +end
> +
> +traces = jparse.finish()
> +jit.off()
> +
> +test:ok(type(anchor) == 'table', 'base result')
> +test:ok(traces[1]:has_ir('TNEW.*#0.*#0'), '0 asize, 0 hsize')
> +
> +jit.flush()
> +jit.on()
> +-- XXX: Reset hotcounters.
> +jit.opt.start('hotloop=1')
> +jparse.start('i')
> +
> +for _ = 1, 4 do
> +  anchor = table_new(0, 3)
> +end
> +
> +traces = jparse.finish()
> +jit.off()
> +
> +test:ok(type(anchor) == 'table', 'base result')
> +test:ok(traces[1]:has_ir(('TNEW.*#0.*#%d'):format(HBITS[3])),
> +        '3 hsize -> 2 hbits')
> +
> +jit.flush()
> +jit.on()
> +-- XXX: Reset hotcounters.
> +jit.opt.start('hotloop=1')
> +jparse.start('i')
> +
> +for _ = 1, 4 do
> +  anchor = table_new(-1, 0)
> +end
> +
> +traces = jparse.finish()
> +jit.off()
> +
> +test:ok(type(anchor) == 'table', 'base result')
> +test:ok(traces[1]:has_ir('TNEW.*#0.*#0'), 'negative asize')
> +
> +jit.flush()
> +jit.on()
> +-- XXX: Reset hotcounters.
> +jit.opt.start('hotloop=1')
> +jparse.start('i')
> +
> +for _ = 1, 4 do
> +  anchor = table_new(0xffff, 0)
> +end
> +
> +traces = jparse.finish()
> +jit.off()
> +
> +test:ok(type(anchor) == 'table', 'base result')
> +-- Test that TNEW isn't emitted for `asize` bigger than the IR
> +-- operand width (>0x8000).
> +test:ok(not traces[1]:has_ir('TNEW'), 'asize out of range')
> +
> +test:done(true)
> --
> 2.43.0
>

  reply	other threads:[~2024-01-31  9:21 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-24 14:11 [Tarantool-patches] [PATCH luajit 0/2] Fix unsinking TNEW with huge asize Sergey Kaplun via Tarantool-patches
2024-01-24 14:11 ` [Tarantool-patches] [PATCH luajit 1/2] Optimize table.new() with constant args to (sinkable) IR_TNEW Sergey Kaplun via Tarantool-patches
2024-01-31  9:20   ` Maxim Kokryashkin via Tarantool-patches [this message]
2024-01-31  9:36     ` Sergey Kaplun via Tarantool-patches
2024-02-05 14:39   ` Sergey Bronnikov via Tarantool-patches
2024-01-24 14:11 ` [Tarantool-patches] [PATCH luajit 2/2] Only emit proper parent references in snapshot replay Sergey Kaplun via Tarantool-patches
2024-01-31  9:29   ` Maxim Kokryashkin via Tarantool-patches
2024-02-06  9:46   ` Sergey Bronnikov via Tarantool-patches
2024-02-06 10:07     ` Sergey Kaplun via Tarantool-patches
2024-02-06 11:07       ` Sergey Bronnikov via Tarantool-patches
2024-02-06 11:41         ` Sergey Kaplun via Tarantool-patches
2024-02-08 14:12           ` Sergey Bronnikov via Tarantool-patches
2024-02-15 13:45 ` [Tarantool-patches] [PATCH luajit 0/2] Fix unsinking TNEW with huge asize Igor Munkin via Tarantool-patches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=rsimxjijirspekk4yaxn7vl2rp67fgjqx57kihaj5uymopc76d@5khe4fysq724 \
    --to=tarantool-patches@dev.tarantool.org \
    --cc=m.kokryashkin@tarantool.org \
    --cc=skaplun@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH luajit 1/2] Optimize table.new() with constant args to (sinkable) IR_TNEW.' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox