|
|
|
@ -30,9 +30,10 @@ Value RegAlloc::Consume(const IR::Value& value) { |
|
|
|
} |
|
|
|
|
|
|
|
void RegAlloc::Unref(IR::Inst& inst) { |
|
|
|
inst.DestructiveRemoveUsage(); |
|
|
|
if (!inst.HasUses()) { |
|
|
|
Free(inst.Definition<Id>()); |
|
|
|
IR::Inst& value_inst{AliasInst(inst)}; |
|
|
|
value_inst.DestructiveRemoveUsage(); |
|
|
|
if (!value_inst.HasUses()) { |
|
|
|
Free(value_inst.Definition<Id>()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -99,10 +100,7 @@ Value RegAlloc::PeekInst(IR::Inst& inst) { |
|
|
|
} |
|
|
|
|
|
|
|
Value RegAlloc::ConsumeInst(IR::Inst& inst) { |
|
|
|
inst.DestructiveRemoveUsage(); |
|
|
|
if (!inst.HasUses()) { |
|
|
|
Free(inst.Definition<Id>()); |
|
|
|
} |
|
|
|
Unref(inst); |
|
|
|
return PeekInst(inst); |
|
|
|
} |
|
|
|
|
|
|
|
@ -138,4 +136,31 @@ void RegAlloc::Free(Id id) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/*static*/ bool RegAlloc::IsAliased(const IR::Inst& inst) { |
|
|
|
switch (inst.GetOpcode()) { |
|
|
|
case IR::Opcode::Identity: |
|
|
|
case IR::Opcode::BitCastU16F16: |
|
|
|
case IR::Opcode::BitCastU32F32: |
|
|
|
case IR::Opcode::BitCastU64F64: |
|
|
|
case IR::Opcode::BitCastF16U16: |
|
|
|
case IR::Opcode::BitCastF32U32: |
|
|
|
case IR::Opcode::BitCastF64U64: |
|
|
|
return true; |
|
|
|
default: |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/*static*/ IR::Inst& RegAlloc::AliasInst(IR::Inst& inst) { |
|
|
|
IR::Inst* it{&inst}; |
|
|
|
while (IsAliased(*it)) { |
|
|
|
const IR::Value arg{it->Arg(0)}; |
|
|
|
if (arg.IsImmediate()) { |
|
|
|
break; |
|
|
|
} |
|
|
|
it = arg.InstRecursive(); |
|
|
|
} |
|
|
|
return *it; |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace Shader::Backend::GLASM
|