protected APC VisitBlock(APC pc, AElement preCondition, out AElement newPrecondition)
        {
            var pcHead = pc.FirstInBlock();

            newPrecondition = preCondition;

            APC prePC;

            while (CFG.HasSinglePredecessor(pc, out prePC))
            {
                // We found the head!
                if (pc.Equals(pcHead))
                {
                    return(pcHead);
                }

                // nothing to do, kill search
                if (this.Mdriver.BasicFacts.IsUnreachable(pc))
                {
                    Trace("Killing path as pc is unreachable", newPrecondition);

                    newPrecondition = this.NoCondition;
                    return(pc);
                }

                newPrecondition = this.Mdriver.BackwardTransfer(pc, prePC, newPrecondition, this);

                if (this.IsNoCondition(newPrecondition))
                {
                    Trace("Killing path as we the underlyng analysis returned bottom", newPrecondition);
                    return(pc);
                }

                pc = prePC;
            }

            return(pc);
        }