From: Ted Kremenek Date: Sat, 4 May 2013 01:13:05 +0000 (+0000) Subject: [analyzer; alternate edges] - merge control edges where we descend to a subexpression... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b9e13d555fc9f3e5515e2b1fa6f720e6f10bb076;p=clang [analyzer; alternate edges] - merge control edges where we descend to a subexpression and pop back out. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@181085 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index b3c0dac964..827bf09b05 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/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.