Introduce a typing refinenement on tagged data
using the 'volatile' qualifier. This should not have any operational consequences
on code, because tags should always be stripped off (giving a non-volatile pointer)
before dereferencing. The new qualification is there to catch some attempts to use
tagged pointers in a context where an untagged pointer is appropriate.

Notably this approach does not catch dereferencing of tagged pointers, but helps
in separating the two concepts a bit.

llvm-svn: 57641
diff --git a/llvm/lib/VMCore/Use.cpp b/llvm/lib/VMCore/Use.cpp
index d96a0e5..5eadaad 100644
--- a/llvm/lib/VMCore/Use.cpp
+++ b/llvm/lib/VMCore/Use.cpp
@@ -127,7 +127,7 @@
 //===----------------------------------------------------------------------===//
 
 struct AugmentedUse : Use {
-  User *ref;
+  volatile User *ref;
   AugmentedUse(); // not implemented
 };
 
@@ -138,12 +138,10 @@
 
 User *Use::getUser() const {
   const Use *End = getImpliedUser();
-  User *She = static_cast<const AugmentedUse*>(End - 1)->ref;
-  She = extractTag<Tag, tagOne>(She)
+  volatile User *She = static_cast<const AugmentedUse*>(End - 1)->ref;
+  return extractTag<Tag, tagOne>(She)
       ? llvm::stripTag<tagOne>(She)
       : reinterpret_cast<User*>(const_cast<Use*>(End));
-
-  return She;
 }
 
 //===----------------------------------------------------------------------===//