return false;
}
+// Remove short edges on the same line less than 3 columns in difference.
+static void removePunyEdges(PathPieces &path,
+ SourceManager &SM,
+ ParentMap &PM) {
+
+ bool erased = false;
+
+ for (PathPieces::iterator I = path.begin(), E = path.end(); I != E;
+ erased ? I : ++I) {
+
+ erased = false;
+
+ PathDiagnosticControlFlowPiece *PieceI =
+ dyn_cast<PathDiagnosticControlFlowPiece>(*I);
+
+ if (!PieceI)
+ continue;
+
+ const Stmt *start = getLocStmt(PieceI->getStartLocation());
+ const Stmt *end = getLocStmt(PieceI->getEndLocation());
+
+ if (!start || !end)
+ continue;
+
+ const Stmt *endParent = PM.getParent(end);
+ if (!endParent)
+ continue;
+
+ if (isConditionForTerminator(end, endParent))
+ continue;
+
+ bool Invalid = false;
+ FullSourceLoc StartL(start->getLocStart(), SM);
+ FullSourceLoc EndL(end->getLocStart(), SM);
+
+ unsigned startLine = StartL.getSpellingLineNumber(&Invalid);
+ if (Invalid)
+ continue;
+
+ unsigned endLine = EndL.getSpellingLineNumber(&Invalid);
+ if (Invalid)
+ continue;
+
+ if (startLine != endLine)
+ continue;
+
+ unsigned startCol = StartL.getSpellingColumnNumber(&Invalid);
+ if (Invalid)
+ continue;
+
+ unsigned endCol = EndL.getSpellingColumnNumber(&Invalid);
+ if (Invalid)
+ continue;
+
+ if (abs(startCol - endCol) <= 2) {
+ PathPieces::iterator PieceToErase = I;
+ ++I;
+ erased = true;
+ path.erase(PieceToErase);
+ continue;
+ }
+ }
+}
+
static bool optimizeEdges(PathPieces &path, SourceManager &SM,
OptimizedCallsSet &OCS,
LocationContextMap &LCM) {
bool hasChanges = false;
const LocationContext *LC = LCM[&path];
assert(LC);
+ ParentMap &PM = LC->getParentMap();
bool isFirst = true;
for (PathPieces::iterator I = path.begin(), E = path.end(); I != E; ) {
continue;
}
- ParentMap &PM = LC->getParentMap();
const Stmt *s1Start = getLocStmt(PieceI->getStartLocation());
const Stmt *s1End = getLocStmt(PieceI->getEndLocation());
const Stmt *level1 = getStmtParent(s1Start, PM);
++I;
}
- // No changes.
+ if (!hasChanges) {
+ // Remove any puny edges left over after primary optimization pass.
+ removePunyEdges(path, SM, PM);
+ }
+
return hasChanges;
}