On 30 November 2016 at 07:00, Nikunj A Dadhania <nik...@linux.vnet.ibm.com> wrote: > > Hi, > > I was writing one instruction and hit following issue: > > [snip]/qemu/tcg/tcg.c:2039: tcg fatal error > qemu-ppc64le: [snip]/qemu/translate-all.c:175: tb_lock: Assertion > `!have_tb_lock' failed. > Segmentation fault (core dumped) > > Debugging deeper found that its something to do with the variable type: > > TCGv nb = tcg_temp_new(); > tcg_gen_andi_tl(nb, cpu_gpr[rB(ctx->opcode)], 0xFF); > tcg_gen_brcondi_tl(TCG_COND_EQ, nb, 0, l1); > [ Do something here] > gen_set_label(l1); > tcg_temp_free(nb); > > If I change the variable as "local temporary", the code works fine: > > TCGv nb = tcg_temp_local_new(); > tcg_gen_andi_tl(nb, cpu_gpr[rB(ctx->opcode)], 0xFF); > tcg_gen_brcondi_tl(TCG_COND_EQ, nb, 0, l1); > [ Do something here] > gen_set_label(l1); > tcg_temp_free(nb); > > I see lot of code that is using temporaries for similar operations, > example target-ppc/translate.c:gen_check_align(). How is that working, > is this a bug there as well?
You don't say what your "do something" code is doing, which is the critical question for whether you need a plain temporary or a local temporary. (See tcg/README.) The plain temporary is only valid to the end of a basic block, and brcond ends a basic block. So you can free the temp after the brcond but you can't do anything else with it. (This is what the PPC gen_check_align() does.) If you want to use 'nb' in the "do something" code then it must remain valid over the end of the basic block and you need a local temporary. thanks -- PMM