summaryrefslogtreecommitdiffstats
path: root/lib/Analysis/UninitializedValues.cpp
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2011-06-12 15:46:16 +0000
committerdim <dim@FreeBSD.org>2011-06-12 15:46:16 +0000
commitc49018d9cce52d8c9f34b44865ec3ba8e89a1488 (patch)
treec5e9e10bc189de0058aa763c47b9920a8351b7df /lib/Analysis/UninitializedValues.cpp
parent110eaaceddcec790f7e6a5e3bf1261c9aa1e73ab (diff)
downloadFreeBSD-src-c49018d9cce52d8c9f34b44865ec3ba8e89a1488.zip
FreeBSD-src-c49018d9cce52d8c9f34b44865ec3ba8e89a1488.tar.gz
Vendor import of clang trunk r132879:
http://llvm.org/svn/llvm-project/cfe/trunk@132879
Diffstat (limited to 'lib/Analysis/UninitializedValues.cpp')
-rw-r--r--lib/Analysis/UninitializedValues.cpp51
1 files changed, 12 insertions, 39 deletions
diff --git a/lib/Analysis/UninitializedValues.cpp b/lib/Analysis/UninitializedValues.cpp
index 88a2db7..e80e282 100644
--- a/lib/Analysis/UninitializedValues.cpp
+++ b/lib/Analysis/UninitializedValues.cpp
@@ -14,7 +14,7 @@
#include <utility>
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/BitVector.h"
+#include "llvm/ADT/PackedVector.h"
#include "llvm/ADT/DenseMap.h"
#include "clang/AST/Decl.h"
#include "clang/Analysis/CFG.h"
@@ -93,39 +93,8 @@ static bool isAlwaysUninit(const Value v) {
}
namespace {
-class ValueVector {
- llvm::BitVector vec;
-public:
- ValueVector() {}
- ValueVector(unsigned size) : vec(size << 1) {}
- void resize(unsigned n) { vec.resize(n << 1); }
- void merge(const ValueVector &rhs) { vec |= rhs.vec; }
- bool operator!=(const ValueVector &rhs) const { return vec != rhs.vec; }
- void reset() { vec.reset(); }
-
- class reference {
- ValueVector &vv;
- const unsigned idx;
-
- reference(); // Undefined
- public:
- reference(ValueVector &vv, unsigned idx) : vv(vv), idx(idx) {}
- ~reference() {}
-
- reference &operator=(Value v) {
- vv.vec[idx << 1] = (((unsigned) v) & 0x1) ? true : false;
- vv.vec[(idx << 1) | 1] = (((unsigned) v) & 0x2) ? true : false;
- return *this;
- }
- operator Value() {
- unsigned x = (vv.vec[idx << 1] ? 1 : 0) | (vv.vec[(idx << 1) | 1] ? 2 :0);
- return (Value) x;
- }
- };
-
- reference operator[](unsigned idx) { return reference(*this, idx); }
-};
+typedef llvm::PackedVector<Value, 2> ValueVector;
typedef std::pair<ValueVector *, ValueVector *> BVPair;
class CFGBlockValues {
@@ -214,11 +183,15 @@ static BinaryOperator *getLogicalOperatorInChain(const CFGBlock *block) {
if (!b || !b->isLogicalOp())
return 0;
- if (block->pred_size() == 2 &&
- ((block->succ_size() == 2 && block->getTerminatorCondition() == b) ||
- block->size() == 1))
- return b;
-
+ if (block->pred_size() == 2) {
+ if (block->getTerminatorCondition() == b) {
+ if (block->succ_size() == 2)
+ return b;
+ }
+ else if (block->size() == 1)
+ return b;
+ }
+
return 0;
}
@@ -255,7 +228,7 @@ void CFGBlockValues::mergeIntoScratch(ValueVector const &source,
if (isFirst)
scratch = source;
else
- scratch.merge(source);
+ scratch |= source;
}
#if 0
static void printVector(const CFGBlock *block, ValueVector &bv,
OpenPOWER on IntegriCloud