aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Shader/StructuredIr/AstOptimizer.cs
diff options
context:
space:
mode:
authorgdk <gab.dark.100@gmail.com>2019-10-13 03:02:07 -0300
committerThog <thog@protonmail.com>2020-01-09 02:13:00 +0100
commit1876b346fea647e8284a66bb6d62c38801035cff (patch)
tree6eeff094298cda84d1613dc5ec0691e51d7b35f1 /Ryujinx.Graphics/Shader/StructuredIr/AstOptimizer.cs
parentf617fb542a0e3d36012d77a4b5acbde7b08902f2 (diff)
Initial work
Diffstat (limited to 'Ryujinx.Graphics/Shader/StructuredIr/AstOptimizer.cs')
-rw-r--r--Ryujinx.Graphics/Shader/StructuredIr/AstOptimizer.cs149
1 files changed, 0 insertions, 149 deletions
diff --git a/Ryujinx.Graphics/Shader/StructuredIr/AstOptimizer.cs b/Ryujinx.Graphics/Shader/StructuredIr/AstOptimizer.cs
deleted file mode 100644
index 0f5392b7..00000000
--- a/Ryujinx.Graphics/Shader/StructuredIr/AstOptimizer.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-using Ryujinx.Graphics.Shader.IntermediateRepresentation;
-using System.Collections.Generic;
-using System.Linq;
-
-using static Ryujinx.Graphics.Shader.StructuredIr.AstHelper;
-
-namespace Ryujinx.Graphics.Shader.StructuredIr
-{
- static class AstOptimizer
- {
- public static void Optimize(StructuredProgramInfo info)
- {
- AstBlock mainBlock = info.MainBlock;
-
- AstBlockVisitor visitor = new AstBlockVisitor(mainBlock);
-
- foreach (IAstNode node in visitor.Visit())
- {
- if (node is AstAssignment assignment && assignment.Destination is AstOperand propVar)
- {
- bool isWorthPropagating = propVar.Uses.Count == 1 || IsWorthPropagating(assignment.Source);
-
- if (propVar.Defs.Count == 1 && isWorthPropagating)
- {
- PropagateExpression(propVar, assignment.Source);
- }
-
- if (propVar.Type == OperandType.LocalVariable && propVar.Uses.Count == 0)
- {
- visitor.Block.Remove(assignment);
-
- info.Locals.Remove(propVar);
- }
- }
- }
-
- RemoveEmptyBlocks(mainBlock);
- }
-
- private static bool IsWorthPropagating(IAstNode source)
- {
- if (!(source is AstOperation srcOp))
- {
- return false;
- }
-
- if (!InstructionInfo.IsUnary(srcOp.Inst))
- {
- return false;
- }
-
- return srcOp.GetSource(0) is AstOperand || srcOp.Inst == Instruction.Copy;
- }
-
- private static void PropagateExpression(AstOperand propVar, IAstNode source)
- {
- IAstNode[] uses = propVar.Uses.ToArray();
-
- foreach (IAstNode useNode in uses)
- {
- if (useNode is AstBlock useBlock)
- {
- useBlock.Condition = source;
- }
- else if (useNode is AstOperation useOperation)
- {
- for (int srcIndex = 0; srcIndex < useOperation.SourcesCount; srcIndex++)
- {
- if (useOperation.GetSource(srcIndex) == propVar)
- {
- useOperation.SetSource(srcIndex, source);
- }
- }
- }
- else if (useNode is AstAssignment useAssignment)
- {
- useAssignment.Source = source;
- }
- }
- }
-
- private static void RemoveEmptyBlocks(AstBlock mainBlock)
- {
- Queue<AstBlock> pending = new Queue<AstBlock>();
-
- pending.Enqueue(mainBlock);
-
- while (pending.TryDequeue(out AstBlock block))
- {
- foreach (IAstNode node in block)
- {
- if (node is AstBlock childBlock)
- {
- pending.Enqueue(childBlock);
- }
- }
-
- AstBlock parent = block.Parent;
-
- if (parent == null)
- {
- continue;
- }
-
- AstBlock nextBlock = Next(block) as AstBlock;
-
- bool hasElse = nextBlock != null && nextBlock.Type == AstBlockType.Else;
-
- bool isIf = block.Type == AstBlockType.If;
-
- if (block.Count == 0)
- {
- if (isIf)
- {
- if (hasElse)
- {
- nextBlock.TurnIntoIf(InverseCond(block.Condition));
- }
-
- parent.Remove(block);
- }
- else if (block.Type == AstBlockType.Else)
- {
- parent.Remove(block);
- }
- }
- else if (isIf && parent.Type == AstBlockType.Else && parent.Count == (hasElse ? 2 : 1))
- {
- AstBlock parentOfParent = parent.Parent;
-
- parent.Remove(block);
-
- parentOfParent.AddAfter(parent, block);
-
- if (hasElse)
- {
- parent.Remove(nextBlock);
-
- parentOfParent.AddAfter(block, nextBlock);
- }
-
- parentOfParent.Remove(parent);
-
- block.TurnIntoElseIf();
- }
- }
- }
- }
-} \ No newline at end of file