VarAction2: Move optimiser flags to a separate setting
This commit is contained in:
@@ -234,6 +234,9 @@ char *CrashLog::LogConfiguration(char *buffer, const char *last) const
|
|||||||
if (_settings_game.debug.chicken_bits != 0) {
|
if (_settings_game.debug.chicken_bits != 0) {
|
||||||
buffer += seprintf(buffer, last, "Chicken bits: 0x%08X\n\n", _settings_game.debug.chicken_bits);
|
buffer += seprintf(buffer, last, "Chicken bits: 0x%08X\n\n", _settings_game.debug.chicken_bits);
|
||||||
}
|
}
|
||||||
|
if (_settings_game.debug.newgrf_optimiser_flags != 0) {
|
||||||
|
buffer += seprintf(buffer, last, "NewGRF optimiser flags: 0x%08X\n\n", _settings_game.debug.newgrf_optimiser_flags);
|
||||||
|
}
|
||||||
|
|
||||||
buffer += seprintf(buffer, last, "AI Configuration (local: %i) (current: %i):\n", (int)_local_company, (int)_current_company);
|
buffer += seprintf(buffer, last, "AI Configuration (local: %i) (current: %i):\n", (int)_local_company, (int)_current_company);
|
||||||
for (const Company *c : Company::Iterate()) {
|
for (const Company *c : Company::Iterate()) {
|
||||||
|
@@ -20,10 +20,6 @@ enum ChickenBitFlags {
|
|||||||
DCBF_DESYNC_CHECK_POST_COMMAND = 3,
|
DCBF_DESYNC_CHECK_POST_COMMAND = 3,
|
||||||
DCBF_DESYNC_CHECK_NO_GENERAL = 4,
|
DCBF_DESYNC_CHECK_NO_GENERAL = 4,
|
||||||
DCBF_DESYNC_CHECK_PERIODIC_SIGNALS = 5,
|
DCBF_DESYNC_CHECK_PERIODIC_SIGNALS = 5,
|
||||||
DCBF_NO_OPTIMISE_VARACT2 = 6,
|
|
||||||
DCBF_NO_OPTIMISE_VARACT2_DSE = 7,
|
|
||||||
DCBF_NO_OPTIMISE_VARACT2_PRUNE = 8,
|
|
||||||
DCBF_NO_OPTIMISE_VARACT2_EXP_VAR = 9,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool HasChickenBit(ChickenBitFlags flag)
|
inline bool HasChickenBit(ChickenBitFlags flag)
|
||||||
@@ -31,6 +27,18 @@ inline bool HasChickenBit(ChickenBitFlags flag)
|
|||||||
return HasBit(_settings_game.debug.chicken_bits, flag);
|
return HasBit(_settings_game.debug.chicken_bits, flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum NewGRFOptimiserFlags {
|
||||||
|
NGOF_NO_OPT_VARACT2 = 0,
|
||||||
|
NGOF_NO_OPT_VARACT2_DSE = 1,
|
||||||
|
NGOF_NO_OPT_VARACT2_GROUP_PRUNE = 2,
|
||||||
|
NGOF_NO_OPT_VARACT2_EXPENSIVE_VARS = 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool HasGrfOptimiserFlag(NewGRFOptimiserFlags flag)
|
||||||
|
{
|
||||||
|
return HasBit(_settings_game.debug.newgrf_optimiser_flags, flag);
|
||||||
|
}
|
||||||
|
|
||||||
enum MiscDebugFlags {
|
enum MiscDebugFlags {
|
||||||
MDF_OVERHEAT_BREAKDOWN_OPEN_WIN,
|
MDF_OVERHEAT_BREAKDOWN_OPEN_WIN,
|
||||||
MDF_ZONING_RS_WATER_FLOOD_STATE,
|
MDF_ZONING_RS_WATER_FLOOD_STATE,
|
||||||
|
@@ -5536,7 +5536,7 @@ static const SpriteGroup *GetGroupFromGroupID(byte setid, byte type, uint16 grou
|
|||||||
}
|
}
|
||||||
|
|
||||||
const SpriteGroup *result = _cur.spritegroups[groupid];
|
const SpriteGroup *result = _cur.spritegroups[groupid];
|
||||||
if (HasChickenBit(DCBF_NO_OPTIMISE_VARACT2) || HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_PRUNE)) return result;
|
if (HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2) || HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_GROUP_PRUNE)) return result;
|
||||||
while (result != nullptr) {
|
while (result != nullptr) {
|
||||||
if (result->type == SGT_DETERMINISTIC) {
|
if (result->type == SGT_DETERMINISTIC) {
|
||||||
const DeterministicSpriteGroup *sg = static_cast<const DeterministicSpriteGroup *>(result);
|
const DeterministicSpriteGroup *sg = static_cast<const DeterministicSpriteGroup *>(result);
|
||||||
@@ -5667,7 +5667,7 @@ static bool IsFeatureUsableForDSE(GrfSpecFeature feature)
|
|||||||
|
|
||||||
static void OptimiseVarAction2Adjust(VarAction2OptimiseState &state, const GrfSpecFeature feature, const byte varsize, DeterministicSpriteGroup *group, DeterministicSpriteGroupAdjust &adjust)
|
static void OptimiseVarAction2Adjust(VarAction2OptimiseState &state, const GrfSpecFeature feature, const byte varsize, DeterministicSpriteGroup *group, DeterministicSpriteGroupAdjust &adjust)
|
||||||
{
|
{
|
||||||
if (unlikely(HasChickenBit(DCBF_NO_OPTIMISE_VARACT2))) return;
|
if (unlikely(HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2))) return;
|
||||||
|
|
||||||
VarAction2AdjustInferenceFlags prev_inference = state.inference;
|
VarAction2AdjustInferenceFlags prev_inference = state.inference;
|
||||||
state.inference = VA2AIF_NONE;
|
state.inference = VA2AIF_NONE;
|
||||||
@@ -6428,9 +6428,9 @@ static void OptimiseVarAction2DeterministicSpriteGroupExpensiveVars(const GrfSpe
|
|||||||
|
|
||||||
static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &state, const GrfSpecFeature feature, const byte varsize, DeterministicSpriteGroup *group)
|
static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &state, const GrfSpecFeature feature, const byte varsize, DeterministicSpriteGroup *group)
|
||||||
{
|
{
|
||||||
if (unlikely(HasChickenBit(DCBF_NO_OPTIMISE_VARACT2))) return;
|
if (unlikely(HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2))) return;
|
||||||
|
|
||||||
if (!HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_PRUNE) && (state.inference & VA2AIF_HAVE_CONSTANT) && !group->calculated_result) {
|
if (!HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_GROUP_PRUNE) && (state.inference & VA2AIF_HAVE_CONSTANT) && !group->calculated_result) {
|
||||||
/* Result of this sprite group is always the same, discard the unused branches */
|
/* Result of this sprite group is always the same, discard the unused branches */
|
||||||
const SpriteGroup *target = group->default_group;
|
const SpriteGroup *target = group->default_group;
|
||||||
for (const auto &range : group->ranges) {
|
for (const auto &range : group->ranges) {
|
||||||
@@ -6443,7 +6443,7 @@ static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &
|
|||||||
group->ranges.clear();
|
group->ranges.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_PRUNE) && group->ranges.empty() && !group->calculated_result) {
|
if (!HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_GROUP_PRUNE) && group->ranges.empty() && !group->calculated_result) {
|
||||||
/* There is only one option, remove any redundant adjustments when the result will be ignored anyway */
|
/* There is only one option, remove any redundant adjustments when the result will be ignored anyway */
|
||||||
while (!group->adjusts.empty()) {
|
while (!group->adjusts.empty()) {
|
||||||
const DeterministicSpriteGroupAdjust &prev = group->adjusts.back();
|
const DeterministicSpriteGroupAdjust &prev = group->adjusts.back();
|
||||||
@@ -6521,8 +6521,8 @@ static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &
|
|||||||
bool dse_candidate = false;
|
bool dse_candidate = false;
|
||||||
if (check_dse || state.seen_procedure_call) dse_candidate = CheckDeterministicSpriteGroupOutputVarBits(group, bits, check_dse, !state.seen_procedure_call);
|
if (check_dse || state.seen_procedure_call) dse_candidate = CheckDeterministicSpriteGroupOutputVarBits(group, bits, check_dse, !state.seen_procedure_call);
|
||||||
|
|
||||||
if (state.check_expensive_vars && !HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_EXP_VAR)) {
|
if (state.check_expensive_vars && !HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_EXPENSIVE_VARS)) {
|
||||||
if (dse_candidate && !HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_DSE)) {
|
if (dse_candidate && !HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_DSE)) {
|
||||||
_cur.pending_expensive_var_checks.push_back({ feature, group });
|
_cur.pending_expensive_var_checks.push_back({ feature, group });
|
||||||
} else {
|
} else {
|
||||||
OptimiseVarAction2DeterministicSpriteGroupExpensiveVars(feature, group);
|
OptimiseVarAction2DeterministicSpriteGroupExpensiveVars(feature, group);
|
||||||
@@ -6532,7 +6532,7 @@ static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &
|
|||||||
|
|
||||||
static void HandleVarAction2DeadStoreElimination()
|
static void HandleVarAction2DeadStoreElimination()
|
||||||
{
|
{
|
||||||
if (unlikely(HasChickenBit(DCBF_NO_OPTIMISE_VARACT2) || HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_DSE))) return;
|
if (unlikely(HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2) || HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_DSE))) return;
|
||||||
|
|
||||||
for (DeterministicSpriteGroup *group : _cur.dead_store_elimination_candidates) {
|
for (DeterministicSpriteGroup *group : _cur.dead_store_elimination_candidates) {
|
||||||
std::bitset<256> bits;
|
std::bitset<256> bits;
|
||||||
|
@@ -757,6 +757,7 @@ struct CompanySettings {
|
|||||||
/** Debug settings. */
|
/** Debug settings. */
|
||||||
struct DebugSettings {
|
struct DebugSettings {
|
||||||
uint32 chicken_bits; ///< chicken bits
|
uint32 chicken_bits; ///< chicken bits
|
||||||
|
uint32 newgrf_optimiser_flags; ///< NewGRF optimiser flags
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Scenario editor settings. */
|
/** Scenario editor settings. */
|
||||||
|
@@ -5999,3 +5999,13 @@ min = 0
|
|||||||
max = 0xFFFFFFFF
|
max = 0xFFFFFFFF
|
||||||
cat = SC_EXPERT
|
cat = SC_EXPERT
|
||||||
patxname = ""debug.chicken_bits""
|
patxname = ""debug.chicken_bits""
|
||||||
|
|
||||||
|
[SDT_VAR]
|
||||||
|
var = debug.newgrf_optimiser_flags
|
||||||
|
type = SLE_UINT32
|
||||||
|
flags = SF_NOT_IN_CONFIG | SF_NO_NEWGAME | SF_NO_NETWORK
|
||||||
|
def = 0
|
||||||
|
min = 0
|
||||||
|
max = 0xFFFFFFFF
|
||||||
|
cat = SC_EXPERT
|
||||||
|
patxname = ""debug.newgrf_optimiser_flags""
|
||||||
|
Reference in New Issue
Block a user