summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
diff options
context:
space:
mode:
authorGravatar ameerj2021-02-24 20:31:15 -0500
committerGravatar ameerj2021-07-22 21:51:22 -0400
commit8810c88b7e3de2766bf47e07e941fb2c58c6b4b0 (patch)
tree73619b1563eefc7103687de8e78bcf3f750812f7 /src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
parentspirv: Move phi arguments emit to a separate function (diff)
downloadyuzu-8810c88b7e3de2766bf47e07e941fb2c58c6b4b0.tar.gz
yuzu-8810c88b7e3de2766bf47e07e941fb2c58c6b4b0.tar.xz
yuzu-8810c88b7e3de2766bf47e07e941fb2c58c6b4b0.zip
shader: Implement SEL
Diffstat (limited to 'src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp')
-rw-r--r--src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
index 13f9c914a..19d35b1f8 100644
--- a/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
+++ b/src/shader_recompiler/ir_opt/ssa_rewrite_pass.cpp
@@ -109,11 +109,13 @@ IR::Opcode UndefOpcode(const FlagTag&) noexcept {
109 109
110class Pass { 110class Pass {
111public: 111public:
112 void WriteVariable(auto variable, IR::Block* block, const IR::Value& value) { 112 template <typename Type>
113 void WriteVariable(Type variable, IR::Block* block, const IR::Value& value) {
113 current_def[variable].insert_or_assign(block, value); 114 current_def[variable].insert_or_assign(block, value);
114 } 115 }
115 116
116 IR::Value ReadVariable(auto variable, IR::Block* block) { 117 template <typename Type>
118 IR::Value ReadVariable(Type variable, IR::Block* block) {
117 const ValueMap& def{current_def[variable]}; 119 const ValueMap& def{current_def[variable]};
118 if (const auto it{def.find(block)}; it != def.end()) { 120 if (const auto it{def.find(block)}; it != def.end()) {
119 return it->second; 121 return it->second;
@@ -132,7 +134,8 @@ public:
132 } 134 }
133 135
134private: 136private:
135 IR::Value ReadVariableRecursive(auto variable, IR::Block* block) { 137 template <typename Type>
138 IR::Value ReadVariableRecursive(Type variable, IR::Block* block) {
136 IR::Value val; 139 IR::Value val;
137 if (!sealed_blocks.contains(block)) { 140 if (!sealed_blocks.contains(block)) {
138 // Incomplete CFG 141 // Incomplete CFG
@@ -154,7 +157,8 @@ private:
154 return val; 157 return val;
155 } 158 }
156 159
157 IR::Value AddPhiOperands(auto variable, IR::Inst& phi, IR::Block* block) { 160 template <typename Type>
161 IR::Value AddPhiOperands(Type variable, IR::Inst& phi, IR::Block* block) {
158 for (IR::Block* const imm_pred : block->ImmediatePredecessors()) { 162 for (IR::Block* const imm_pred : block->ImmediatePredecessors()) {
159 phi.AddPhiOperand(imm_pred, ReadVariable(variable, imm_pred)); 163 phi.AddPhiOperand(imm_pred, ReadVariable(variable, imm_pred));
160 } 164 }