summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2021-04-21 09:58:23 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:28 +0200
commit23182fa59c45a88b706022c1373e307ba4636cca (patch)
treed67509fa5ca2370bf4cf88aa69aaf36cdf58d660
parentcmake: Link to common in shader_recompiler (diff)
downloadyuzu-23182fa59c45a88b706022c1373e307ba4636cca.tar
yuzu-23182fa59c45a88b706022c1373e307ba4636cca.tar.gz
yuzu-23182fa59c45a88b706022c1373e307ba4636cca.tar.bz2
yuzu-23182fa59c45a88b706022c1373e307ba4636cca.tar.lz
yuzu-23182fa59c45a88b706022c1373e307ba4636cca.tar.xz
yuzu-23182fa59c45a88b706022c1373e307ba4636cca.tar.zst
yuzu-23182fa59c45a88b706022c1373e307ba4636cca.zip
-rw-r--r--src/shader_recompiler/frontend/ir/basic_block.h9
-rw-r--r--src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp5
2 files changed, 11 insertions, 3 deletions
diff --git a/src/shader_recompiler/frontend/ir/basic_block.h b/src/shader_recompiler/frontend/ir/basic_block.h
index ab7ddb3d5..0b0c97af6 100644
--- a/src/shader_recompiler/frontend/ir/basic_block.h
+++ b/src/shader_recompiler/frontend/ir/basic_block.h
@@ -107,6 +107,13 @@ public:
return ssa_reg_values[RegIndex(reg)];
}
+ void SsaSeal() noexcept {
+ is_ssa_sealed = true;
+ }
+ [[nodiscard]] bool IsSsaSealed() const noexcept {
+ return is_ssa_sealed;
+ }
+
[[nodiscard]] bool empty() const {
return instructions.empty();
}
@@ -190,6 +197,8 @@ private:
/// Intrusively store the value of a register in the block.
std::array<Value, NUM_REGS> ssa_reg_values;
+ /// Intrusively store if the block is sealed in the SSA pass.
+ bool is_ssa_sealed{false};
/// Intrusively stored host definition of this block.
u32 definition{};
diff --git a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
index fe86a164b..3bab742e7 100644
--- a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
+++ b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
@@ -195,7 +195,7 @@ public:
case Status::Start: {
if (const IR::Value& def = current_def.Def(block, variable); !def.IsEmpty()) {
stack.back().result = def;
- } else if (!sealed_blocks.contains(block)) {
+ } else if (!block->IsSsaSealed()) {
// Incomplete CFG
IR::Inst* phi{&*block->PrependNewInst(block->begin(), IR::Opcode::Phi)};
phi->SetFlags(IR::TypeOf(UndefOpcode(variable)));
@@ -251,7 +251,7 @@ public:
std::visit([&](auto& variable) { AddPhiOperands(variable, *phi, block); }, variant);
}
}
- sealed_blocks.insert(block);
+ block->SsaSeal();
}
private:
@@ -297,7 +297,6 @@ private:
return same;
}
- boost::container::flat_set<IR::Block*> sealed_blocks;
boost::container::flat_map<IR::Block*, boost::container::flat_map<Variant, IR::Inst*>>
incomplete_phis;
DefTable current_def;