Thread Safety Analysis: update TIL traversal mechanism to allow arbitrary
local contexts. Also includes some minor refactoring.
llvm-svn: 209774
diff --git a/clang/lib/Analysis/ThreadSafetyTIL.cpp b/clang/lib/Analysis/ThreadSafetyTIL.cpp
index f4da8d4..f67cbb9 100644
--- a/clang/lib/Analysis/ThreadSafetyTIL.cpp
+++ b/clang/lib/Analysis/ThreadSafetyTIL.cpp
@@ -48,6 +48,46 @@
}
+unsigned BasicBlock::addPredecessor(BasicBlock *Pred) {
+ unsigned Idx = Predecessors.size();
+ Predecessors.reserveCheck(1, Arena);
+ Predecessors.push_back(Pred);
+ for (Variable *V : Args) {
+ if (Phi* Ph = dyn_cast<Phi>(V->definition())) {
+ Ph->values().reserveCheck(1, Arena);
+ Ph->values().push_back(nullptr);
+ }
+ }
+ return Idx;
+}
+
+void BasicBlock::reservePredecessors(unsigned NumPreds) {
+ Predecessors.reserve(NumPreds, Arena);
+ for (Variable *V : Args) {
+ if (Phi* Ph = dyn_cast<Phi>(V->definition())) {
+ Ph->values().reserve(NumPreds, Arena);
+ }
+ }
+}
+
+void BasicBlock::renumberVars() {
+ unsigned VID = 0;
+ for (Variable *V : Args) {
+ V->setID(BlockID, VID++);
+ }
+ for (Variable *V : Instrs) {
+ V->setID(BlockID, VID++);
+ }
+}
+
+void SCFG::renumberVars() {
+ for (BasicBlock *B : Blocks) {
+ B->renumberVars();
+ }
+}
+
+
+
// If E is a variable, then trace back through any aliases or redundant
// Phi nodes to find the canonical definition.