This revision was automatically updated to reflect the committed changes. Closed by commit rL337678: [Analyzer] Quick Fix for exponential execution time when simpilifying complex… (authored by baloghadamsoftware, committed by ). Herald added a subscriber: llvm-commits.
Changed prior to commit: https://reviews.llvm.org/D49536?vs=156225&id=156737#toc Repository: rL LLVM https://reviews.llvm.org/D49536 Files: cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp cfe/trunk/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp cfe/trunk/test/Analysis/constraint_manager_negate_difference.c cfe/trunk/test/Analysis/iterator-range.cpp cfe/trunk/test/Analysis/plist-macros.cpp cfe/trunk/test/Analysis/svalbuilder-rearrange-comparisons.c
Index: cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h =================================================================== --- cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h +++ cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h @@ -318,8 +318,8 @@ /// \sa shouldDisplayNotesAsEvents Optional<bool> DisplayNotesAsEvents; - /// \sa shouldAggressivelySimplifyRelationalComparison - Optional<bool> AggressiveRelationalComparisonSimplification; + /// \sa shouldAggressivelySimplifyBinaryOperation + Optional<bool> AggressiveBinaryOperationSimplification; /// \sa getCTUDir Optional<StringRef> CTUDir; @@ -690,19 +690,19 @@ /// to false when unset. bool shouldDisplayNotesAsEvents(); - /// Returns true if SValBuilder should rearrange comparisons of symbolic - /// expressions which consist of a sum of a symbol and a concrete integer - /// into the format where symbols are on the left-hand side and the integer - /// is on the right. This is only done if both symbols and both concrete - /// integers are signed, greater than or equal to the quarter of the minimum - /// value of the type and less than or equal to the quarter of the maximum - /// value of that type. - /// - /// A + n <REL> B + m becomes A - B <REL> m - n, where A and B symbolic, - /// n and m are integers. <REL> is any of '==', '!=', '<', '<=', '>' or '>='. - /// The rearrangement also happens with '-' instead of '+' on either or both - /// side and also if any or both integers are missing. - bool shouldAggressivelySimplifyRelationalComparison(); + /// Returns true if SValBuilder should rearrange comparisons and additive + /// operations of symbolic expressions which consist of a sum of a symbol and + /// a concrete integer into the format where symbols are on the left-hand + /// side and the integer is on the right. This is only done if both symbols + /// and both concrete integers are signed, greater than or equal to the + /// quarter of the minimum value of the type and less than or equal to the + /// quarter of the maximum value of that type. + /// + /// A + n <OP> B + m becomes A - B <OP> m - n, where A and B symbolic, + /// n and m are integers. <OP> is any of '==', '!=', '<', '<=', '>', '>=', + /// '+' or '-'. The rearrangement also happens with '-' instead of '+' on + // either or both side and also if any or both integers are missing. + bool shouldAggressivelySimplifyBinaryOperation(); /// Returns the directory containing the CTU related files. StringRef getCTUDir(); Index: cfe/trunk/test/Analysis/iterator-range.cpp =================================================================== --- cfe/trunk/test/Analysis/iterator-range.cpp +++ cfe/trunk/test/Analysis/iterator-range.cpp @@ -1,5 +1,5 @@ -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange -analyzer-eagerly-assume -analyzer-config aggressive-relational-comparison-simplification=true -analyzer-config c++-container-inlining=false %s -verify -// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange -analyzer-eagerly-assume -analyzer-config aggressive-relational-comparison-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 %s -verify +// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange -analyzer-eagerly-assume -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=false %s -verify +// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core,cplusplus,alpha.cplusplus.IteratorRange -analyzer-eagerly-assume -analyzer-config aggressive-binary-operation-simplification=true -analyzer-config c++-container-inlining=true -DINLINE=1 %s -verify #include "Inputs/system-header-simulator-cxx.h" Index: cfe/trunk/test/Analysis/plist-macros.cpp =================================================================== --- cfe/trunk/test/Analysis/plist-macros.cpp +++ cfe/trunk/test/Analysis/plist-macros.cpp @@ -637,6 +637,69 @@ // CHECK-NEXT: <key>end</key> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>36</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>36</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>kind</key><string>event</string> +// CHECK-NEXT: <key>location</key> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>36</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <key>ranges</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>36</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>36</integer> +// CHECK-NEXT: <key>col</key><integer>25</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </array> +// CHECK-NEXT: <key>depth</key><integer>0</integer> +// CHECK-NEXT: <key>extended_message</key> +// CHECK-NEXT: <string>Assuming the condition is true</string> +// CHECK-NEXT: <key>message</key> +// CHECK-NEXT: <string>Assuming the condition is true</string> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>kind</key><string>control</string> +// CHECK-NEXT: <key>edges</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>start</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>36</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>36</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: <key>end</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>37</integer> // CHECK-NEXT: <key>col</key><integer>5</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> Index: cfe/trunk/test/Analysis/svalbuilder-rearrange-comparisons.c =================================================================== --- cfe/trunk/test/Analysis/svalbuilder-rearrange-comparisons.c +++ cfe/trunk/test/Analysis/svalbuilder-rearrange-comparisons.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=debug.ExprInspection,core.builtin -analyzer-config aggressive-relational-comparison-simplification=true -verify %s +// RUN: %clang_analyze_cc1 -analyzer-checker=debug.ExprInspection,core.builtin -analyzer-config aggressive-binary-operation-simplification=true -verify %s void clang_analyzer_dump(int x); void clang_analyzer_eval(int x); Index: cfe/trunk/test/Analysis/constraint_manager_negate_difference.c =================================================================== --- cfe/trunk/test/Analysis/constraint_manager_negate_difference.c +++ cfe/trunk/test/Analysis/constraint_manager_negate_difference.c @@ -1,4 +1,4 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=debug.ExprInspection,core.builtin -analyzer-config aggressive-relational-comparison-simplification=true -verify %s +// RUN: %clang_analyze_cc1 -analyzer-checker=debug.ExprInspection,core.builtin -analyzer-config aggressive-binary-operation-simplification=true -verify %s void clang_analyzer_eval(int); Index: cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp @@ -463,12 +463,12 @@ return DisplayNotesAsEvents.getValue(); } -bool AnalyzerOptions::shouldAggressivelySimplifyRelationalComparison() { - if (!AggressiveRelationalComparisonSimplification.hasValue()) - AggressiveRelationalComparisonSimplification = - getBooleanOption("aggressive-relational-comparison-simplification", +bool AnalyzerOptions::shouldAggressivelySimplifyBinaryOperation() { + if (!AggressiveBinaryOperationSimplification.hasValue()) + AggressiveBinaryOperationSimplification = + getBooleanOption("aggressive-binary-operation-simplification", /*Default=*/false); - return AggressiveRelationalComparisonSimplification.getValue(); + return AggressiveBinaryOperationSimplification.getValue(); } StringRef AnalyzerOptions::getCTUDir() { Index: cfe/trunk/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -456,14 +456,17 @@ auto &Opts = StateMgr.getOwningEngine()->getAnalysisManager().getAnalyzerOptions(); + // FIXME: After putting complexity threshold to the symbols we can always + // rearrange additive operations but rearrange comparisons only if + // option is set. + if(!Opts.shouldAggressivelySimplifyBinaryOperation()) + return None; + SymbolRef LSym = Lhs.getAsSymbol(); if (!LSym) return None; - // Always rearrange additive operations but rearrange comparisons only if - // option is set. - if (BinaryOperator::isComparisonOp(Op) && - Opts.shouldAggressivelySimplifyRelationalComparison()) { + if (BinaryOperator::isComparisonOp(Op)) { SingleTy = LSym->getType(); if (ResultTy != SVB.getConditionType()) return None;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits