================ @@ -3347,10 +3348,37 @@ void MachineVerifier::verifyLiveRangeSegment(const LiveRange &LR, OwnerLI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes); } + bool IsEHa = MF->getMMI().getModule()->getModuleFlag("eh-asynch"); while (true) { assert(LiveInts->isLiveInToMBB(LR, &*MFI)); - // We don't know how to track physregs into a landing pad. - if (!Reg.isVirtual() && MFI->isEHPad()) { + auto IsSEHHandler = [](const MachineBasicBlock &Handler) -> bool { + if (!Handler.isMachineBlockAddressTaken()) + return false; + + for (const User *U : Handler.getBasicBlock()->users()) { + if (!isa<InvokeInst>(U)) + continue; + const Function *Fn = cast<CallBase>(U)->getCalledFunction(); + if (!Fn || !Fn->isIntrinsic()) + continue; + + switch (Fn->getIntrinsicID()) { + default: + continue; + case Intrinsic::seh_scope_begin: + case Intrinsic::seh_scope_end: + case Intrinsic::seh_try_begin: + case Intrinsic::seh_try_end: + return true; + } + } + return false; + }; + + // TODO: we don't know how to track physregs into a landing pad. For async + // EH, the virtual reg lives before scope begin, but we don't know seh scope ---------------- HaohaiWen wrote:
seh_scope_begin/seh_scope_end is lowered to fall through jmp which can be eliminated. e.g. ``` BB0: instA jmp BB1: BB1: invoke llvm.seh.scope.begin to BB2 BB2: instB ``` Those BB0, BB1, BB2 can be optimized to ``` MBB0: EH_LABEL instA EH_LABEL EH_LABEL instB EH_LABEL ``` We don't know which MBB the BB2 is mapped to. We also don't know which EH_LABEL the llvm.seh.scope.begin was located. https://github.com/llvm/llvm-project/pull/76933 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits