Fix InstCombine/2004-01-13-InstCombineInvokePHI.ll, which also fixes lots
authorChris Lattner <sabre@nondot.org>
Wed, 14 Jan 2004 06:06:08 +0000 (06:06 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 14 Jan 2004 06:06:08 +0000 (06:06 +0000)
of C++ programs in Shootout-C++, including lists1 and moments, etc

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10845 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 14e2c70a8c9b6b1495c2e8eab931fa2feb534fd0..bc9558e8db140284a4fdb3deac598f92ae2185cf 100644 (file)
@@ -1821,10 +1821,26 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
   const FunctionType *FT = Callee->getFunctionType();
   const Type *OldRetTy = Caller->getType();
 
-  if (Callee->isExternal() &&
-      !OldRetTy->isLosslesslyConvertibleTo(FT->getReturnType()) &&
-      !Caller->use_empty())
-    return false;   // Cannot transform this return value...
+  // Check to see if we are changing the return type...
+  if (OldRetTy != FT->getReturnType()) {
+    if (Callee->isExternal() &&
+        !OldRetTy->isLosslesslyConvertibleTo(FT->getReturnType()) &&
+        !Caller->use_empty())
+      return false;   // Cannot transform this return value...
+
+    // If the callsite is an invoke instruction, and the return value is used by
+    // a PHI node in a successor, we cannot change the return type of the call
+    // because there is no place to put the cast instruction (without breaking
+    // the critical edge).  Bail out in this case.
+    if (!Caller->use_empty())
+      if (InvokeInst *II = dyn_cast<InvokeInst>(Caller))
+        for (Value::use_iterator UI = II->use_begin(), E = II->use_end();
+             UI != E; ++UI)
+          if (PHINode *PN = dyn_cast<PHINode>(*UI))
+            if (PN->getParent() == II->getNormalDest() ||
+                PN->getParent() == II->getExceptionalDest())
+              return false;
+  }
 
   unsigned NumActualArgs = unsigned(CS.arg_end()-CS.arg_begin());
   unsigned NumCommonArgs = std::min(FT->getNumParams(), NumActualArgs);