diff --git a/src/coreclr/jit/redundantbranchopts.cpp b/src/coreclr/jit/redundantbranchopts.cpp index 55568c3c74313..6c96e96d5f761 100644 --- a/src/coreclr/jit/redundantbranchopts.cpp +++ b/src/coreclr/jit/redundantbranchopts.cpp @@ -106,9 +106,11 @@ bool Compiler::optRedundantBranch(BasicBlock* const block) // Walk up the dom tree and see if any dominating block has branched on // exactly this tree's VN... // - BasicBlock* prevBlock = block; - BasicBlock* domBlock = block->bbIDom; - int relopValue = -1; + BasicBlock* prevBlock = block; + BasicBlock* domBlock = block->bbIDom; + int relopValue = -1; + unsigned matchCount = 0; + const unsigned matchLimit = 4; if (domBlock == nullptr) { @@ -140,6 +142,16 @@ bool Compiler::optRedundantBranch(BasicBlock* const block) // if (domCmpVN == tree->GetVN(VNK_Liberal)) { + // If we have a long skinny dominator tree we may scale poorly, + // and in particular reachability (below) is costly. Give up if + // we've matched a few times and failed to optimize. + // + if (++matchCount > matchLimit) + { + JITDUMP("Bailing out; %d matches found w/o optimizing\n", matchCount); + return false; + } + // The compare in "tree" is redundant. // Is there a unique path from the dominating compare? //