Inline indirect function calls that are only capable of calling one function
authorChris Lattner <sabre@nondot.org>
Wed, 17 Apr 2002 03:42:51 +0000 (03:42 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 17 Apr 2002 03:42:51 +0000 (03:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2275 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/ComputeClosure.cpp
lib/Analysis/DataStructure/NodeImpl.cpp

index 67309e8c77d18e9c08d1df2321d8f5355c7893b0..4327baaa80bb8d2f5a914ce180362a3eeb247b16 100644 (file)
@@ -74,12 +74,16 @@ static void ResolveNodeTo(DSNode *Node, const PointerValSet &ToVals) {
 // 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 work on call nodes with direct calls to methods with bodies.
-  return !F->isExternal();
+  // 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();
+  }
+  return false;
 }
 
 
@@ -100,9 +104,8 @@ void FunctionDSGraph::computeClosure(const DataStructure &DS) {
   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";
index 4451f6e59bb120f9475b3f9ec751224e56bff538..66bd8898b1c30802b2fc08c50fbf56347db827db 100644 (file)
@@ -285,7 +285,7 @@ string CallDSNode::getCaption() const {
     OS << "call " << CM->getName();
   else
     OS << "call <indirect>";
-  OS << "|Ret: ";
+  OS << ": ";
   WriteTypeSymbolic(OS, getType(),
                     CI->getParent()->getParent()->getParent());
   return OS.str();