summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/frontend/ir/microinstruction.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-11-02 16:34:03 -0700
committerGitHub <noreply@github.com>2021-11-02 16:34:03 -0700
commit7ce29ea74e945062b3c4c434c17980a74464383d (patch)
tree2907d9f73624bd28d112e030dd816212b3dab554 /src/shader_recompiler/frontend/ir/microinstruction.cpp
parent43ba9db89081ed0e32b66a56ab236e6fd2c52514 (diff)
parent2d4bbd83e6f29850558fc6d741a93b5bf0d9bbb9 (diff)
Merge pull request #7262 from FernandoS27/Buffalo-buffalo-Buffalo-buffalo-buffalo
ShaderCache: Order Phi Arguments from farthest away to nearest.
Diffstat (limited to 'src/shader_recompiler/frontend/ir/microinstruction.cpp')
-rw-r--r--src/shader_recompiler/frontend/ir/microinstruction.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/shader_recompiler/frontend/ir/microinstruction.cpp b/src/shader_recompiler/frontend/ir/microinstruction.cpp
index 3dfa5a880..30b470bdd 100644
--- a/src/shader_recompiler/frontend/ir/microinstruction.cpp
+++ b/src/shader_recompiler/frontend/ir/microinstruction.cpp
@@ -6,6 +6,7 @@
#include <memory>
#include "shader_recompiler/exception.h"
+#include "shader_recompiler/frontend/ir/basic_block.h"
#include "shader_recompiler/frontend/ir/type.h"
#include "shader_recompiler/frontend/ir/value.h"
@@ -253,6 +254,10 @@ Inst* Inst::GetAssociatedPseudoOperation(IR::Opcode opcode) {
}
IR::Type Inst::Type() const {
+ if (op == IR::Opcode::Phi) {
+ // The type of a phi node is stored in its flags
+ return Flags<IR::Type>();
+ }
return TypeOf(op);
}
@@ -291,6 +296,16 @@ void Inst::AddPhiOperand(Block* predecessor, const Value& value) {
phi_args.emplace_back(predecessor, value);
}
+void Inst::OrderPhiArgs() {
+ if (op != Opcode::Phi) {
+ throw LogicError("{} is not a Phi instruction", op);
+ }
+ std::sort(phi_args.begin(), phi_args.end(),
+ [](const std::pair<Block*, Value>& a, const std::pair<Block*, Value>& b) {
+ return a.first->GetOrder() < b.first->GetOrder();
+ });
+}
+
void Inst::Invalidate() {
ClearArgs();
ReplaceOpcode(Opcode::Void);