8
8
#endif
9
9
10
10
#include " allocacheck.h" // for alloca
11
+ #include " jitstd/algorithm.h"
11
12
12
13
// Flowgraph Check and Dump Support
13
14
@@ -2181,25 +2182,67 @@ void Compiler::fgTableDispBasicBlock(BasicBlock* block, int ibcColWidth /* = 0 *
2181
2182
2182
2183
void Compiler::fgDispBasicBlocks (BasicBlock* firstBlock, BasicBlock* lastBlock, bool dumpTrees)
2183
2184
{
2184
- BasicBlock* block;
2185
+ // Build vector of blocks in order.
2186
+ //
2187
+ if (fgBBOrder == nullptr )
2188
+ {
2189
+ CompAllocator allocator = getAllocator (CMK_DebugOnly);
2190
+ fgBBOrder = new (allocator) jitstd::vector<BasicBlock*>(allocator);
2191
+ }
2192
+
2193
+ fgBBOrder->reserve (fgBBcount);
2194
+ fgBBOrder->clear ();
2185
2195
2186
- // If any block has IBC data, we add an "IBC weight" column just before the 'IL range' column. This column is as
2187
- // wide as necessary to accommodate all the various IBC weights. It's at least 4 characters wide, to accommodate
2188
- // the "IBC" title and leading space.
2189
2196
int ibcColWidth = 0 ;
2190
- for (block = firstBlock; block != nullptr ; block = block->bbNext )
2197
+
2198
+ for (BasicBlock* block = firstBlock; block != nullptr ; block = block->bbNext )
2191
2199
{
2192
2200
if (block->hasProfileWeight ())
2193
2201
{
2194
2202
int thisIbcWidth = CountDigits (block->bbWeight );
2195
2203
ibcColWidth = max (ibcColWidth, thisIbcWidth);
2196
2204
}
2197
2205
2206
+ fgBBOrder->push_back (block);
2207
+
2198
2208
if (block == lastBlock)
2199
2209
{
2200
2210
break ;
2201
2211
}
2202
2212
}
2213
+
2214
+ bool inDefaultOrder = true ;
2215
+
2216
+ struct fgBBNumCmp
2217
+ {
2218
+ bool operator ()(const BasicBlock* bb1, const BasicBlock* bb2)
2219
+ {
2220
+ return bb1->bbNum < bb2->bbNum ;
2221
+ }
2222
+ };
2223
+
2224
+ struct fgBBIDCmp
2225
+ {
2226
+ bool operator ()(const BasicBlock* bb1, const BasicBlock* bb2)
2227
+ {
2228
+ return bb1->bbID < bb2->bbID ;
2229
+ }
2230
+ };
2231
+
2232
+ // Optionally sort
2233
+ //
2234
+ if (JitConfig.JitDumpFgBlockOrder () == 1 )
2235
+ {
2236
+ jitstd::sort (fgBBOrder->begin (), fgBBOrder->end (), fgBBNumCmp ());
2237
+ inDefaultOrder = false ;
2238
+ }
2239
+ else if (JitConfig.JitDumpFgBlockOrder () == 2 )
2240
+ {
2241
+
2242
+ jitstd::sort (fgBBOrder->begin (), fgBBOrder->end (), fgBBIDCmp ());
2243
+ inDefaultOrder = false ;
2244
+ }
2245
+
2203
2246
if (ibcColWidth > 0 )
2204
2247
{
2205
2248
ibcColWidth = max (ibcColWidth, 3 ) + 1 ; // + 1 for the leading space
@@ -2234,7 +2277,7 @@ void Compiler::fgDispBasicBlocks(BasicBlock* firstBlock, BasicBlock* lastBlock,
2234
2277
2235
2278
// clang-format on
2236
2279
2237
- for (block = firstBlock; block; block = block-> bbNext )
2280
+ for (BasicBlock* block : *fgBBOrder )
2238
2281
{
2239
2282
// First, do some checking on the bbPrev links
2240
2283
if (block->bbPrev )
@@ -2249,7 +2292,7 @@ void Compiler::fgDispBasicBlocks(BasicBlock* firstBlock, BasicBlock* lastBlock,
2249
2292
printf (" bad prev link!\n " );
2250
2293
}
2251
2294
2252
- if (block == fgFirstColdBlock)
2295
+ if (inDefaultOrder && ( block == fgFirstColdBlock) )
2253
2296
{
2254
2297
printf (
2255
2298
" ~~~~~~%*s~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%*s~~~~~~~~~~~~~~~~~~~~~~~~~~%*s~~~~~~~~~~~~~~~~~~~~~~~~"
@@ -2258,7 +2301,7 @@ void Compiler::fgDispBasicBlocks(BasicBlock* firstBlock, BasicBlock* lastBlock,
2258
2301
}
2259
2302
2260
2303
#if defined(FEATURE_EH_FUNCLETS)
2261
- if (block == fgFirstFuncletBB)
2304
+ if (inDefaultOrder && ( block == fgFirstFuncletBB) )
2262
2305
{
2263
2306
printf (
2264
2307
" ++++++%*s+++++++++++++++++++++++++++++++++++++%*s++++++++++++++++++++++++++%*s++++++++++++++++++++++++"
@@ -2282,7 +2325,13 @@ void Compiler::fgDispBasicBlocks(BasicBlock* firstBlock, BasicBlock* lastBlock,
2282
2325
2283
2326
if (dumpTrees)
2284
2327
{
2285
- fgDumpTrees (firstBlock, lastBlock);
2328
+ for (BasicBlock* block : *fgBBOrder)
2329
+ {
2330
+ fgDumpBlock (block);
2331
+ }
2332
+ printf (" \n -----------------------------------------------------------------------------------------------------"
2333
+ " ----"
2334
+ " ----------\n " );
2286
2335
}
2287
2336
}
2288
2337
0 commit comments