From ccb6d1ea0cfc1c9f2e0ea651414ff80610fa12dc Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Sat, 4 May 2013 01:13:05 +0000 Subject: [PATCH] [analyzer; alternate edges] - merge control edges where we descend to a subexpression and pop back out. llvm-svn: 181085 --- clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp index b3c0dac9646d..827bf09b05f3 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -1802,6 +1802,26 @@ static bool optimizeEdges(PathPieces &path, hasChanges = true; continue; } + + // Rule II. + // + // If we have two consecutive control edges where we decend to a + // subexpression and then pop out merge them. + // + // NOTE: this will be limited later in cases where we add barriers + // to prevent this optimization. + // + // For example: + // + // (1.1 -> 1.1.1) -> (1.1.1 -> 1.2) becomes (1.1 -> 1.2). + if (level1 && level2 && + level1 == level4 && + level2 == level3 && PM.getParent(level2) == level1) { + PieceI->setEndLocation(PieceNextI->getEndLocation()); + path.erase(NextI); + hasChanges = true; + continue; + } } // No changes.