|
|
@ -6,6 +6,7 @@
|
|
|
|
#include <memory>
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
|
|
|
|
#include "shader_recompiler/exception.h"
|
|
|
|
#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/type.h"
|
|
|
|
#include "shader_recompiler/frontend/ir/value.h"
|
|
|
|
#include "shader_recompiler/frontend/ir/value.h"
|
|
|
|
|
|
|
|
|
|
|
@ -253,6 +254,10 @@ Inst* Inst::GetAssociatedPseudoOperation(IR::Opcode opcode) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
IR::Type Inst::Type() const {
|
|
|
|
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);
|
|
|
|
return TypeOf(op);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -291,6 +296,16 @@ void Inst::AddPhiOperand(Block* predecessor, const Value& value) {
|
|
|
|
phi_args.emplace_back(predecessor, 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() {
|
|
|
|
void Inst::Invalidate() {
|
|
|
|
ClearArgs();
|
|
|
|
ClearArgs();
|
|
|
|
ReplaceOpcode(Opcode::Void);
|
|
|
|
ReplaceOpcode(Opcode::Void);
|
|
|
|