<div dir="ltr">Could we get his merged in to 3.8?</div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 12, 2016 at 1:10 PM, Andrew Kaylor via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: akaylor<br>
Date: Fri Feb 12 15:10:16 2016<br>
New Revision: 260733<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=260733&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=260733&view=rev</a><br>
Log:<br>
[WinEH] Prevent EH state numbering from skipping nested cleanup pads that never return<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D17208" rel="noreferrer" target="_blank">http://reviews.llvm.org/D17208</a><br>
<br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/WinEH/wineh-noret-cleanup.ll<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/WinEHPrepare.cpp<br>
<br>
Modified: llvm/trunk/lib/CodeGen/WinEHPrepare.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/WinEHPrepare.cpp?rev=260733&r1=260732&r2=260733&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/WinEHPrepare.cpp?rev=260733&r1=260732&r2=260733&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/WinEHPrepare.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/WinEHPrepare.cpp Fri Feb 12 15:10:16 2016<br>
@@ -257,10 +257,14 @@ static void calculateCXXStateNumbers(Win<br>
         if (auto *InnerCatchSwitch = dyn_cast<CatchSwitchInst>(UserI))<br>
           if (InnerCatchSwitch->getUnwindDest() == CatchSwitch->getUnwindDest())<br>
             calculateCXXStateNumbers(FuncInfo, UserI, CatchLow);<br>
-        if (auto *InnerCleanupPad = dyn_cast<CleanupPadInst>(UserI))<br>
-          if (getCleanupRetUnwindDest(InnerCleanupPad) ==<br>
-              CatchSwitch->getUnwindDest())<br>
+        if (auto *InnerCleanupPad = dyn_cast<CleanupPadInst>(UserI)) {<br>
+          BasicBlock *UnwindDest = getCleanupRetUnwindDest(InnerCleanupPad);<br>
+          // If a nested cleanup pad reports a null unwind destination and the<br>
+          // enclosing catch pad doesn't it must be post-dominated by an<br>
+          // unreachable instruction.<br>
+          if (!UnwindDest || UnwindDest == CatchSwitch->getUnwindDest())<br>
             calculateCXXStateNumbers(FuncInfo, UserI, CatchLow);<br>
+        }<br>
       }<br>
     }<br>
     int CatchHigh = FuncInfo.getLastStateNumber();<br>
@@ -360,10 +364,14 @@ static void calculateSEHStateNumbers(Win<br>
       if (auto *InnerCatchSwitch = dyn_cast<CatchSwitchInst>(UserI))<br>
         if (InnerCatchSwitch->getUnwindDest() == CatchSwitch->getUnwindDest())<br>
           calculateSEHStateNumbers(FuncInfo, UserI, ParentState);<br>
-      if (auto *InnerCleanupPad = dyn_cast<CleanupPadInst>(UserI))<br>
-        if (getCleanupRetUnwindDest(InnerCleanupPad) ==<br>
-            CatchSwitch->getUnwindDest())<br>
+      if (auto *InnerCleanupPad = dyn_cast<CleanupPadInst>(UserI)) {<br>
+        BasicBlock *UnwindDest = getCleanupRetUnwindDest(InnerCleanupPad);<br>
+        // If a nested cleanup pad reports a null unwind destination and the<br>
+        // enclosing catch pad doesn't it must be post-dominated by an<br>
+        // unreachable instruction.<br>
+        if (!UnwindDest || UnwindDest == CatchSwitch->getUnwindDest())<br>
           calculateSEHStateNumbers(FuncInfo, UserI, ParentState);<br>
+      }<br>
     }<br>
   } else {<br>
     auto *CleanupPad = cast<CleanupPadInst>(FirstNonPHI);<br>
<br>
Added: llvm/trunk/test/CodeGen/WinEH/wineh-noret-cleanup.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WinEH/wineh-noret-cleanup.ll?rev=260733&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/WinEH/wineh-noret-cleanup.ll?rev=260733&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/WinEH/wineh-noret-cleanup.ll (added)<br>
+++ llvm/trunk/test/CodeGen/WinEH/wineh-noret-cleanup.ll Fri Feb 12 15:10:16 2016<br>
@@ -0,0 +1,80 @@<br>
+; RUN: sed -e s/.Cxx:// %s | llc -mtriple=x86_64-pc-windows-msvc | FileCheck %s --check-prefix=CXX<br>
+; RUN: sed -e s/.Seh:// %s | llc -mtriple=x86_64-pc-windows-msvc | FileCheck %s --check-prefix=SEH<br>
+<br>
+declare i32 @__CxxFrameHandler3(...)<br>
+declare i32 @__C_specific_handler(...)<br>
+declare void @dummy_filter()<br>
+<br>
+declare void @f(i32)<br>
+<br>
+;Cxx: define void @test() personality i32 (...)* @__CxxFrameHandler3 {<br>
+;Seh: define void @test() personality i32 (...)* @__C_specific_handler {<br>
+entry:<br>
+  invoke void @f(i32 1)<br>
+          to label %invoke.cont unwind label %catch.dispatch<br>
+<br>
+catch.dispatch:<br>
+  %cs1 = catchswitch within none [label %catch.body] unwind label %catch.dispatch.2<br>
+<br>
+catch.body:<br>
+;Cxx: %catch = catchpad within %cs1 [i8* null, i32 u0x40, i8* null]<br>
+;Seh: %catch = catchpad within %cs1 [void ()* @dummy_filter]<br>
+  invoke void @f(i32 2) [ "funclet"(token %catch) ]<br>
+          to label %unreachable unwind label %terminate<br>
+<br>
+terminate:<br>
+  %cleanup = cleanuppad within %catch []<br>
+  call void @f(i32 3) [ "funclet"(token %cleanup) ]<br>
+  unreachable<br>
+<br>
+unreachable:<br>
+  unreachable<br>
+<br>
+invoke.cont:<br>
+  ret void<br>
+<br>
+catch.dispatch.2:<br>
+  %cs2 = catchswitch within none [label %catch.body.2] unwind to caller<br>
+<br>
+catch.body.2:<br>
+;Cxx: %catch2 = catchpad within %cs2 [i8* null, i32 u0x40, i8* null]<br>
+;Seh: %catch2 = catchpad within %cs2 [void ()* @dummy_filter]<br>
+  unreachable<br>
+}<br>
+<br>
+; CXX-LABEL: test:<br>
+; CXX-LABEL: $ip2state$test:<br>
+; CXX-NEXT:   .long   .Lfunc_begin0@IMGREL<br>
+; CXX-NEXT:   .long   -1<br>
+; CXX-NEXT:   .long   .Ltmp0@IMGREL+1<br>
+; CXX-NEXT:   .long   1<br>
+; CXX-NEXT:   .long   .Ltmp1@IMGREL+1<br>
+; CXX-NEXT:   .long   -1<br>
+; CXX-NEXT:   .long   "?catch$3@?0?test@4HA"@IMGREL<br>
+; CXX-NEXT:   .long   2<br>
+; CXX-NEXT:   .long   .Ltmp2@IMGREL+1<br>
+; CXX-NEXT:   .long   3<br>
+; CXX-NEXT:   .long   .Ltmp3@IMGREL+1<br>
+; CXX-NEXT:   .long   2<br>
+; CXX-NEXT:   .long   "?catch$5@?0?test@4HA"@IMGREL<br>
+; CXX-NEXT:   .long   4<br>
+<br>
+; SEH-LABEL: test:<br>
+; SEH-LABEL: .Llsda_begin0:<br>
+; SEH-NEXT:    .long   .Ltmp0@IMGREL+1<br>
+; SEH-NEXT:    .long   .Ltmp1@IMGREL+1<br>
+; SEH-NEXT:    .long   dummy_filter@IMGREL<br>
+; SEH-NEXT:    .long   .LBB0_3@IMGREL<br>
+; SEH-NEXT:    .long   .Ltmp0@IMGREL+1<br>
+; SEH-NEXT:    .long   .Ltmp1@IMGREL+1<br>
+; SEH-NEXT:    .long   dummy_filter@IMGREL<br>
+; SEH-NEXT:    .long   .LBB0_5@IMGREL<br>
+; SEH-NEXT:    .long   .Ltmp2@IMGREL+1<br>
+; SEH-NEXT:    .long   .Ltmp3@IMGREL+1<br>
+; SEH-NEXT:    .long   "?dtor$2@?0?test@4HA"@IMGREL<br>
+; SEH-NEXT:    .long   0<br>
+; SEH-NEXT:    .long   .Ltmp2@IMGREL+1<br>
+; SEH-NEXT:    .long   .Ltmp3@IMGREL+1<br>
+; SEH-NEXT:    .long   dummy_filter@IMGREL<br>
+; SEH-NEXT:    .long   .LBB0_5@IMGREL<br>
+; SEH-NEXT:  .Llsda_end0:<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>