mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-19 18:36:53 +02:00
shader: batch dependent folds to avoid repeated SSA graph walks
This commit is contained in:
@@ -51,11 +51,13 @@ public:
|
||||
}
|
||||
|
||||
void QueueUsers(const std::vector<Use>& users) {
|
||||
++generation;
|
||||
affected.clear();
|
||||
for (const auto& use: users) affected.push_back(use.user);
|
||||
}
|
||||
|
||||
void FlushUsers() {
|
||||
++generation;
|
||||
// Pattern folds inspect nested operands even when intermediate operations
|
||||
// stay dynamic. Visit consumers once per change, including cyclic Phi edges.
|
||||
// stay dynamic. Visit their union once per drain, including cyclic Phi edges.
|
||||
for (size_t i = 0; i < affected.size(); ++i) {
|
||||
auto* inst = affected[i];
|
||||
const auto found = locations.find(inst);
|
||||
@@ -64,6 +66,7 @@ public:
|
||||
Queue(inst);
|
||||
for (const auto& use: inst->Uses()) affected.push_back(use.user);
|
||||
}
|
||||
affected.clear();
|
||||
}
|
||||
|
||||
Block::iterator Prepend(Block& block, Block::iterator before, ValueOpcode opcode,
|
||||
@@ -977,6 +980,7 @@ void ConstantPropagationPass(const BlockList& blocks, uint32_t wave_size) {
|
||||
std::vector<Use> users;
|
||||
std::vector<Value> operands;
|
||||
const auto drain = [&] {
|
||||
do {
|
||||
for (size_t i = 0; i < worklist.pending.size(); ++i) {
|
||||
auto* inst = worklist.pending[i];
|
||||
auto& location = worklist.locations.at(inst);
|
||||
@@ -998,6 +1002,8 @@ void ConstantPropagationPass(const BlockList& blocks, uint32_t wave_size) {
|
||||
}
|
||||
}
|
||||
worklist.pending.clear();
|
||||
worklist.FlushUsers();
|
||||
} while (!worklist.pending.empty());
|
||||
};
|
||||
drain();
|
||||
// Normalize retained PHI/select values only after every supported field read has
|
||||
|
||||
Reference in New Issue
Block a user