[release/6.0] Consider finally that jumps to itself as non-empty (#58881)
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Fri, 10 Sep 2021 18:08:53 +0000 (11:08 -0700)
committerGitHub <noreply@github.com>
Fri, 10 Sep 2021 18:08:53 +0000 (11:08 -0700)
* decrement the reference of unreachable finally

* Proper fix

Co-authored-by: Kunal Pathak <Kunal.Pathak@microsoft.com>
src/coreclr/jit/fgehopt.cpp
src/coreclr/jit/jiteh.cpp

index 06abf45..18cb78a 100644 (file)
@@ -99,6 +99,14 @@ PhaseStatus Compiler::fgRemoveEmptyFinally()
             continue;
         }
 
+        // If the finally's block jumps back to itself, then it is not empty.
+        if ((firstBlock->bbJumpKind == BBJ_ALWAYS) && firstBlock->bbJumpDest == firstBlock)
+        {
+            JITDUMP("EH#%u finally has basic block that jumps to itself; skipping.\n", XTnum);
+            XTnum++;
+            continue;
+        }
+
         // Limit for now to finallys that contain only a GT_RETFILT.
         bool isEmpty = true;
 
index da431dd..12e91d0 100644 (file)
@@ -4410,7 +4410,7 @@ void Compiler::fgExtendEHRegionBefore(BasicBlock* block)
 #endif // DEBUG
 
             // The first block of a handler has an artificial extra refcount. Transfer that to the new block.
-            assert(block->bbRefs > 0);
+            noway_assert(block->countOfInEdges() > 0);
             block->bbRefs--;
 
             HBtab->ebdHndBeg = bPrev;
@@ -4459,7 +4459,7 @@ void Compiler::fgExtendEHRegionBefore(BasicBlock* block)
 #endif // DEBUG
 
             // The first block of a filter has an artificial extra refcount. Transfer that to the new block.
-            assert(block->bbRefs > 0);
+            noway_assert(block->countOfInEdges() > 0);
             block->bbRefs--;
 
             HBtab->ebdFilter = bPrev;