[PATCH] D72540: [WinEH] Ignore lifetime.end PHI nodes in empty cleanuppads

Andy Kaylor via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 23 18:23:22 PST 2020


This revision was automatically updated to reflect the committed changes.
Closed by commit rGc467faf23c7a: [WinEH] Ignore lifetime.end PHI nodes in empty cleanuppads (authored by andrew.w.kaylor).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D72540/new/

https://reviews.llvm.org/D72540

Files:
  llvm/lib/Transforms/Utils/SimplifyCFG.cpp
  llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll


Index: llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll
===================================================================
--- llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll
+++ llvm/test/Transforms/SimplifyCFG/empty-cleanuppad.ll
@@ -458,6 +458,55 @@
   cleanupret from %cp unwind to caller
 }
 
+; CHECK-LABEL: define void @f11(
+;   This case tests the handling of an empty cleanup pad that
+;   contains a lifetime_end intrinsic and does not dominate its
+;   successor.
+; CHECK: entry:
+; CHECK:   invoke void @g()
+; CHECK: invoke.cont:
+; CHECK:   invoke void @g()
+; CHECK: invoke.cont2:
+; CHECK:   invoke void @g()
+; CHECK-NOT: ehcleanup:
+; CHECK-NOT:   phi
+; CHECK-NOT:   cleanuppad
+; CHECK-NOT:   lifetime.end
+; CHECK: catch.dispatch:
+; CHECK:   catchswitch
+; CHECK: catch:
+; CHECK:   catchret
+; CHECK: }
+define void @f11() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
+entry:
+  invoke void @g()
+          to label %invoke.cont unwind label %ehcleanup
+
+invoke.cont:                                      ; preds = %entry
+  invoke void @g()
+          to label %invoke.cont2 unwind label %ehcleanup
+
+invoke.cont2:                                     ; preds = %invoke.cont
+  invoke void @g()
+          to label %return unwind label %catch.dispatch
+
+ehcleanup:                                        ; preds = %invoke.cont, %entry
+  %x = phi i8* [ undef, %invoke.cont ], [ undef, %entry ]
+  %0 = cleanuppad within none []
+  call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %x)
+  cleanupret from %0 unwind label %catch.dispatch
+
+catch.dispatch:                                   ; preds = %ehcleanup, %invoke.cont
+  %cs1 = catchswitch within none [label %catch] unwind to caller
+
+catch:                                            ; preds = %catch.dispatch
+  %1 = catchpad within %cs1 [i8* null, i32 u0x40, i8* null]
+  catchret from %1 to label %return
+
+return:                                           ; preds = %invoke.cont, %catch.cont
+  ret void
+}
+
 %struct.S = type { i8 }
 %struct.S2 = type { i8 }
 declare void @"\01??1S2@@QEAA at XZ"(%struct.S2*)
Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
===================================================================
--- llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -4083,9 +4083,10 @@
       // The iterator must be incremented here because the instructions are
       // being moved to another block.
       PHINode *PN = cast<PHINode>(I++);
-      if (PN->use_empty())
-        // If the PHI node has no uses, just leave it.  It will be erased
-        // when we erase BB below.
+      if (PN->use_empty() || !PN->isUsedOutsideOfBlock(BB))
+        // If the PHI node has no uses or all of its uses are in this basic
+        // block (meaning they are debug or lifetime intrinsics), just leave
+        // it.  It will be erased when we erase BB below.
         continue;
 
       // Otherwise, sink this PHI node into UnwindDest.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D72540.240080.patch
Type: text/x-patch
Size: 3017 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200124/0ffa3583/attachment.bin>


More information about the llvm-commits mailing list