Added main transfer function support for unary operator "!".


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46815 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/GRConstants.cpp b/Analysis/GRConstants.cpp
index a9371ee..2b44bf7 100644
--- a/Analysis/GRConstants.cpp
+++ b/Analysis/GRConstants.cpp
@@ -626,6 +626,28 @@
         break;
       }
         
+      case UnaryOperator::LNot: {
+        // C99 6.5.3.3: "The expression !E is equivalent to (0==E)."
+        //
+        //  Note: technically we do "E == 0", but this is the same in the
+        //    transfer functions as "0 == E".
+        
+        RValue V1 = GetValue(St, U->getSubExpr());
+        
+        if (isa<LValue>(V1)) {
+          lval::ConcreteInt V2(ValMgr.getValue(0, U->getSubExpr()->getType()));
+          Nodify(Dst, U, N1, SetValue(St, U,
+                                      cast<LValue>(V1).EQ(ValMgr, V2)));
+        }
+        else {
+          nonlval::ConcreteInt V2(ValMgr.getZeroWithPtrWidth());
+          Nodify(Dst, U, N1, SetValue(St, U,
+                                      cast<NonLValue>(V1).EQ(ValMgr, V2)));
+        }
+        
+        break;
+      }
+        
       case UnaryOperator::AddrOf: {
         const LValue& L1 = GetLValue(St, U->getSubExpr());
         Nodify(Dst, U, N1, SetValue(St, U, L1));