private HashSet<VariableDescriptor> GetControlDependencyVariables(string proc, Block b)
        {
            // This method works under the assumption that assume statements
              // relevant to control flow between basic blocks have the "partition" attribute

              HashSet<VariableDescriptor> result = new HashSet<VariableDescriptor>();
              var gotoCmd = b.TransferCmd as GotoCmd;
              if (gotoCmd != null && gotoCmd.labelTargets.Count >= 2) {
            foreach (Block succ in gotoCmd.labelTargets) {
              foreach (Cmd c in succ.Cmds) {
            AssumeCmd a = c as AssumeCmd;
            if (a != null && QKeyValue.FindBoolAttribute(a.Attributes, "partition")) {
              var VarCollector = new VariableCollector();
              VarCollector.VisitExpr(a.Expr);
              result.UnionWith(VarCollector.usedVars.Where(Item => VariableRelevantToAnalysis(Item, proc)).
                Select(Item => MakeDescriptor(proc, Item)));
            }
            else {
              break;
            }
              }
            }
              }
              return result;
        }