Index: lib/Transforms/IPO/HotColdSplitting.cpp =================================================================== --- lib/Transforms/IPO/HotColdSplitting.cpp +++ lib/Transforms/IPO/HotColdSplitting.cpp @@ -110,19 +110,38 @@ return succ_empty(&BB); } +static bool exceptionHandlingFunctions(const CallInst *CI) { + auto F = CI->getCalledFunction(); + if (!F) + return false; + auto FName = F->getName(); + return FName == "__cxa_begin_catch" || + FName == "__cxa_free_exception" || + FName == "__cxa_allocate_exception" || + FName == "__cxa_begin_catch" || + FName == "__cxa_end_catch"; +} + static bool unlikelyExecuted(const BasicBlock &BB) { - if (blockEndsInUnreachable(BB)) + if (blockEndsInUnreachable(BB)) { + LLVM_DEBUG(dbgs() << "\ncold unreachable BB: " << BB); return true; + } // Exception handling blocks are unlikely executed. - if (BB.isEHPad()) + if (BB.isEHPad()) { + LLVM_DEBUG(dbgs() << "\ncold ehpad BB: " << BB); return true; + } for (const Instruction &I : BB) if (const CallInst *CI = dyn_cast(&I)) { // The block is cold if it calls functions tagged as cold or noreturn. if (CI->hasFnAttr(Attribute::Cold) || - CI->hasFnAttr(Attribute::NoReturn)) + CI->hasFnAttr(Attribute::NoReturn) || + exceptionHandlingFunctions(CI)) { + LLVM_DEBUG(dbgs() << "\ncold instruction: " << I); return true; + } // Assume that inline assembly is hot code. if (isa(CI->getCalledValue())) @@ -132,7 +151,7 @@ } static DenseSetBB getHotBlocks(Function &F) { - + LLVM_DEBUG(dbgs() << "\nprocessing Function: " << F.getName()); // Mark all cold basic blocks. DenseSetBB ColdBlocks; for (BasicBlock &BB : F)