Unexpected evaluation in conditional branch

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


On 27 June 2015 at 21:26, Dibyendu Majumdar <mobile@majumdar.org.uk> wrote:
>> I have scenario where the conditional branch is evaluating the result
>> of a comparison - one of the operands of the comparison is a function
>> call. The generated code appears to evaluate the comparison twice -
>> once for the true branch and once for the false branch - which is not
>> what I am expecting. I can of course store the result of the
>> comparison in a local variable and then perform conditional branch on
>> the variable but I wanted to check whether this behaviour is as
>> expected.
>>
>
> Sadly even after assigning to a local variable the code I am getting
> is evaluating the expression twice. Now I get:
>

Assigning the result of the comparison to a local variable did not
help. But I was able to workaround the issue by assigning the value of
the function call to a local variable and then using the variable in a
comparison. So now I get:

  L->top = &base[(int)2];
  OP_CALL_luaD_precall_result_2_1 = luaD_precall (L, &base[(int)0], (int)0);
  if (OP_CALL_luaD_precall_result_2_1 == (int)0) goto
OP_CALL_if_lua_function_2_2; else goto OP_CALL_else_lua_function_2_3;

OP_CALL_if_lua_function_2_2:
  (void)luaV_execute (L);
  goto OP_CALL_done_2_4;

OP_CALL_else_lua_function_2_3:
  if (OP_CALL_luaD_precall_result_2_1 == (int)1) goto
OP_CALL_if_C_function_2_5; else goto OP_CALL_done_2_4;


This is a serious bug in my view. I was getting weird errors that I
could not explain - only after spending several hours debugging I was
able to identify the cause. Basically the condition on an conditional
branch cannot be evaluated twice.

Regards
Dibyendu



More information about the Jit mailing list