|
20 | 20 | #include "llvm/ADT/FoldingSet.h" |
21 | 21 | #include "llvm/ADT/ImmutableSet.h" |
22 | 22 | #include "llvm/ADT/STLExtras.h" |
23 | | -#include "llvm/ADT/SmallSet.h" |
24 | 23 | #include "llvm/ADT/StringExtras.h" |
| 24 | +#include "llvm/ADT/SmallSet.h" |
25 | 25 | #include "llvm/Support/Compiler.h" |
26 | 26 | #include "llvm/Support/raw_ostream.h" |
27 | 27 | #include <algorithm> |
@@ -955,7 +955,18 @@ class SymbolicRangeInferrer |
955 | 955 | } |
956 | 956 |
|
957 | 957 | RangeSet VisitBinaryOperator(RangeSet LHS, BinaryOperator::Opcode Op, |
958 | | - RangeSet RHS, QualType T); |
| 958 | + RangeSet RHS, QualType T) { |
| 959 | + switch (Op) { |
| 960 | + case BO_Or: |
| 961 | + return VisitBinaryOperator<BO_Or>(LHS, RHS, T); |
| 962 | + case BO_And: |
| 963 | + return VisitBinaryOperator<BO_And>(LHS, RHS, T); |
| 964 | + case BO_Rem: |
| 965 | + return VisitBinaryOperator<BO_Rem>(LHS, RHS, T); |
| 966 | + default: |
| 967 | + return infer(T); |
| 968 | + } |
| 969 | + } |
959 | 970 |
|
960 | 971 | //===----------------------------------------------------------------------===// |
961 | 972 | // Ranges and operators |
@@ -1220,29 +1231,6 @@ class SymbolicRangeInferrer |
1220 | 1231 | // Range-based reasoning about symbolic operations |
1221 | 1232 | //===----------------------------------------------------------------------===// |
1222 | 1233 |
|
1223 | | -template <> |
1224 | | -RangeSet SymbolicRangeInferrer::VisitBinaryOperator<BO_NE>(RangeSet LHS, |
1225 | | - RangeSet RHS, |
1226 | | - QualType T) { |
1227 | | - // When both the RangeSets are non-overlapping then all possible pairs of |
1228 | | - // (x, y) in LHS, RHS respectively, will satisfy expression (x != y). |
1229 | | - if ((LHS.getMaxValue() < RHS.getMinValue()) || |
1230 | | - (LHS.getMinValue() > RHS.getMaxValue())) { |
1231 | | - return getTrueRange(T); |
1232 | | - } |
1233 | | - |
1234 | | - // If both RangeSets contain only one Point which is equal then the |
1235 | | - // expression will always return true. |
1236 | | - if ((LHS.getMinValue() == RHS.getMaxValue()) && |
1237 | | - (LHS.getMaxValue() == RHS.getMaxValue()) && |
1238 | | - (LHS.getMinValue() == RHS.getMinValue())) { |
1239 | | - return getFalseRange(T); |
1240 | | - } |
1241 | | - |
1242 | | - // In all other cases, the resulting range cannot be deduced. |
1243 | | - return infer(T); |
1244 | | -} |
1245 | | - |
1246 | 1234 | template <> |
1247 | 1235 | RangeSet SymbolicRangeInferrer::VisitBinaryOperator<BO_Or>(Range LHS, Range RHS, |
1248 | 1236 | QualType T) { |
@@ -1403,23 +1391,6 @@ RangeSet SymbolicRangeInferrer::VisitBinaryOperator<BO_Rem>(Range LHS, |
1403 | 1391 | return {RangeFactory, ValueFactory.getValue(Min), ValueFactory.getValue(Max)}; |
1404 | 1392 | } |
1405 | 1393 |
|
1406 | | -RangeSet SymbolicRangeInferrer::VisitBinaryOperator(RangeSet LHS, |
1407 | | - BinaryOperator::Opcode Op, |
1408 | | - RangeSet RHS, QualType T) { |
1409 | | - switch (Op) { |
1410 | | - case BO_NE: |
1411 | | - return VisitBinaryOperator<BO_NE>(LHS, RHS, T); |
1412 | | - case BO_Or: |
1413 | | - return VisitBinaryOperator<BO_Or>(LHS, RHS, T); |
1414 | | - case BO_And: |
1415 | | - return VisitBinaryOperator<BO_And>(LHS, RHS, T); |
1416 | | - case BO_Rem: |
1417 | | - return VisitBinaryOperator<BO_Rem>(LHS, RHS, T); |
1418 | | - default: |
1419 | | - return infer(T); |
1420 | | - } |
1421 | | -} |
1422 | | - |
1423 | 1394 | //===----------------------------------------------------------------------===// |
1424 | 1395 | // Constraint manager implementation details |
1425 | 1396 | //===----------------------------------------------------------------------===// |
|
0 commit comments