[llvm] 94a45a8 - Revert "[Coroutine] Allocas used by StoreInst does not always escape"

Xun Li via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 11 21:09:52 PST 2020


Author: Xun Li
Date: 2020-11-11T21:09:39-08:00
New Revision: 94a45a809872ed8a3e3690459e8c89775e83af0d

URL: https://github.com/llvm/llvm-project/commit/94a45a809872ed8a3e3690459e8c89775e83af0d
DIFF: https://github.com/llvm/llvm-project/commit/94a45a809872ed8a3e3690459e8c89775e83af0d.diff

LOG: Revert "[Coroutine] Allocas used by StoreInst does not always escape"

This reverts commit 8bc7b9278e55c4c8c731e7600a2d146438697964, which landed by accident.

Added: 
    

Modified: 
    llvm/lib/Transforms/Coroutines/CoroFrame.cpp

Removed: 
    llvm/test/Transforms/Coroutines/coro-alloca-06.ll


################################################################################
diff  --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
index 5d44b383bee5..27064d2da5da 100644
--- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
@@ -861,66 +861,12 @@ struct AllocaUseVisitor : PtrUseVisitor<AllocaUseVisitor> {
   }
 
   void visitStoreInst(StoreInst &SI) {
+    // Base visit function will handle escape setting.
+    Base::visitStoreInst(SI);
+
     // Regardless whether the alias of the alloca is the value operand or the
     // pointer operand, we need to assume the alloca is been written.
     handleMayWrite(SI);
-
-    if (SI.getValueOperand() != U->get())
-      return;
-
-    // We are storing the pointer into a memory location, potentially escaping.
-    // As an optimization, we try to detect simple cases where it doesn't
-    // actually escape, for example:
-    //   %ptr = alloca ..
-    //   %addr = alloca ..
-    //   store %ptr, %addr
-    //   %x = load %addr
-    //   ..
-    // If %addr is only used by loading from it, we could simply treat %x as
-    // another alias of %ptr, and not considering %ptr being escaped.
-    auto IsSimpleStoreThenLoad = [&]() {
-      auto *AI = dyn_cast<AllocaInst>(SI.getPointerOperand());
-      // If the memory location we are storing to is not an alloca, it
-      // could be an alias of some other memory locations, which is 
diff icult
-      // to analyze.
-      if (!AI)
-        return false;
-      // StoreAliases contains aliases of the memory location stored into.
-      SmallVector<Instruction *, 4> StoreAliases = {AI};
-      while (!StoreAliases.empty()) {
-        Instruction *I = StoreAliases.back();
-        StoreAliases.pop_back();
-        for (User *U : I->users()) {
-          // If we are loading from the memory location, we are creating an
-          // alias of the original pointer.
-          if (auto *LI = dyn_cast<LoadInst>(U)) {
-            enqueueUsers(*LI);
-            handleAlias(*LI);
-            continue;
-          }
-          // If we are overriding the memory location, the pointer certainly
-          // won't escape.
-          if (auto *S = dyn_cast<StoreInst>(U))
-            if (S->getPointerOperand() == I)
-              continue;
-          if (auto *II = dyn_cast<IntrinsicInst>(U))
-            if (II->isLifetimeStartOrEnd())
-              continue;
-          // BitCastInst creats aliases of the memory location being stored
-          // into.
-          if (auto *BI = dyn_cast<BitCastInst>(U)) {
-            StoreAliases.push_back(BI);
-            continue;
-          }
-          return false;
-        }
-      }
-
-      return true;
-    };
-
-    if (!IsSimpleStoreThenLoad())
-      PI.setEscaped(&SI);
   }
 
   // All mem intrinsics modify the data.

diff  --git a/llvm/test/Transforms/Coroutines/coro-alloca-06.ll b/llvm/test/Transforms/Coroutines/coro-alloca-06.ll
deleted file mode 100644
index 6b2669163cfa..000000000000
--- a/llvm/test/Transforms/Coroutines/coro-alloca-06.ll
+++ /dev/null
@@ -1,81 +0,0 @@
-; Test that in some simple cases allocas will not live on the frame even
-; though their pointers are stored.
-; RUN: opt < %s -coro-split -S | FileCheck %s
-; RUN: opt < %s -passes=coro-split -S | FileCheck %s
-
-%handle = type { i8* }
-
-define i8* @f() "coroutine.presplit"="1" {
-entry:
-  %0 = alloca %"handle", align 8
-  %1 = alloca %"handle"*, align 8
-  %id = call token @llvm.coro.id(i32 0, i8* null, i8* null, i8* null)
-  %size = call i32 @llvm.coro.size.i32()
-  %alloc = call i8* @malloc(i32 %size)
-  %hdl = call i8* @llvm.coro.begin(token %id, i8* %alloc)
-  br label %tricky
-
-tricky:
-  %2 = call i8* @await_suspend()
-  %3 = getelementptr inbounds %"handle", %"handle"* %0, i32 0, i32 0
-  store i8* %2, i8** %3, align 8
-  %4 = bitcast %"handle"** %1 to i8*
-  call void @llvm.lifetime.start.p0i8(i64 8, i8* %4)
-  store %"handle"* %0, %"handle"** %1, align 8
-  %5 = load %"handle"*, %"handle"** %1, align 8
-  %6 = getelementptr inbounds %"handle", %"handle"* %5, i32 0, i32 0
-  %7 = load i8*, i8** %6, align 8
-  %8 = bitcast %"handle"** %1 to i8*
-  call void @llvm.lifetime.end.p0i8(i64 8, i8* %8)
-  br label %finish
-
-finish:
-  %sp1 = call i8 @llvm.coro.suspend(token none, i1 false)
-  switch i8 %sp1, label %suspend [i8 0, label %resume
-  i8 1, label %cleanup]
-resume:
-  br label %cleanup
-
-cleanup:
-  %mem = call i8* @llvm.coro.free(token %id, i8* %hdl)
-  call void @free(i8* %mem)
-  br label %suspend
-
-suspend:
-  call i1 @llvm.coro.end(i8* %hdl, i1 0)
-  ret i8* %hdl
-}
-
-; CHECK:        %f.Frame = type { void (%f.Frame*)*, void (%f.Frame*)*, i1 }
-; CHECK-LABEL: @f(
-; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP0:%.*]] = alloca [[HANDLE:%.*]], align 8
-; CHECK-NEXT:    [[TMP1:%.*]] = alloca %handle*, align 8
-
-; CHECK:         [[TMP2:%.*]] = call i8* @await_suspend()
-; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [[HANDLE]], %handle* [[TMP0]], i32 0, i32 0
-; CHECK-NEXT:    store i8* [[TMP2]], i8** [[TMP3]], align 8
-; CHECK-NEXT:    [[TMP4:%.*]] = bitcast %handle** [[TMP1]] to i8*
-; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 8, i8* [[TMP4]])
-; CHECK-NEXT:    store %handle* [[TMP0]], %handle** [[TMP1]], align 8
-; CHECK-NEXT:    call void @llvm.lifetime.end.p0i8(i64 8, i8* [[TMP4]])
-;
-
-declare i8* @llvm.coro.free(token, i8*)
-declare i32 @llvm.coro.size.i32()
-declare i8  @llvm.coro.suspend(token, i1)
-declare void @llvm.coro.resume(i8*)
-declare void @llvm.coro.destroy(i8*)
-
-declare token @llvm.coro.id(i32, i8*, i8*, i8*)
-declare i1 @llvm.coro.alloc(token)
-declare i8* @llvm.coro.begin(token, i8*)
-declare i1 @llvm.coro.end(i8*, i1)
-
-declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
-declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
-
-declare i8* @await_suspend()
-declare void @print(i32* nocapture)
-declare noalias i8* @malloc(i32)
-declare void @free(i8*)


        


More information about the llvm-commits mailing list