CompAllocator allocator(getAllocator(CMK_ZeroInit));
LclVarRefCounts refCounts(allocator);
BitVecTraits bitVecTraits(lvaCount, this);
- BitVec zeroInitLocals = BitVecOps::MakeEmpty(&bitVecTraits);
- bool hasGCSafePoint = false;
- bool canThrow = false;
+ BitVec zeroInitLocals = BitVecOps::MakeEmpty(&bitVecTraits);
+ bool hasGCSafePoint = false;
+ bool hasImplicitControlFlow = false;
assert(fgNodeThreading == NodeThreading::AllTrees);
CompAllocator allocator(getAllocator(CMK_ZeroInit));
LclVarRefCounts defsInBlock(allocator);
bool removedTrackedDefs = false;
+ bool hasEHSuccs = block->HasPotentialEHSuccs(this);
+
for (Statement* stmt = block->FirstNonPhiDef(); stmt != nullptr;)
{
Statement* next = stmt->GetNextStmt();
hasGCSafePoint = true;
}
- if ((tree->gtFlags & GTF_EXCEPT) != 0)
- {
- canThrow = true;
- }
+ hasImplicitControlFlow |= hasEHSuccs && ((tree->gtFlags & GTF_EXCEPT) != 0);
switch (tree->gtOper)
{
}
}
- if (!removedExplicitZeroInit && isEntire && (!canThrow || !lclDsc->lvLiveInOutOfHndlr))
+ if (!removedExplicitZeroInit && isEntire &&
+ (!hasImplicitControlFlow || (lclDsc->lvTracked && !lclDsc->lvLiveInOutOfHndlr)))
{
// If compMethodRequiresPInvokeFrame() returns true, lower may later
// insert a call to CORINFO_HELP_INIT_PINVOKE_FRAME which is a gc-safe point.
--- /dev/null
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.aa
+
+// Generated by Fuzzlyn v1.6 on 2023-09-03 15:59:01
+// Run on X64 Windows
+// Seed: 11520325105937570553
+// Reduced from 294.5 KiB to 0.7 KiB in 00:04:32
+// Debug: Outputs False
+// Release: Outputs True
+using System;
+using System.Runtime.CompilerServices;
+using Xunit;
+
+public class Runtime_91576
+{
+ [Fact]
+ public static int TestEntryPoint()
+ {
+ Assert.Throws<NullReferenceException>(() =>
+ {
+ Run(new int[1]);
+ Run(null);
+ });
+
+ return s_result;
+ }
+
+ static int s_result;
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static void Run(int[] l)
+ {
+ bool b = false;
+ try
+ {
+ int result = l[0];
+ b = true;
+ }
+ finally
+ {
+ Check(ref b);
+ }
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ private static void Check(ref bool b)
+ {
+ s_result = b ? 101 : 100;
+ }
+}
+