Hi:
I wrote the program running in the arm64 server. There is
something difference with other program. I use fp16 to compute the result;
The fp16 program can run successfully without valgrind. But
with valgrind, it ran failed.
There is call stack, and last word:
t135 = GET:F16(722)
vex: the `impossible' happened:
iselStmt
vex storage: T total 4464272856 bytes allocated
vex storage: P total 0 bytes allocated
valgrind: the 'impossible' happened:
LibVEX called failure_exit().
host stacktrace:
==2201== at 0x380453C4: show_sched_status_wrk (m_libcassert.c:355)
==2201== by 0x3804572B: report_and_quit (m_libcassert.c:426)
==2201== by 0x380457CB: panic (m_libcassert.c:502)
==2201== by 0x3804576F: vgPlain_core_panic_at (m_libcassert.c:507)
==2201== by 0x380457DB: vgPlain_core_panic (m_libcassert.c:512)
==2201== by 0x38060C6B: failure_exit (m_translate.c:740)
==2201== by 0x38109AAB: vpanic (main_util.c:231)
==2201== by 0x3816C30F: iselStmt (host_arm64_isel.c:4003)
==2201== by 0x3816A7DB: iselSB_ARM64 (host_arm64_isel.c:4201)
==2201== by 0x38107D93: libvex_BackEnd (main_main.c:1047)
==2201== by 0x38107D93: LibVEX_Translate (main_main.c:1174)
==2201== by 0x38060A23: vgPlain_translate (m_translate.c:1794)
==2201== by 0x38093F47: handle_chain_me (scheduler.c:1084)
==2201== by 0x3809227F: vgPlain_scheduler (scheduler.c:0)
==2201== by 0x380A0607: thread_wrapper (syswrap-linux.c:103)
==2201== by 0x380A0607: run_a_thread_NORETURN (syswrap-linux.c:156)
==2201== by 0x380A051F: vgModuleLocal_start_thread_NORETURN
(syswrap-linux.c:320)
==2201== by 0x380C2E37: ??? (in /system/lib64/valgrind/memcheck-arm64-linux)
I check the code that valgrind analyze the instruction.
In the Ist_WrTmp case, there is no statement to handle fp16 case.
I want to know how to fixed the bug, and support fp16 type.
Host_arm64_isel.c iselStmt function code as below:
/* --------- TMP --------- */
/* assign value to temporary */
case Ist_WrTmp: {
IRTemp tmp = stmt->Ist.WrTmp.tmp;
IRType ty = typeOfIRTemp(env->type_env, tmp);
if (ty == Ity_I64 || ty == Ity_I32 || ty == Ity_I16 || ty == Ity_I8) {
/* We could do a lot better here. But for the time being: */
HReg dst = lookupIRTemp(env, tmp);
HReg rD = iselIntExpr_R(env, stmt->Ist.WrTmp.data);
addInstr(env, ARM64Instr_MovI(dst, rD));
return;
}
if (ty == Ity_I1) {
/* Here, we are generating a I1 value into a 64 bit register.
Make sure the value in the register is only zero or one,
but no other. This allows optimisation of the
1Uto64(tmp:I1) case, by making it simply a copy of the
register holding 'tmp'. The point being that the value in
the register holding 'tmp' can only have been created
here. LATER: that seems dangerous; safer to do 'tmp & 1'
in that case. Also, could do this just with a single CINC
insn. */
/* CLONE-01 */
HReg zero = newVRegI(env);
HReg one = newVRegI(env);
HReg dst = lookupIRTemp(env, tmp);
addInstr(env, ARM64Instr_Imm64(zero, 0));
addInstr(env, ARM64Instr_Imm64(one, 1));
ARM64CondCode cc = iselCondCode(env, stmt->Ist.WrTmp.data);
addInstr(env, ARM64Instr_CSel(dst, one, zero, cc));
return;
}
if (ty == Ity_F64) {
HReg src = iselDblExpr(env, stmt->Ist.WrTmp.data);
HReg dst = lookupIRTemp(env, tmp);
addInstr(env, ARM64Instr_VMov(8, dst, src));
return;
}
if (ty == Ity_F32) {
HReg src = iselFltExpr(env, stmt->Ist.WrTmp.data);
HReg dst = lookupIRTemp(env, tmp);
addInstr(env, ARM64Instr_VMov(8/*yes, really*/, dst, src));
return;
}
if (ty == Ity_V128) {
HReg src = iselV128Expr(env, stmt->Ist.WrTmp.data);
HReg dst = lookupIRTemp(env, tmp);
addInstr(env, ARM64Instr_VMov(16, dst, src));
return;
}
if (ty == Ity_V256) {
HReg srcHi, srcLo, dstHi, dstLo;
iselV256Expr(&srcHi,&srcLo, env, stmt->Ist.WrTmp.data);
lookupIRTempPair( &dstHi, &dstLo, env, tmp);
addInstr(env, ARM64Instr_VMov(16, dstHi, srcHi));
addInstr(env, ARM64Instr_VMov(16, dstLo, srcLo));
return;
}
break;
}
/* --------- Call to DIRTY helper --------- */
/* call complex ("dirty") helper function */
case Ist_Dirty: {
valgrind vesoin 3.13.
BR
Owen
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users