|
|
@ -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); |
|
|
|