diff --git a/lib/CodeGen/DwarfEHPrepare.cpp b/lib/CodeGen/DwarfEHPrepare.cpp index 66739316258..651740d377f 100644 --- a/lib/CodeGen/DwarfEHPrepare.cpp +++ b/lib/CodeGen/DwarfEHPrepare.cpp @@ -89,7 +89,7 @@ namespace { /// initializer instead. bool CleanupSelectors(); - bool IsACleanupSelector(IntrinsicInst *); + bool HasCatchAllInSelector(IntrinsicInst *); /// FindAllCleanupSelectors - Find all eh.selector calls that are clean-ups. void FindAllCleanupSelectors(SmallPtrSet &Sels); @@ -188,34 +188,14 @@ FunctionPass *llvm::createDwarfEHPass(const TargetMachine *tm, bool fast) { return new DwarfEHPrepare(tm, fast); } -/// IsACleanupSelector - Return true if the intrinsic instruction is a clean-up -/// selector instruction. -bool DwarfEHPrepare::IsACleanupSelector(IntrinsicInst *II) { - unsigned NumOps = II->getNumOperands(); - bool IsCleanUp = (NumOps == 3); +/// HasCatchAllInSelector - Return true if the intrinsic instruction has a +/// catch-all. +bool DwarfEHPrepare::HasCatchAllInSelector(IntrinsicInst *II) { + if (!EHCatchAllValue) return false; - if (IsCleanUp) - return true; - - if (ConstantInt *CI = dyn_cast(II->getOperand(3))) { - unsigned Val = CI->getZExtValue(); - - if (Val == 0 || Val + 3 == NumOps) { - // If the value is 0 or the selector has only filters in it, then it's - // a cleanup. - return true; - } else { - assert(Val + 3 < NumOps && "Ill-formed eh.selector!"); - - if (Val + 4 == NumOps) { - if (ConstantInt *FinalVal = - dyn_cast(II->getOperand(NumOps - 1))) - return FinalVal->isZero(); - } - } - } - - return false; + unsigned OpIdx = II->getNumOperands() - 1; + GlobalVariable *GV = dyn_cast(II->getOperand(OpIdx)); + return GV == EHCatchAllValue; } /// FindAllCleanupSelectors - Find all eh.selector calls that are clean-ups. @@ -229,7 +209,7 @@ FindAllCleanupSelectors(SmallPtrSet &Sels) { if (II->getParent()->getParent() != F) continue; - if (IsACleanupSelector(II)) + if (!HasCatchAllInSelector(II)) Sels.insert(II); } } @@ -387,7 +367,7 @@ bool DwarfEHPrepare::HandleURoRInvokes() { // need to convert it to a 'catch-all'. for (SmallPtrSet::iterator SI = SelCalls.begin(), SE = SelCalls.end(); SI != SE; ++SI) - if (IsACleanupSelector(*SI)) + if (!HasCatchAllInSelector(*SI)) SelsToConvert.insert(*SI); } }