tcg: Add temp_readonly
In most, but not all, places that we check for TEMP_FIXED, we are really testing that we do not modify the temporary. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
ee17db83d2
commit
e01fa97dea
@ -679,6 +679,11 @@ struct TCGContext {
|
||||
target_ulong gen_insn_data[TCG_MAX_INSNS][TARGET_INSN_START_WORDS];
|
||||
};
|
||||
|
||||
static inline bool temp_readonly(TCGTemp *ts)
|
||||
{
|
||||
return ts->kind == TEMP_FIXED;
|
||||
}
|
||||
|
||||
extern TCGContext tcg_init_ctx;
|
||||
extern __thread TCGContext *tcg_ctx;
|
||||
extern const void *tcg_code_gen_epilogue;
|
||||
|
21
tcg/tcg.c
21
tcg/tcg.c
@ -3254,7 +3254,7 @@ static void temp_load(TCGContext *, TCGTemp *, TCGRegSet, TCGRegSet, TCGRegSet);
|
||||
mark it free; otherwise mark it dead. */
|
||||
static void temp_free_or_dead(TCGContext *s, TCGTemp *ts, int free_or_dead)
|
||||
{
|
||||
if (ts->kind == TEMP_FIXED) {
|
||||
if (temp_readonly(ts)) {
|
||||
return;
|
||||
}
|
||||
if (ts->val_type == TEMP_VAL_REG) {
|
||||
@ -3278,7 +3278,7 @@ static inline void temp_dead(TCGContext *s, TCGTemp *ts)
|
||||
static void temp_sync(TCGContext *s, TCGTemp *ts, TCGRegSet allocated_regs,
|
||||
TCGRegSet preferred_regs, int free_or_dead)
|
||||
{
|
||||
if (ts->kind == TEMP_FIXED) {
|
||||
if (temp_readonly(ts)) {
|
||||
return;
|
||||
}
|
||||
if (!ts->mem_coherent) {
|
||||
@ -3461,8 +3461,7 @@ static void temp_save(TCGContext *s, TCGTemp *ts, TCGRegSet allocated_regs)
|
||||
{
|
||||
/* The liveness analysis already ensures that globals are back
|
||||
in memory. Keep an tcg_debug_assert for safety. */
|
||||
tcg_debug_assert(ts->val_type == TEMP_VAL_MEM
|
||||
|| ts->kind == TEMP_FIXED);
|
||||
tcg_debug_assert(ts->val_type == TEMP_VAL_MEM || temp_readonly(ts));
|
||||
}
|
||||
|
||||
/* save globals to their canonical location and assume they can be
|
||||
@ -3542,7 +3541,7 @@ static void tcg_reg_alloc_do_movi(TCGContext *s, TCGTemp *ots,
|
||||
TCGRegSet preferred_regs)
|
||||
{
|
||||
/* ENV should not be modified. */
|
||||
tcg_debug_assert(ots->kind != TEMP_FIXED);
|
||||
tcg_debug_assert(!temp_readonly(ots));
|
||||
|
||||
/* The movi is not explicitly generated here. */
|
||||
if (ots->val_type == TEMP_VAL_REG) {
|
||||
@ -3582,7 +3581,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOp *op)
|
||||
ts = arg_temp(op->args[1]);
|
||||
|
||||
/* ENV should not be modified. */
|
||||
tcg_debug_assert(ots->kind != TEMP_FIXED);
|
||||
tcg_debug_assert(!temp_readonly(ots));
|
||||
|
||||
/* Note that otype != itype for no-op truncation. */
|
||||
otype = ots->type;
|
||||
@ -3643,7 +3642,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOp *op)
|
||||
* Store the source register into the destination slot
|
||||
* and leave the destination temp as TEMP_VAL_MEM.
|
||||
*/
|
||||
assert(ots->kind != TEMP_FIXED);
|
||||
assert(!temp_readonly(ots));
|
||||
if (!ts->mem_allocated) {
|
||||
temp_allocate_frame(s, ots);
|
||||
}
|
||||
@ -3680,7 +3679,7 @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
|
||||
its = arg_temp(op->args[1]);
|
||||
|
||||
/* ENV should not be modified. */
|
||||
tcg_debug_assert(ots->kind != TEMP_FIXED);
|
||||
tcg_debug_assert(!temp_readonly(ots));
|
||||
|
||||
itype = its->type;
|
||||
vece = TCGOP_VECE(op);
|
||||
@ -3912,7 +3911,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||
ts = arg_temp(arg);
|
||||
|
||||
/* ENV should not be modified. */
|
||||
tcg_debug_assert(ts->kind != TEMP_FIXED);
|
||||
tcg_debug_assert(!temp_readonly(ts));
|
||||
|
||||
if (arg_ct->oalias && !const_args[arg_ct->alias_index]) {
|
||||
reg = new_args[arg_ct->alias_index];
|
||||
@ -3953,7 +3952,7 @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
|
||||
ts = arg_temp(op->args[i]);
|
||||
|
||||
/* ENV should not be modified. */
|
||||
tcg_debug_assert(ts->kind != TEMP_FIXED);
|
||||
tcg_debug_assert(!temp_readonly(ts));
|
||||
|
||||
if (NEED_SYNC_ARG(i)) {
|
||||
temp_sync(s, ts, o_allocated_regs, 0, IS_DEAD_ARG(i));
|
||||
@ -4085,7 +4084,7 @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
|
||||
ts = arg_temp(arg);
|
||||
|
||||
/* ENV should not be modified. */
|
||||
tcg_debug_assert(ts->kind != TEMP_FIXED);
|
||||
tcg_debug_assert(!temp_readonly(ts));
|
||||
|
||||
reg = tcg_target_call_oarg_regs[i];
|
||||
tcg_debug_assert(s->reg_to_temp[reg] == NULL);
|
||||
|
Loading…
x
Reference in New Issue
Block a user