Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Inline fgBuildBlockNumMap to allow using _alloca
  • Loading branch information
BruceForstall committed Dec 9, 2021
commit ccd73cc8db9d629f7d47b212d45c67e097142770
4 changes: 2 additions & 2 deletions src/coreclr/jit/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -5997,6 +5997,7 @@ class Compiler
#endif // DUMP_FLOWGRAPHS

#ifdef DEBUG

void fgDispDoms();
void fgDispReach();
void fgDispBBLiveness(BasicBlock* block);
Expand Down Expand Up @@ -6029,8 +6030,7 @@ class Compiler
bool fgDebugCheckIncomingProfileData(BasicBlock* block);
bool fgDebugCheckOutgoingProfileData(BasicBlock* block);

unsigned* fgBuildBlockNumMap();
#endif
#endif // DEBUG

static bool fgProfileWeightsEqual(weight_t weight1, weight_t weight2);
static bool fgProfileWeightsConsistent(weight_t weight1, weight_t weight2);
Expand Down
76 changes: 23 additions & 53 deletions src/coreclr/jit/fgdiagnostic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3790,9 +3790,29 @@ void Compiler::fgDebugCheckLoopTable()
assert(optLoopTable != nullptr);
}

// Construct a map of increasing block numbers to allow for block number comparisons when block numbers are not
// guaranteed to be in increasing order.
unsigned* blockNumMap = fgBuildBlockNumMap();
// Build a mapping from existing block list number (bbNum) to the block number it would be after the
// blocks are renumbered. This allows making asserts about the relative ordering of blocks using block number
// without actually renumbering the blocks, which would affect non-DEBUG code paths. Note that there may be
// `blockNumMap[bbNum] == 0` if the `bbNum` block was deleted and blocks haven't been renumbered since
// the deletion.

unsigned bbNumMax = compIsForInlining() ? impInlineInfo->InlinerCompiler->fgBBNumMax : fgBBNumMax;

// blockNumMap[old block number] => new block number
size_t blockNumBytes = (bbNumMax + 1) * sizeof(unsigned);
unsigned* blockNumMap = (unsigned*)_alloca(blockNumBytes);
memset(blockNumMap, 0, blockNumBytes);

unsigned newBBnum = 1;
for (BasicBlock* const block : Blocks())
{
if ((block->bbFlags & BBF_REMOVED) == 0)
{
assert(1 <= block->bbNum && block->bbNum <= bbNumMax);
assert(blockNumMap[block->bbNum] == 0); // If this fails, we have two blocks with the same block number.
blockNumMap[block->bbNum] = newBBnum++;
}
}

struct MappedChecks
{
Expand Down Expand Up @@ -4022,55 +4042,5 @@ void Compiler::fgDebugCheckLoopTable()
assert(preHeaderCount == 0);
}

//------------------------------------------------------------------------
// fgBuildBlockNumMap: Build a mapping from existing block list numbers (bbNum)
// to a set of block numbers that would exist after the blocks are renumbered.
// This allows making asserts about the relative ordering of blocks using block
// number without actually renumbering the blocks, which would affect non-DEBUG
// code paths.
//
// Arguments:
// jumpTarget -- [in] bit vector of jump targets found by fgFindJumpTargets
//
// Returns:
// A block number map array `blockNumMap` such that `blockNumMap[bbNum]` for a block is the number the block
// would have if the block list were renumbered. Note that there may be some blockNumMap[x] == 0, for a
// block number 'x' that has been deleted, if the blocks haven't been renumbered since the deletion.
//
unsigned* Compiler::fgBuildBlockNumMap()
{
unsigned bbNumMax = compIsForInlining() ? impInlineInfo->InlinerCompiler->fgBBNumMax : fgBBNumMax;

// blockNumMap[old block number] => new block number
size_t blockNumBytes = (bbNumMax + 1) * sizeof(unsigned);
unsigned* blockNumMap = (unsigned*)_alloca(blockNumBytes);
memset(blockNumMap, 0, blockNumBytes);

unsigned newBBnum = 1;
for (BasicBlock* const block : Blocks())
{
assert((block->bbFlags & BBF_REMOVED) == 0);
assert(1 <= block->bbNum && block->bbNum <= bbNumMax);
assert(blockNumMap[block->bbNum] == 0); // If this fails, we have two blocks with the same block number.
blockNumMap[block->bbNum] = newBBnum++;
}

#if 0 // Useful for debugging, but don't want to put this in the dump all the time
if (verbose)
{
printf("fgVerifyHandlerTab block number map: BB current => BB new\n");
for (unsigned i = 0; i <= bbNumMax; i++)
{
if (blockNumMap[i] != 0)
{
printf(FMT_BB " => " FMT_BB "\n", i, blockNumMap[i]);
}
}
}
#endif

return blockNumMap;
}

/*****************************************************************************/
#endif // DEBUG