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  }