VarAction2: Reduce cost of RecursiveDisallowDSEForProcedure
Fix disallowing DSE also disallowing store simplification
This commit is contained in:
@@ -6258,14 +6258,15 @@ static void RecursiveDisallowDSEForProcedure(const SpriteGroup *group)
|
|||||||
if (group->type != SGT_DETERMINISTIC) return;
|
if (group->type != SGT_DETERMINISTIC) return;
|
||||||
|
|
||||||
const DeterministicSpriteGroup *sub = static_cast<const DeterministicSpriteGroup *>(group);
|
const DeterministicSpriteGroup *sub = static_cast<const DeterministicSpriteGroup *>(group);
|
||||||
container_unordered_remove(_cur.dead_store_elimination_candidates, group);
|
if (sub->dsg_flags & DSGF_NO_DSE) return;
|
||||||
|
const_cast<DeterministicSpriteGroup *>(sub)->dsg_flags |= DSGF_NO_DSE;
|
||||||
for (const DeterministicSpriteGroupAdjust &adjust : sub->adjusts) {
|
for (const DeterministicSpriteGroupAdjust &adjust : sub->adjusts) {
|
||||||
if (adjust.variable == 0x7E) RecursiveDisallowDSEForProcedure(adjust.subroutine);
|
if (adjust.variable == 0x7E) RecursiveDisallowDSEForProcedure(adjust.subroutine);
|
||||||
}
|
}
|
||||||
if (!sub->calculated_result) {
|
if (!sub->calculated_result) {
|
||||||
RecursiveDisallowDSEForProcedure(const_cast<SpriteGroup *>(sub->default_group));
|
RecursiveDisallowDSEForProcedure(sub->default_group);
|
||||||
for (const auto &range : sub->ranges) {
|
for (const auto &range : sub->ranges) {
|
||||||
RecursiveDisallowDSEForProcedure(const_cast<SpriteGroup *>(range.group));
|
RecursiveDisallowDSEForProcedure(range.group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6625,11 +6626,8 @@ static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HandleVarAction2DeadStoreElimination()
|
static void HandleVarAction2DeadStoreElimination(DeterministicSpriteGroup *group)
|
||||||
{
|
{
|
||||||
if (unlikely(HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2) || HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_DSE))) return;
|
|
||||||
|
|
||||||
for (DeterministicSpriteGroup *group : _cur.dead_store_elimination_candidates) {
|
|
||||||
std::bitset<256> bits;
|
std::bitset<256> bits;
|
||||||
VarAction2GroupVariableTracking *var_tracking = _cur.GetVarAction2GroupVariableTracking(group, false);
|
VarAction2GroupVariableTracking *var_tracking = _cur.GetVarAction2GroupVariableTracking(group, false);
|
||||||
if (var_tracking != nullptr) bits = var_tracking->out;
|
if (var_tracking != nullptr) bits = var_tracking->out;
|
||||||
@@ -6711,7 +6709,14 @@ static void HandleVarAction2DeadStoreElimination()
|
|||||||
}
|
}
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void HandleVarAction2OptimisationPasses()
|
||||||
|
{
|
||||||
|
if (unlikely(HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2) || HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_DSE))) return;
|
||||||
|
|
||||||
|
for (DeterministicSpriteGroup *group : _cur.dead_store_elimination_candidates) {
|
||||||
|
if (!(group->dsg_flags & DSGF_NO_DSE)) HandleVarAction2DeadStoreElimination(group);
|
||||||
OptimiseVarAction2DeterministicSpriteGroupSimplifyStores(group);
|
OptimiseVarAction2DeterministicSpriteGroupSimplifyStores(group);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -12450,7 +12455,7 @@ void LoadNewGRF(uint load_index, uint num_baseset)
|
|||||||
assert(GetFileByGRFID(c->ident.grfid) == _cur.grffile);
|
assert(GetFileByGRFID(c->ident.grfid) == _cur.grffile);
|
||||||
ClearTemporaryNewGRFData(_cur.grffile);
|
ClearTemporaryNewGRFData(_cur.grffile);
|
||||||
BuildCargoTranslationMap();
|
BuildCargoTranslationMap();
|
||||||
HandleVarAction2DeadStoreElimination();
|
HandleVarAction2OptimisationPasses();
|
||||||
DEBUG(sprite, 2, "LoadNewGRF: Currently %i sprites are loaded", _cur.spriteid);
|
DEBUG(sprite, 2, "LoadNewGRF: Currently %i sprites are loaded", _cur.spriteid);
|
||||||
} else if (stage == GLS_INIT && HasBit(c->flags, GCF_INIT_ONLY)) {
|
} else if (stage == GLS_INIT && HasBit(c->flags, GCF_INIT_ONLY)) {
|
||||||
/* We're not going to activate this, so free whatever data we allocated */
|
/* We're not going to activate this, so free whatever data we allocated */
|
||||||
|
@@ -326,6 +326,11 @@ struct DeterministicSpriteGroupRange {
|
|||||||
uint32 high;
|
uint32 high;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum DeterministicSpriteGroupFlags : uint8 {
|
||||||
|
DSGF_NONE = 0,
|
||||||
|
DSGF_NO_DSE = 1 << 0,
|
||||||
|
};
|
||||||
|
DECLARE_ENUM_AS_BIT_SET(DeterministicSpriteGroupFlags)
|
||||||
|
|
||||||
struct DeterministicSpriteGroup : SpriteGroup {
|
struct DeterministicSpriteGroup : SpriteGroup {
|
||||||
DeterministicSpriteGroup() : SpriteGroup(SGT_DETERMINISTIC) {}
|
DeterministicSpriteGroup() : SpriteGroup(SGT_DETERMINISTIC) {}
|
||||||
@@ -333,6 +338,7 @@ struct DeterministicSpriteGroup : SpriteGroup {
|
|||||||
VarSpriteGroupScope var_scope;
|
VarSpriteGroupScope var_scope;
|
||||||
DeterministicSpriteGroupSize size;
|
DeterministicSpriteGroupSize size;
|
||||||
bool calculated_result;
|
bool calculated_result;
|
||||||
|
DeterministicSpriteGroupFlags dsg_flags = DSGF_NONE;
|
||||||
std::vector<DeterministicSpriteGroupAdjust> adjusts;
|
std::vector<DeterministicSpriteGroupAdjust> adjusts;
|
||||||
std::vector<DeterministicSpriteGroupRange> ranges; // Dynamically allocated
|
std::vector<DeterministicSpriteGroupRange> ranges; // Dynamically allocated
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user