diff --git a/llvm/lib/Analysis/LiveVar/ValueSet.cpp b/llvm/lib/Analysis/LiveVar/ValueSet.cpp
new file mode 100644
index 0000000..d86587c
--- /dev/null
+++ b/llvm/lib/Analysis/LiveVar/ValueSet.cpp
@@ -0,0 +1,63 @@
+
+#include "llvm/Analysis/LiveVar/ValueSet.h"
+
+
+void printValue( const Value *const v)  // func to print a Value 
+{
+  if( (*v).hasName() ) cout << v << "(" << ((*v).getName()) << ") ";
+  //if( (*v).hasName() ) cout <<  ((*v).getName()) << " ";
+  else  cout << v  << " ";
+}
+
+
+//---------------- Method implementations --------------------------
+
+
+ValueSet:: ValueSet() : hash_set<const Value *,  hashFuncValue> () { }
+
+                                                 // for performing two set unions
+bool ValueSet::setUnion( const ValueSet *const set1) {   
+  const_iterator set1it;
+  pair<iterator, bool> result;
+  bool changed = false;
+
+  for( set1it = set1->begin() ; set1it != set1->end(); set1it++) {  
+                                                  // for all all elements in set1
+    result = insert( *set1it );                   // insert to this set
+      if( result.second == true) changed = true;
+  }
+
+  return changed;
+}
+
+
+                                              // for performing set difference
+void ValueSet::setDifference( const ValueSet *const set1, 
+			      const ValueSet *const set2) { 
+
+  const_iterator set1it, set2it;
+  for( set1it = set1->begin() ; set1it != set1->end(); set1it++) {  
+                                             // for all elements in set1
+    iterator set2it = set2->find( *set1it ); // find wether the elem is in set2
+    if( set2it == set2->end() )              // if the element is not in set2
+      insert( *set1it );                     // insert to this set
+  }
+}
+
+
+                                         // for performing set subtraction
+void ValueSet::setSubtract( const ValueSet *const set1) { 
+  const_iterator set1it;
+  for( set1it = set1->begin() ; set1it != set1->end(); set1it++)  
+                                        // for all elements in set1
+    erase( *set1it );                   // erase that element from this set
+}
+
+
+
+
+void ValueSet::printSet()  const {   // for printing a live variable set
+      const_iterator it;
+      for( it = begin() ; it != end(); it++) 
+	printValue( *it );
+}
