Inline indirect function calls that are only capable of calling one function


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2275 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/DataStructure/ComputeClosure.cpp b/lib/Analysis/DataStructure/ComputeClosure.cpp
index 67309e8..4327baa 100644
--- a/lib/Analysis/DataStructure/ComputeClosure.cpp
+++ b/lib/Analysis/DataStructure/ComputeClosure.cpp
@@ -74,12 +74,16 @@
 // node that we can inline...
 //
 static bool isResolvableCallNode(CallDSNode *CN) {
-  // Only operate on call nodes with direct method calls
-  Function *F = CN->getCall()->getCalledFunction();
-  if (F == 0) return false;
+  // Only operate on call nodes with direct function calls
+  if (CN->getArgValues(0).size() == 1 &&
+      isa<GlobalDSNode>(CN->getArgValues(0)[0].Node)) {
+    GlobalDSNode *GDN = cast<GlobalDSNode>(CN->getArgValues(0)[0].Node);
+    Function *F = cast<Function>(GDN->getGlobal());
 
-  // Only work on call nodes with direct calls to methods with bodies.
-  return !F->isExternal();
+    // Only work on call nodes with direct calls to methods with bodies.
+    return !F->isExternal();
+  }
+  return false;
 }
 
 
@@ -100,9 +104,8 @@
   NI = std::find_if(CallNodes.begin(), CallNodes.end(), isResolvableCallNode);
   while (NI != CallNodes.end()) {
     CallDSNode *CN = *NI;
-    // FIXME: This should work based on the pointer val set of the first arg
-    // link (which is the function to call)
-    Function *F = CN->getCall()->getCalledFunction();
+    GlobalDSNode *FGDN = cast<GlobalDSNode>(CN->getArgValues(0)[0].Node);
+    Function *F = cast<Function>(FGDN->getGlobal());
 
     if (NumInlines++ == 100) {      // CUTE hack huh?
       cerr << "Infinite (?) recursion halted\n";
diff --git a/lib/Analysis/DataStructure/NodeImpl.cpp b/lib/Analysis/DataStructure/NodeImpl.cpp
index 4451f6e..66bd889 100644
--- a/lib/Analysis/DataStructure/NodeImpl.cpp
+++ b/lib/Analysis/DataStructure/NodeImpl.cpp
@@ -285,7 +285,7 @@
     OS << "call " << CM->getName();
   else
     OS << "call <indirect>";
-  OS << "|Ret: ";
+  OS << ": ";
   WriteTypeSymbolic(OS, getType(),
                     CI->getParent()->getParent()->getParent());
   return OS.str();