diff --git a/src/codegen_reg.c b/src/codegen_reg.c index eb07cfb..2601b5a 100644 --- a/src/codegen_reg.c +++ b/src/codegen_reg.c @@ -191,7 +191,7 @@ void codegen_reg_mark_as_required() } } -static int reg_is_native_size(ir_reg_t ir_reg) +int reg_is_native_size(ir_reg_t ir_reg) { int native_size = ireg_data[IREG_GET_REG(ir_reg.reg)].native_size; int requested_size = IREG_GET_SIZE(ir_reg.reg); diff --git a/src/codegen_reg.h b/src/codegen_reg.h index bd790a9..6bdb7c2 100644 --- a/src/codegen_reg.h +++ b/src/codegen_reg.h @@ -343,6 +343,8 @@ static inline ir_reg_t codegen_reg_read(int reg) return ireg; } +int reg_is_native_size(ir_reg_t ir_reg); + static inline ir_reg_t codegen_reg_write(int reg, int uop_nr) { ir_reg_t ireg; @@ -357,7 +359,10 @@ static inline ir_reg_t codegen_reg_write(int reg, int uop_nr) if (IREG_GET_REG(reg) > IREG_EBX && last_version && !reg_version[IREG_GET_REG(reg)][last_version].refcount && !(reg_version[IREG_GET_REG(reg)][last_version].flags & REG_FLAGS_REQUIRED)) - add_to_dead_list(®_version[IREG_GET_REG(reg)][last_version], IREG_GET_REG(reg), last_version); + { + if (reg_is_native_size(ireg)) /*Non-native size registers have an implicit dependency on the previous version, so don't add to dead list*/ + add_to_dead_list(®_version[IREG_GET_REG(reg)][last_version], IREG_GET_REG(reg), last_version); + } reg_last_version[IREG_GET_REG(reg)]++; if (!reg_last_version[IREG_GET_REG(reg)])