Propagate Shader phi nodes with the same source value from all blocks (#3457)
* Propagate Shader phi nodes with the same source value from all incoming blocks * Shader cache version bump
This commit is contained in:
parent
f4c47f3c9a
commit
4523a73f75
2 changed files with 54 additions and 1 deletions
|
@ -21,7 +21,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
|
||||||
private const ushort FileFormatVersionMajor = 1;
|
private const ushort FileFormatVersionMajor = 1;
|
||||||
private const ushort FileFormatVersionMinor = 1;
|
private const ushort FileFormatVersionMinor = 1;
|
||||||
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
|
private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
|
||||||
private const uint CodeGenVersion = 3069;
|
private const uint CodeGenVersion = 3457;
|
||||||
|
|
||||||
private const string SharedTocFileName = "shared.toc";
|
private const string SharedTocFileName = "shared.toc";
|
||||||
private const string SharedDataFileName = "shared.data";
|
private const string SharedDataFileName = "shared.data";
|
||||||
|
|
|
@ -45,6 +45,11 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
|
||||||
|
|
||||||
if (!(node.Value is Operation operation) || isUnused)
|
if (!(node.Value is Operation operation) || isUnused)
|
||||||
{
|
{
|
||||||
|
if (node.Value is PhiNode phi && !isUnused)
|
||||||
|
{
|
||||||
|
isUnused = PropagatePhi(phi);
|
||||||
|
}
|
||||||
|
|
||||||
if (isUnused)
|
if (isUnused)
|
||||||
{
|
{
|
||||||
RemoveNode(block, node);
|
RemoveNode(block, node);
|
||||||
|
@ -101,6 +106,7 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
|
||||||
{
|
{
|
||||||
// Propagate copy source operand to all uses of
|
// Propagate copy source operand to all uses of
|
||||||
// the destination operand.
|
// the destination operand.
|
||||||
|
|
||||||
Operand dest = copyOp.Dest;
|
Operand dest = copyOp.Dest;
|
||||||
Operand src = copyOp.GetSource(0);
|
Operand src = copyOp.GetSource(0);
|
||||||
|
|
||||||
|
@ -118,6 +124,53 @@ namespace Ryujinx.Graphics.Shader.Translation.Optimizations
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool PropagatePhi(PhiNode phi)
|
||||||
|
{
|
||||||
|
// If all phi sources are the same, we can propagate it and remove the phi.
|
||||||
|
|
||||||
|
Operand firstSrc = phi.GetSource(0);
|
||||||
|
|
||||||
|
for (int index = 1; index < phi.SourcesCount; index++)
|
||||||
|
{
|
||||||
|
if (!IsSameOperand(firstSrc, phi.GetSource(index)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// All sources are equal, we can propagate the value.
|
||||||
|
|
||||||
|
Operand dest = phi.Dest;
|
||||||
|
|
||||||
|
INode[] uses = dest.UseOps.ToArray();
|
||||||
|
|
||||||
|
foreach (INode useNode in uses)
|
||||||
|
{
|
||||||
|
for (int index = 0; index < useNode.SourcesCount; index++)
|
||||||
|
{
|
||||||
|
if (useNode.GetSource(index) == dest)
|
||||||
|
{
|
||||||
|
useNode.SetSource(index, firstSrc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsSameOperand(Operand x, Operand y)
|
||||||
|
{
|
||||||
|
if (x.Type != y.Type || x.Value != y.Value)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return x.Type == OperandType.Attribute ||
|
||||||
|
x.Type == OperandType.AttributePerPatch ||
|
||||||
|
x.Type == OperandType.Constant ||
|
||||||
|
x.Type == OperandType.ConstantBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
private static bool PropagatePack(Operation packOp)
|
private static bool PropagatePack(Operation packOp)
|
||||||
{
|
{
|
||||||
// Propagate pack source operands to uses by unpack
|
// Propagate pack source operands to uses by unpack
|
||||||
|
|
Reference in a new issue