@@ -2233,7 +2233,9 @@ class FlowGraphNaturalLoop
2233
2233
bool HasDef (unsigned lclNum);
2234
2234
2235
2235
bool CanDuplicate (INDEBUG(const char ** reason));
2236
+ bool CanDuplicateWithEH (INDEBUG(const char ** reason));
2236
2237
void Duplicate (BasicBlock** insertAfter, BlockToBlockMap* map, weight_t weightScale);
2238
+ void DuplicateWithEH (BasicBlock** insertAfter, BlockToBlockMap* map, weight_t weightScale);
2237
2239
2238
2240
bool MayExecuteBlockMultipleTimesPerIteration (BasicBlock* block);
2239
2241
@@ -2557,6 +2559,29 @@ struct RelopImplicationInfo
2557
2559
bool reverseSense = false ;
2558
2560
};
2559
2561
2562
+ // ------------------------------------------------------------------------
2563
+ // CloneTryInfo
2564
+ //
2565
+ // Describes information needed to clone a try region, and information
2566
+ // produced by cloning that region
2567
+ //
2568
+ struct CloneTryInfo
2569
+ {
2570
+ CloneTryInfo (Compiler* comp);
2571
+
2572
+ // bbID based traits and vector
2573
+ //
2574
+ BitVecTraits Traits;
2575
+ BitVec Visited;
2576
+
2577
+ BlockToBlockMap* Map = nullptr ;
2578
+ jitstd::vector<BasicBlock*>* BlocksToClone = nullptr ;
2579
+ weight_t ProfileScale = 0.0 ;
2580
+ unsigned EHIndexShift = 0 ;
2581
+ bool AddEdges = false ;
2582
+ bool ScaleOriginalBlockProfile = false ;
2583
+ };
2584
+
2560
2585
/*
2561
2586
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2562
2587
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -3001,7 +3026,7 @@ class Compiler
3001
3026
3002
3027
void fgRemoveEHTableEntry (unsigned XTnum);
3003
3028
3004
- EHblkDsc* fgAddEHTableEntry (unsigned XTnum);
3029
+ EHblkDsc* fgTryAddEHTableEntries (unsigned XTnum, unsigned count = 1 , bool deferAdding = false );
3005
3030
3006
3031
void fgSortEHTable ();
3007
3032
@@ -5359,6 +5384,10 @@ class Compiler
5359
5384
5360
5385
PhaseStatus fgCloneFinally ();
5361
5386
5387
+ bool fgCanCloneTryRegion (BasicBlock* tryEntry);
5388
+
5389
+ BasicBlock* fgCloneTryRegion (BasicBlock* tryEntry, CloneTryInfo& info, BasicBlock** insertAfter = nullptr );
5390
+
5362
5391
void fgUpdateACDsBeforeEHTableEntryRemoval (unsigned XTnum);
5363
5392
5364
5393
void fgCleanupContinuation (BasicBlock* continuation);
@@ -12264,6 +12293,13 @@ class EHClauses
12264
12293
assert ((m_begin != nullptr ) || (m_begin == m_end));
12265
12294
}
12266
12295
12296
+ EHClauses (Compiler* comp, EHblkDsc* begin)
12297
+ : m_begin(begin)
12298
+ , m_end(comp->compHndBBtab + comp->compHndBBtabCount)
12299
+ {
12300
+ assert ((m_begin != nullptr ) || (m_begin == m_end));
12301
+ }
12302
+
12267
12303
iterator begin () const
12268
12304
{
12269
12305
return iterator (m_begin);
0 commit comments