From: Sergey Ostanevich via Tarantool-patches <tarantool-patches@dev.tarantool.org> To: Igor Munkin <imun@tarantool.org>, Sergey Kaplun <skaplun@tarantool.org>, tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATH luajit] GC64: fix 64-bit constant fusion Date: Fri, 28 May 2021 15:06:25 +0300 [thread overview] Message-ID: <804A99A3-6D0C-4DA9-A939-26FFED0EC823@tarantool.org> (raw) Author: Mike Pall <mike> Date: Mon Aug 28 10:43:37 2017 +0200 x64/LJ_GC64: Fix fallback case of asm_fuseloadk64(). Contributed by Peter Cawley. (cherry picked from commit 6b0824852677cc12570c20a3211fbfe0e4f0ce14) Code generation under LJ_GC64 missed an update to the mcode area after a 64bit constant encoding. This lead to a corruption to the constant later on. The problem is rather rare, since there should be big enough (4GiB) distance from the currently allocated mcode to the dispatch pointer. This lead to a number of flaky tests, trackers are addressed. Sergey Ostanevich: * added the description and the test for the problem Closes: #4095, #4199, #4614 Signed-off-by: Sergey Ostanevich <sergos@tarantool.org> diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index 767bf6f3..2850aea9 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h @@ -387,6 +387,7 @@ static Reg asm_fuseloadk64(ASMState *as, IRIns *ir) ir->i = (int32_t)(as->mctop - as->mcbot); as->mcbot += 8; as->mclim = as->mcbot + MCLIM_REDZONE; + lj_mcode_commitbot(as->J, as->mcbot); } as->mrm.ofs = (int32_t)mcpofs(as, as->mctop - ir->i); as->mrm.base = RID_RIP; diff --git a/test/tarantool-tests/gh-4199-gc64-flaky.test.lua b/test/tarantool-tests/gh-4199-gc64-flaky.test.lua new file mode 100644 index 00000000..3ac30427 --- /dev/null +++ b/test/tarantool-tests/gh-4199-gc64-flaky.test.lua @@ -0,0 +1,63 @@ +-- the test is GC64 only +local ffi=require('ffi') +require('utils').skipcond(not ffi.abi('gc64'), 'test is GC64 only') + +local tap = require("tap") +local test = tap.test("gh-4199-gc64-flaky") +test:plan(1) + +-- first - we have to make a gap from current JIT infra to next +-- available mappable memory +-- most efficient is to grab it per-page + + +ffi.cdef('void * mmap(void *start, size_t length, int prot , int flags, int fd, long offset);') +ffi.cdef('long getpagesize();') + +local pagesize = tonumber(ffi.C.getpagesize()) +local blob = {} +for i=1, 4e9/pagesize do + blob[i] = ffi.C.mmap(ffi.cast('void*',0), pagesize, 0, 0x22, 0, 0) + assert(blob[i] ~= 0) +end + +-- try to chomp all memory in currently allocated gc space +collectgarbage('stop') +local dummy={'a'} +for i=2,30 do + dummy[i] = dummy[i - 1] .. dummy[i - 1] +end + +-- generate a bunch of functions and keep them stored to trigger wrong constant placement + +local s={} +local pass = true + +jit.opt.start('hotloop=1’) +for n=1,100 do + local src='function f'.. n .. [[(x,y,z,f,g,h,j,k,r,c,d) + local a={} + for i=1,1e6 do + a[i] = x + y + z + f + g + h + j + k + r + c + d + if (x > 0) then a[i] = a[i] + 1.1 end + if (c > 0) then a[i] = a[i] + 2.2 end + if (z > 0) then a[i] = a[i] + 3.3 end + if (f > 0) then a[i] = a[i] + 4.4 end + x=x+r + y=y-c + z=z+d + end + return a[1] + end + return f]] .. n ..'(...)' + + s[n] = assert(load(src)) + local res1 = s[n](1,2,3,4,5,6,7,8,9,10,11) + local res2 = s[n](1,2,3,4,5,6,7,8,9,10,11) + if (res1 ~= res2) then + pass = false + break + end +end + +test:ok(pass, 'wrong IR constant fuse')
next reply other threads:[~2021-05-28 12:06 UTC|newest] Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-05-28 12:06 Sergey Ostanevich via Tarantool-patches [this message] 2021-07-04 21:06 ` Igor Munkin via Tarantool-patches 2022-02-16 15:44 ` Sergey Kaplun via Tarantool-patches 2022-06-21 12:11 ` sergos via Tarantool-patches 2022-06-22 13:32 ` Sergey Kaplun via Tarantool-patches 2022-06-29 8:04 ` Igor Munkin via Tarantool-patches 2022-06-30 12:10 ` 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=804A99A3-6D0C-4DA9-A939-26FFED0EC823@tarantool.org \ --to=tarantool-patches@dev.tarantool.org \ --cc=imun@tarantool.org \ --cc=sergos@tarantool.org \ --cc=skaplun@tarantool.org \ --subject='Re: [Tarantool-patches] [PATH luajit] GC64: fix 64-bit constant fusion' \ /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