Browse Source

shader: Fix instruction transitions in and out of Phi

pull/15/merge
ReinUsesLisp 5 years ago
committed by ameerj
parent
commit
8dd0acfaeb
  1. 20
      src/shader_recompiler/frontend/ir/microinstruction.cpp

20
src/shader_recompiler/frontend/ir/microinstruction.cpp

@ -182,7 +182,7 @@ void Inst::AddPhiOperand(Block* predecessor, const Value& value) {
void Inst::Invalidate() { void Inst::Invalidate() {
ClearArgs(); ClearArgs();
op = Opcode::Void;
ReplaceOpcode(Opcode::Void);
} }
void Inst::ClearArgs() { void Inst::ClearArgs() {
@ -206,20 +206,22 @@ void Inst::ClearArgs() {
void Inst::ReplaceUsesWith(Value replacement) { void Inst::ReplaceUsesWith(Value replacement) {
Invalidate(); Invalidate();
op = Opcode::Identity;
ReplaceOpcode(Opcode::Identity);
if (!replacement.IsImmediate()) { if (!replacement.IsImmediate()) {
Use(replacement); Use(replacement);
} }
if (op == Opcode::Phi) {
phi_args[0].second = replacement;
} else {
args[0] = replacement;
}
args[0] = replacement;
} }
void Inst::ReplaceOpcode(IR::Opcode opcode) { void Inst::ReplaceOpcode(IR::Opcode opcode) {
if (opcode == IR::Opcode::Phi) {
throw LogicError("Cannot transition into Phi");
}
if (op == Opcode::Phi) {
// Transition out of phi arguments into non-phi
std::destroy_at(&phi_args);
std::construct_at(&args);
}
op = opcode; op = opcode;
} }

Loading…
Cancel
Save