/// <summary> /// Given a procedure in SSA form, converts it back to "normal" form. /// </summary> /// <param name="renameVariables"></param> public void ConvertBack(bool renameVariables) { UnSSA unssa = new UnSSA(this); foreach (Block block in Procedure.ControlGraph.Blocks) { for (int st = 0; st < block.Statements.Count; ++st) { Instruction instr = block.Statements[st].Instruction; if (instr is PhiAssignment || instr is DefInstruction) { block.Statements.RemoveAt(st); --st; } else if (renameVariables) { instr.Accept(unssa); } } } // Remove any instructions in the return block, used only // for computation of reaching definitions. Procedure.ExitBlock.Statements.Clear(); }