VarAction2: Remove operations which always do nothing when applied to 0

pull/393/head
Jonathan G Rennison 2 years ago
parent 26dd84f931
commit 9d04ebcc90

@ -5862,6 +5862,10 @@ static void OptimiseVarAction2Adjust(VarAction2OptimiseState &state, const GrfSp
} else if ((prev_inference & VA2AIF_HAVE_CONSTANT) && adjust.variable == 0x1A && IsEvalAdjustUsableForConstantPropagation(adjust.operation)) {
/* Reduce constant operation on previous constant */
replace_with_constant_load(EvaluateDeterministicSpriteGroupAdjust(group->size, adjust, nullptr, state.current_constant, UINT_MAX));
} else if ((prev_inference & VA2AIF_HAVE_CONSTANT) && state.current_constant == 0 && adjust.variable != 0x7E && IsEvalAdjustWithZeroLastValueAlwaysZero(adjust.operation)) {
/* Remove operation which does nothing when applied to 0 */
group->adjusts.pop_back();
state.inference = prev_inference;
} else if ((prev_inference & VA2AIF_HAVE_CONSTANT) && IsEvalAdjustOperationOnConstantEffectiveLoad(adjust.operation, state.current_constant)) {
/* Convert operation to a load */
DeterministicSpriteGroupAdjust current = group->adjusts.back();

@ -307,6 +307,27 @@ inline bool IsEvalAdjustOperationOnConstantEffectiveLoad(DeterministicSpriteGrou
}
}
inline bool IsEvalAdjustWithZeroLastValueAlwaysZero(DeterministicSpriteGroupAdjustOperation op)
{
switch (op) {
case DSGA_OP_SDIV:
case DSGA_OP_SMOD:
case DSGA_OP_UDIV:
case DSGA_OP_UMOD:
case DSGA_OP_UMIN:
case DSGA_OP_MUL:
case DSGA_OP_AND:
case DSGA_OP_ROR:
case DSGA_OP_SHL:
case DSGA_OP_SHR:
case DSGA_OP_SAR:
return true;
default:
return false;
}
}
struct DeterministicSpriteGroupAdjust {
DeterministicSpriteGroupAdjustOperation operation;
DeterministicSpriteGroupAdjustType type;

Loading…
Cancel
Save