diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index ba7f8b37d83..3333ecdc798 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -443,7 +443,7 @@ uint32_t ValueTable::lookup_or_add(Value* V) { DenseMap deps; MD->getNonLocalDependency(C, deps); - Value* dep = 0; + CallInst* cdep = 0; for (DenseMap::iterator I = deps.begin(), E = deps.end(); I != E; ++I) { @@ -453,22 +453,24 @@ uint32_t ValueTable::lookup_or_add(Value* V) { return nextValueNumber++; } else if (I->second != MemoryDependenceAnalysis::NonLocal) { if (DT->dominates(I->first, C->getParent())) { - dep = I->second; + if (CallInst* CD = dyn_cast(I->second)) + cdep = CD; + else { + valueNumbering.insert(std::make_pair(V, nextValueNumber)); + return nextValueNumber++; + } } else { valueNumbering.insert(std::make_pair(V, nextValueNumber)); - return nextValueNumber++; } } } - if (!dep || !isa(dep)) { + if (!cdep) { valueNumbering.insert(std::make_pair(V, nextValueNumber)); return nextValueNumber++; } - CallInst* cdep = cast(dep); - if (cdep->getCalledFunction() != C->getCalledFunction() || cdep->getNumOperands() != C->getNumOperands()) { valueNumbering.insert(std::make_pair(V, nextValueNumber));