Simplify
authorDevang Patel <dpatel@apple.com>
Mon, 10 Mar 2008 18:22:16 +0000 (18:22 +0000)
committerDevang Patel <dpatel@apple.com>
Mon, 10 Mar 2008 18:22:16 +0000 (18:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48161 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/InlineFunction.cpp

index 9ccc918aca4853d63ca0a9a9a749c9c0efc182e5..87e43e62f5df858130f3cedb7c49c2a0c0a34425 100644 (file)
@@ -22,6 +22,7 @@
 #include "llvm/Analysis/CallGraph.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringExtras.h"
 #include "llvm/Support/CallSite.h"
 using namespace llvm;
 
@@ -531,9 +532,11 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD) {
         unsigned NumRetVals = STy->getNumElements();
         // Create new phi nodes such that phi node number in the PHIs vector
         // match corresponding return value operand number.
+        Instruction *InsertPt = AfterCallBB->begin();
         for (unsigned i = 0; i < NumRetVals; ++i) {
           PHINode *PHI = new PHINode(STy->getElementType(i),
-                                     TheCall->getName(), AfterCallBB->begin());
+                                     TheCall->getName() + "." + utostr(i), 
+                                     InsertPt);
           PHIs.push_back(PHI);
         }
         // TheCall results are used by GetResult instructions. 
@@ -555,25 +558,19 @@ bool llvm::InlineFunction(CallSite CS, CallGraph *CG, const TargetData *TD) {
     // appropriate.
     if (!PHIs.empty()) {
       const Type *RTy = CalledFunc->getReturnType();
-      if (const StructType *STy = dyn_cast<StructType>(RTy)) {
-        unsigned NumRetVals = STy->getNumElements();
-        for (unsigned j = 0; j < NumRetVals; ++j) {
-          PHINode *PHI = PHIs[j];
-          // Each PHI node will receive one value from each return instruction.
-          for(unsigned i = 0, e = Returns.size(); i != e; ++i) {
-            ReturnInst *RI = Returns[i];
-            PHI->addIncoming(RI->getReturnValue(j /*PHI number matches operand number*/), 
-                             RI->getParent());
-          }
-        }
-      } else {
-        for (unsigned i = 0, e = Returns.size(); i != e; ++i) {
+      // There is atleast one return value.
+      unsigned NumRetVals = 1; 
+      if (const StructType *STy = dyn_cast<StructType>(RTy))
+        NumRetVals = STy->getNumElements();
+      for (unsigned j = 0; j < NumRetVals; ++j) {
+        PHINode *PHI = PHIs[j];
+        // Each PHI node will receive one value from each return instruction.
+        for(unsigned i = 0, e = Returns.size(); i != e; ++i) {
           ReturnInst *RI = Returns[i];
-          assert(PHIs.size() == 1 && "Invalid number of PHI nodes");
-          assert(RI->getReturnValue() && "Ret should have value!");
-          assert(RI->getReturnValue()->getType() == PHIs[0]->getType() &&
+          assert(RI->getReturnValue(j)->getType() == PHI->getType() &&
                  "Ret value not consistent in function!");
-          PHIs[0]->addIncoming(RI->getReturnValue(), RI->getParent());
+          PHI->addIncoming(RI->getReturnValue(j /*PHI number matches operand number*/), 
+                           RI->getParent());
         }
       }
     }