Implemented End-Of-Path processing.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45554 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/GRConstantPropagation.cpp b/Analysis/GRConstantPropagation.cpp
index ead92d7..d49a27b 100644
--- a/Analysis/GRConstantPropagation.cpp
+++ b/Analysis/GRConstantPropagation.cpp
@@ -177,7 +177,7 @@
void VisitBlkStmt(const BlkStmtEdge& E, VertexTy* PredV);
void VisitStmtBlk(const StmtBlkEdge& E, VertexTy* PredV);
- void ProcessEOP(VertexTy* PredV);
+ void ProcessEOP(CFGBlock* Blk, VertexTy* PredV);
void ProcessStmt(Stmt* S, VertexTy* PredV);
void ProcessTerminator(Stmt* Terminator ,VertexTy* PredV);
@@ -264,7 +264,16 @@
void GRCP::VisitBlkBlk(const BlkBlkEdge& E, GRCP::VertexTy* PredV) {
- const CFGBlock* Blk = E.Dst();
+ CFGBlock* Blk = E.Dst();
+
+ // Check if we are entering the EXIT block.
+ if (Blk == &cfg.getExit()) {
+ assert (cfg.getExit().size() == 0 && "EXIT block cannot contain Stmts.");
+ // Process the End-Of-Path.
+ ProcessEOP(Blk, PredV);
+ return;
+ }
+
// FIXME: we will dispatch to a function that manipulates the state
// at the entrance to a block.
@@ -282,16 +291,7 @@
}
void GRCP::VisitBlkStmt(const BlkStmtEdge& E, GRCP::VertexTy* PredV) {
-
- // Check if we are entering the EXIT block.
- if (E.Src() == &cfg.getExit()) {
- assert (cfg.getExit().size() == 0 && "EXIT block cannot contain Stmts.");
- // Process the End-Of-Path.
- ProcessEOP(PredV);
- return;
- }
-
- // Normal block. Process as usual.
+
if (Stmt* S = E.Dst())
ProcessStmt(S,PredV);
else {
@@ -312,8 +312,11 @@
}
}
-void GRCP::ProcessEOP(GRCP::VertexTy* PredV) {
- assert(false && "Not implemented.");
+void GRCP::ProcessEOP(CFGBlock* Blk, GRCP::VertexTy* PredV) {
+ // FIXME: Perform dispatch to adjust state.
+ VertexTy* V = Graph.getVertex(BlkStmtEdge(Blk,NULL), PredV->getState()).first;
+ V->addPredecessor(PredV);
+ Graph.addEndOfPath(V);
}
void GRCP::ProcessStmt(Stmt* S, GRCP::VertexTy* PredV) {