private void RunClassifyTest(
            string sExp,
            string sidName,
            Action <SsaProcedureBuilder> gen,
            Func <Procedure, ProcedureFlow> mkFlow)
        {
            var m = new SsaProcedureBuilder();

            gen(m);
            var ssa = m.Ssa;

            pf.ProcedureFlows[ssa.Procedure] = mkFlow(ssa.Procedure);
            var urf = new UsedRegisterFinder(
                pf,
                new Procedure[] { ssa.Procedure },
                NullDecompilerEventListener.Instance);
            var sid  = ssa.Identifiers.Single(s => s.Identifier.Name == sidName);
            var flow = urf.Classify(ssa, sid, sid.Identifier.Storage, true);
            var sw   = new StringWriter();

            sw.Write("Used: ");
            sw.Write(string.Join(",", flow));
            var sActual = sw.ToString();

            if (sActual != sExp)
            {
                ssa.Procedure.Dump(true);
                Debug.WriteLine(sActual);
                Assert.AreEqual(sExp, sActual);
            }
        }
        private Procedure RunTest(string sExp, SsaState ssa)
        {
            pf.ProcedureFlows[ssa.Procedure] = new ProcedureFlow(ssa.Procedure);
            var urf = new UsedRegisterFinder(
                pf,
                new Procedure[] { ssa.Procedure },
                NullDecompilerEventListener.Instance);
            var flow = urf.ComputeLiveIn(ssa, true);
            var sw   = new StringWriter();

            sw.Write("Used: ");
            sw.Write(string.Join(",", flow.BitsUsed.OrderBy(p => p.Key.ToString())));
            var sActual = sw.ToString();

            if (sActual != sExp)
            {
                ssa.Procedure.Dump(true);
                Debug.WriteLine(sActual);
                Assert.AreEqual(sExp, sActual);
            }
            return(ssa.Procedure);
        }