コード例 #1
0
        /// <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();
        }
コード例 #2
0
ファイル: SsaState.cs プロジェクト: gitter-badger/reko
		/// <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();
		}