Previously, removeUnreachableBlocks still returns true (which indicates the CFG is changed) even when all the unreachable blocks found is awaiting deletion in the DDT class.
This makes code pattern like
// Code modified from lib/Transforms/Scalar/SimplifyCFGPass.cpp
bool EverChanged = removeUnreachableBlocks(F, nullptr, DDT);
...
do {
EverChanged = someMightHappenModifications();
EverChanged |= removeUnreachableBlocks(F, nullptr, DDT);
} while (EverChanged);become a dead loop.
Fix this by detecting whether a BasicBlock is already awaiting deletion.
I don't think it's valid to branch to entry (the entry block is supposed to have no predecessors).