PhiFunctions.cs
1 using Ryujinx.Graphics.Shader.IntermediateRepresentation; 2 using System.Collections.Generic; 3 4 namespace Ryujinx.Graphics.Shader.StructuredIr 5 { 6 static class PhiFunctions 7 { 8 public static void Remove(BasicBlock[] blocks) 9 { 10 for (int blkIndex = 0; blkIndex < blocks.Length; blkIndex++) 11 { 12 BasicBlock block = blocks[blkIndex]; 13 14 LinkedListNode<INode> node = block.Operations.First; 15 16 while (node != null) 17 { 18 LinkedListNode<INode> nextNode = node.Next; 19 20 if (node.Value is not PhiNode phi) 21 { 22 node = nextNode; 23 24 continue; 25 } 26 27 Operand temp = OperandHelper.Local(); 28 29 for (int index = 0; index < phi.SourcesCount; index++) 30 { 31 Operand src = phi.GetSource(index); 32 BasicBlock srcBlock = phi.GetBlock(index); 33 34 Operation copyOp = new(Instruction.Copy, temp, src); 35 36 srcBlock.Append(copyOp); 37 } 38 39 Operation copyOp2 = new(Instruction.Copy, phi.Dest, temp); 40 41 nextNode = block.Operations.AddAfter(node, copyOp2).Next; 42 block.Operations.Remove(node); 43 44 node = nextNode; 45 } 46 } 47 } 48 } 49 }