/// <summary>
 /// Fill OUT for basic block B
 /// </summary>
 /// <param name="curBlock">Current basic block</param>
 /// <param name="genKillContainers">Gen/Kill container</param>
 public void FillOutForBasicBlock(OneBasicBlock curBlock,
                                  Dictionary <OneBasicBlock, IExpressionSetsContainer> genKillContainers)
 {
     if (genKillContainers.ContainsKey(curBlock))
     {
         Out[curBlock] = new HashSet <TacNode>(genKillContainers[curBlock].GetFirstSet()
                                               .Union(In[curBlock]
                                                      .Except(genKillContainers[curBlock].GetSecondSet())));
     }
     else
     {
         Out[curBlock] = new HashSet <TacNode>(In[curBlock]);
     }
 }
 /// <summary>
 /// Fill IN for basic block B
 /// </summary>
 /// <param name="curBlock">current basic block</param>
 /// <param name="prevBlock">previous basic block</param>
 public void FillInForBasicBlock(OneBasicBlock curBlock, OneBasicBlock prevBlock)
 {
     In[curBlock] = new HashSet <TacNode>();
     In[curBlock].UnionWith(In[prevBlock]);
     In[curBlock].UnionWith(Out[prevBlock]);
 }