@@ -517,11 +517,28 @@ int WinEHStatePass::getBaseStateForBB(
517
517
return BaseState;
518
518
}
519
519
520
+ static bool isIntrinsic (const CallBase &Call, Intrinsic::ID ID) {
521
+ const Function *CF = Call.getCalledFunction ();
522
+ return CF && CF->isIntrinsic () && CF->getIntrinsicID () == ID;
523
+ }
524
+
525
+ static bool isSehScopeEnd (const CallBase &Call) {
526
+ return isIntrinsic (Call, Intrinsic::seh_scope_end);
527
+ }
528
+
529
+ static bool isSehScopeBegin (const CallBase &Call) {
530
+ return isIntrinsic (Call, Intrinsic::seh_scope_begin);
531
+ }
532
+
520
533
// Calculate the state a call-site is in.
521
534
int WinEHStatePass::getStateForCall (
522
535
DenseMap<BasicBlock *, ColorVector> &BlockColors, WinEHFuncInfo &FuncInfo,
523
536
CallBase &Call) {
524
537
if (auto *II = dyn_cast<InvokeInst>(&Call)) {
538
+ if (isSehScopeEnd (*II)) {
539
+ return getBaseStateForBB (BlockColors, FuncInfo, II->getNormalDest ());
540
+ }
541
+
525
542
// Look up the state number of the EH pad this unwinds to.
526
543
assert (FuncInfo.InvokeStateMap .count (II) && " invoke has no state!" );
527
544
return FuncInfo.InvokeStateMap [II];
@@ -608,22 +625,9 @@ static int getSuccState(DenseMap<BasicBlock *, int> &InitialStates, Function &F,
608
625
return CommonState;
609
626
}
610
627
611
- static bool isIntrinsic (const CallBase &Call, Intrinsic::ID ID) {
612
- const Function *CF = Call.getCalledFunction ();
613
- return CF && CF->isIntrinsic () && CF->getIntrinsicID () == ID;
614
- }
615
-
616
- static bool isSehScopeEnd (const CallBase &Call) {
617
- return isIntrinsic (Call, Intrinsic::seh_scope_end);
618
- }
619
-
620
- static bool isSehScopeBegin (const CallBase &Call) {
621
- return isIntrinsic (Call, Intrinsic::seh_scope_begin);
622
- }
623
-
624
628
bool WinEHStatePass::isStateStoreNeeded (EHPersonality Personality,
625
629
CallBase &Call) {
626
- if (isSehScopeBegin (Call)) {
630
+ if (isSehScopeBegin (Call) || isSehScopeEnd (Call) ) {
627
631
return true ;
628
632
}
629
633
@@ -663,8 +667,6 @@ void WinEHStatePass::addStateStores(Function &F, WinEHFuncInfo &FuncInfo) {
663
667
DenseMap<BasicBlock *, int > InitialStates;
664
668
// FinalStates yields the state of the last call-site for a BasicBlock.
665
669
DenseMap<BasicBlock *, int > FinalStates;
666
- // SEH scope end target blocks
667
- SmallPtrSet<BasicBlock *, 4 > ScopeEndBlocks;
668
670
// Worklist used to revisit BasicBlocks with indeterminate
669
671
// Initial/Final-States.
670
672
std::deque<BasicBlock *> Worklist;
@@ -676,15 +678,7 @@ void WinEHStatePass::addStateStores(Function &F, WinEHFuncInfo &FuncInfo) {
676
678
InitialState = FinalState = ParentBaseState;
677
679
for (Instruction &I : *BB) {
678
680
auto *Call = dyn_cast<CallBase>(&I);
679
- if (!Call)
680
- continue ;
681
-
682
- if (isSehScopeEnd (*Call)) {
683
- auto *Invoke = cast<InvokeInst>(Call);
684
- ScopeEndBlocks.insert (Invoke->getNormalDest ());
685
- }
686
-
687
- if (!isStateStoreNeeded (Personality, *Call))
681
+ if (!Call || !isStateStoreNeeded (Personality, *Call))
688
682
continue ;
689
683
690
684
int State = getStateForCall (BlockColors, FuncInfo, *Call);
@@ -737,12 +731,6 @@ void WinEHStatePass::addStateStores(Function &F, WinEHFuncInfo &FuncInfo) {
737
731
FinalStates.insert ({BB, SuccState});
738
732
}
739
733
740
- // Insert state restores after SEH scope ends
741
- for (BasicBlock *BB : ScopeEndBlocks) {
742
- int state = getBaseStateForBB (BlockColors, FuncInfo, BB);
743
- insertStateNumberStore (BB->getFirstNonPHI (), state);
744
- }
745
-
746
734
// Finally, insert state stores before call-sites which transition us to a new
747
735
// state.
748
736
for (BasicBlock *BB : RPOT) {
0 commit comments