forked from suyu/suyu
glasm: Skip phi moves on undefined instructions
This commit is contained in:
parent
b9c8814ea9
commit
586c785366
2 changed files with 16 additions and 1 deletions
|
@ -58,7 +58,9 @@ void EmitPhiMove(EmitContext& ctx, const IR::Value& phi_value, const IR::Value&
|
||||||
}
|
}
|
||||||
const Register phi_reg{ctx.reg_alloc.Consume(IR::Value{&phi})};
|
const Register phi_reg{ctx.reg_alloc.Consume(IR::Value{&phi})};
|
||||||
const Value eval_value{ctx.reg_alloc.Consume(value)};
|
const Value eval_value{ctx.reg_alloc.Consume(value)};
|
||||||
|
if (!value.IsImmediate() && IR::IsUndef(RegAlloc::AliasInst(*value.Inst()))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (phi_reg == eval_value) {
|
if (phi_reg == eval_value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,4 +395,17 @@ inline f64 Value::F64() const {
|
||||||
return inst.GetOpcode() == Opcode::Phi;
|
return inst.GetOpcode() == Opcode::Phi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] inline bool IsUndef(const Inst& inst) {
|
||||||
|
switch (inst.GetOpcode()) {
|
||||||
|
case Opcode::UndefU1:
|
||||||
|
case Opcode::UndefU8:
|
||||||
|
case Opcode::UndefU16:
|
||||||
|
case Opcode::UndefU32:
|
||||||
|
case Opcode::UndefU64:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Shader::IR
|
} // namespace Shader::IR
|
||||||
|
|
Loading…
Reference in a new issue