Index: llvm/lib/Transforms/Scalar/JumpThreading.cpp =================================================================== --- llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -100,6 +100,11 @@ "condition to use to thread over a weaker condition"), cl::init(3), cl::Hidden); +static cl::opt PhiDuplicateThreshold( + "jump-threading-phi-threshold", + cl::desc("Max PHIs in BB to duplicate for jump threading"), cl::init(76), + cl::Hidden); + static cl::opt PrintLVIAfterJumpThreading( "print-lvi-after-jump-threading", cl::desc("Print the LazyValueInfo cache after JumpThreading"), cl::init(false), @@ -518,6 +523,18 @@ Instruction *StopAt, unsigned Threshold) { assert(StopAt->getParent() == BB && "Not an instruction from proper BB?"); + + // Do not duplicate the BB if it has a lot of PHI nodes. + // If a threadable chain is too long then the number of PHI nodes can add up, + // leading to a substantial increase in compile time when rewriting the SSA. + unsigned PhiCount = 0; + for (Instruction &I : *BB) { + if (!isa(&I)) + break; + if (++PhiCount > PhiDuplicateThreshold) + return ~0U; + } + /// Ignore PHI nodes, these will be flattened when duplication happens. BasicBlock::const_iterator I(BB->getFirstNonPHI());