Hit a showstopper issue

Dibyendu Majumdar mobile@majumdar.org.uk
Thu Jan 1 00:00:00 GMT 2015


I have hit an issue that is a show stopper for me.

In Lua, redundant bytecodes are emitted that end up being unreachable
blocks in the generated code. In LLVM these unreachable blocks are
simply eliminated during optimization. But libgccjit is failing with
an error.

Here is a minimal Lua function.

x=function() return; end

The generated Lua bytecode is this:

function <test.lua:1,1> (2 instructions at 0xad4840)
0 params, 2 slots, 0 upvalues, 0 locals, 0 constants, 0 functions
1 [1] RETURN   0 1
2 [1] RETURN   0 1
constants (0) for 0xad4840:
locals (0) for 0xad4840:
upvalues (0) for 0xad4840:

As you can see there is a redundant RETURN bytecode.

The code I generate is this:

static int
ravif1 (struct ravi_lua_State * L)
{
  struct ravi_TValue * base;

entry:
  base = L->ci->u.l.base;
  base = L->ci->u.l.base;
  L->top = &base[(int)0];
  if ((struct ravi_LClosure *)L->ci->func->p->sizep > (int)0) goto
<UNNAMED BLOCK 0x2360800>; else goto <UNNAMED BLOCK 0x2360850>;

<UNNAMED BLOCK 0x2360800>:
  (void)luaF_close (L, base);
  goto <UNNAMED BLOCK 0x2360850>;

<UNNAMED BLOCK 0x2360850>:
  (void)luaD_poscall (L, &base[(int)0]);
  return (int)1;

<UNNAMED BLOCK 0x2360c00>:
  base = L->ci->u.l.base;
  L->top = &base[(int)0];
  if ((struct ravi_LClosure *)L->ci->func->p->sizep > (int)0) goto
<UNNAMED BLOCK 0x2360a60>; else goto <UNNAMED BLOCK 0x2361290>;

<UNNAMED BLOCK 0x2360a60>:
  (void)luaF_close (L, base);
  goto <UNNAMED BLOCK 0x2361290>;

<UNNAMED BLOCK 0x2361290>:
  (void)luaD_poscall (L, &base[(int)0]);
  return (int)1;
}

When this is compiled the following errors occur:

libgccjit.so: error: unreachable block: <UNNAMED BLOCK 0xad5c40>
libgccjit.so: error: unreachable block: <UNNAMED BLOCK 0xad5aa0>
libgccjit.so: error: unreachable block: <UNNAMED BLOCK 0xad62d0>



More information about the Jit mailing list