Skip to content

Commit

Permalink
[GVNHoist] computeInsertionPoints() miscalculates IDF
Browse files Browse the repository at this point in the history
Fix for https://bugs.llvm.org/show_bug.cgi?id=38912.

In GVNHoist::computeInsertionPoints() we iterate over the Value
Numbers and calculate the Iterated Dominance Frontiers without
clearing the IDFBlocks vector first. IDFBlocks ends up accumulating
an insane number of basic blocks, which bloats the compilation time
of SemaChecking.cpp with ubsan enabled.

Differential Revision: https://reviews.llvm.org/D51980

llvm-svn: 342055
  • Loading branch information
labrinea committed Sep 12, 2018
1 parent 99359f3 commit 54d56f2
Showing 1 changed file with 2 additions and 4 deletions.
6 changes: 2 additions & 4 deletions llvm/lib/Transforms/Scalar/GVNHoist.cpp
Expand Up @@ -155,7 +155,6 @@ struct CHIArg {

using CHIIt = SmallVectorImpl<CHIArg>::iterator;
using CHIArgs = iterator_range<CHIIt>;
using CHICache = DenseMap<BasicBlock *, SmallPtrSet<Instruction *, 4>>;
using OutValuesType = DenseMap<BasicBlock *, SmallVector<CHIArg, 2>>;
using InValuesType =
DenseMap<BasicBlock *, SmallVector<std::pair<VNType, Instruction *>, 2>>;
Expand Down Expand Up @@ -767,7 +766,6 @@ class GVNHoist {
ReverseIDFCalculator IDFs(*PDT);
OutValuesType OutValue;
InValuesType InValue;
CHICache CachedCHIs;
for (const auto &R : Ranks) {
const SmallVecInsn &V = Map.lookup(R);
if (V.size() < 2)
Expand All @@ -786,6 +784,7 @@ class GVNHoist {
// which currently have dead terminators that are control
// dependence sources of a block which is in NewLiveBlocks.
IDFs.setDefiningBlocks(VNBlocks);
IDFBlocks.clear();
IDFs.calculate(IDFBlocks);

// Make a map of BB vs instructions to be hoisted.
Expand All @@ -798,8 +797,7 @@ class GVNHoist {
for (unsigned i = 0; i < V.size(); ++i) {
CHIArg C = {VN, nullptr, nullptr};
// Ignore spurious PDFs.
if (DT->properlyDominates(IDFB, V[i]->getParent()) &&
CachedCHIs[IDFB].insert(V[i]).second) {
if (DT->properlyDominates(IDFB, V[i]->getParent())) {
OutValue[IDFB].push_back(C);
LLVM_DEBUG(dbgs() << "\nInsertion a CHI for BB: " << IDFB->getName()
<< ", for Insn: " << *V[i]);
Expand Down

0 comments on commit 54d56f2

Please sign in to comment.