/// Identify each WCR iterating the body of CompoundStmt.
void TransformWCR::VisitRawCompoundStmt(CompoundStmt *S,
                                        StmtVector &Body, 
                                        StmtVector &WCR) {
  CompoundStmt::body_iterator I, E;
  for (I = S->body_begin(), E = S->body_end(); I != E; ++I) {
    Stmt *stmt = *I;
    if (stmt->hasBarrier()) {
      MergeBodyAndWCR(Body, WCR);
      WCR.clear();
      Body.push_back(VisitStmt(stmt));
    } else {
      if (DeclStmt *DS = dyn_cast<DeclStmt>(stmt)) {
        // If there is a Decl that does not have an init expr, 
        //  it is code-motioned to the Body.
        VisitRawDeclStmt(DS, Body, WCR);
        continue;
      } else if (CompoundStmt *CS = dyn_cast<CompoundStmt>(stmt)) {
        // StmtList is divided into multiple stmts.
        if (CS->isStmtList()) {
          VisitRawCompoundStmt(CS, Body, WCR);
          ASTCtx.Deallocate((void *)CS);
          continue;
        }
      }

      // Most stmts are inserted into the WCR.
      WCR.push_back(stmt);
    }
  }
}