[CoroSplit][NewPM] Don't call LazyCallGraph functions to split when no clones
authorArthur Eubanks <aeubanks@google.com>
Thu, 7 Jan 2021 20:45:23 +0000 (12:45 -0800)
committerArthur Eubanks <aeubanks@google.com>
Thu, 7 Jan 2021 22:06:35 +0000 (14:06 -0800)
Apparently there can be no clones, as happens in
coro-retcon-unreachable.ll.

The alternative is to allow no split functions in
addSplitRefRecursiveFunctions(), but it seems better to have the caller
make sure it's not accidentally splitting no functions out.

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D94258

llvm/lib/Transforms/Coroutines/CoroSplit.cpp
llvm/test/Transforms/Coroutines/coro-retcon-unreachable.ll

index 6fd894d..e0bee13 100644 (file)
@@ -1748,24 +1748,26 @@ static void updateCallGraphAfterCoroutineSplit(
     End->eraseFromParent();
   }
 
-  switch (Shape.ABI) {
-  case coro::ABI::Switch:
-    // Each clone in the Switch lowering is independent of the other clones. Let
-    // the LazyCallGraph know about each one separately.
-    for (Function *Clone : Clones)
-      CG.addSplitFunction(N.getFunction(), *Clone);
-    break;
-  case coro::ABI::Async:
-  case coro::ABI::Retcon:
-  case coro::ABI::RetconOnce:
-    // Each clone in the Async/Retcon lowering references of the other clones.
-    // Let the LazyCallGraph know about all of them at once.
-    CG.addSplitRefRecursiveFunctions(N.getFunction(), Clones);
-    break;
-  }
+  if (!Clones.empty()) {
+    switch (Shape.ABI) {
+    case coro::ABI::Switch:
+      // Each clone in the Switch lowering is independent of the other clones.
+      // Let the LazyCallGraph know about each one separately.
+      for (Function *Clone : Clones)
+        CG.addSplitFunction(N.getFunction(), *Clone);
+      break;
+    case coro::ABI::Async:
+    case coro::ABI::Retcon:
+    case coro::ABI::RetconOnce:
+      // Each clone in the Async/Retcon lowering references of the other clones.
+      // Let the LazyCallGraph know about all of them at once.
+      CG.addSplitRefRecursiveFunctions(N.getFunction(), Clones);
+      break;
+    }
 
-  // Let the CGSCC infra handle the changes to the original function.
-  updateCGAndAnalysisManagerForCGSCCPass(CG, C, N, AM, UR, FAM);
+    // Let the CGSCC infra handle the changes to the original function.
+    updateCGAndAnalysisManagerForCGSCCPass(CG, C, N, AM, UR, FAM);
+  }
 
   // Do some cleanup and let the CGSCC infra see if we've cleaned up any edges
   // to the split functions.
index 27ee2fd..4a1c440 100644 (file)
@@ -1,4 +1,5 @@
 ; RUN: opt < %s -coro-early -coro-split -S | FileCheck %s
+; RUN: opt < %s -passes='function(coro-early),cgscc(coro-split)' -S | FileCheck %s
 target datalayout = "E-p:64:64"
 
 %swift.type = type { i64 }