Be a good little compiler and handle direct calls efficiently, even if there
are beastly ConstantPointerRefs in the way...


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11883 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp
index 6760c37..791a1b4 100644
--- a/lib/Analysis/DataStructure/Local.cpp
+++ b/lib/Analysis/DataStructure/Local.cpp
@@ -465,8 +465,12 @@
 }
 
 void GraphBuilder::visitCallSite(CallSite CS) {
+  Value *Callee = CS.getCalledValue();
+  if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(Callee))
+    Callee = CPR->getValue();
+
   // Special case handling of certain libc allocation functions here.
-  if (Function *F = CS.getCalledFunction())
+  if (Function *F = dyn_cast<Function>(Callee))
     if (F->isExternal())
       switch (F->getIntrinsicID()) {
       case Intrinsic::memmove:
@@ -809,12 +813,11 @@
   if (isPointerType(I->getType()))
     RetVal = getValueDest(*I);
 
-  DSNode *Callee = 0;
-  if (DisableDirectCallOpt || !isa<Function>(CS.getCalledValue())) {
-    Callee = getValueDest(*CS.getCalledValue()).getNode();
-    if (Callee == 0) {
-      std::cerr << "WARNING: Program is calling through a null pointer?\n"
-                << *I;
+  DSNode *CalleeNode = 0;
+  if (DisableDirectCallOpt || !isa<Function>(Callee)) {
+    CalleeNode = getValueDest(*Callee).getNode();
+    if (CalleeNode == 0) {
+      std::cerr << "WARNING: Program is calling through a null pointer?\n"<< *I;
       return;  // Calling a null pointer?
     }
   }
@@ -828,10 +831,10 @@
       Args.push_back(getValueDest(**I));
 
   // Add a new function call entry...
-  if (Callee)
-    FunctionCalls->push_back(DSCallSite(CS, RetVal, Callee, Args));
+  if (CalleeNode)
+    FunctionCalls->push_back(DSCallSite(CS, RetVal, CalleeNode, Args));
   else
-    FunctionCalls->push_back(DSCallSite(CS, RetVal, CS.getCalledFunction(),
+    FunctionCalls->push_back(DSCallSite(CS, RetVal, cast<Function>(Callee),
                                         Args));
 }