diff options
| author | Owen Anderson <resistor@mac.com> | 2008-05-13 23:18:30 +0000 | 
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2008-05-13 23:18:30 +0000 | 
| commit | 17816b321f519d770cae7a4efddb05a4f314cb74 (patch) | |
| tree | 43c16ef63473b92bcf95c98574d04dd93a89c193 | |
| parent | 9fd8b6856867c2dfdfd308816af0fe4f23e3c358 (diff) | |
| download | bcm5719-llvm-17816b321f519d770cae7a4efddb05a4f314cb74.tar.gz bcm5719-llvm-17816b321f519d770cae7a4efddb05a4f314cb74.zip | |
Fix Analysis/BasicAA/pure-const-dce.ll.  This turned out to be a correctness
bug as well as a missed optimization.  We weren't properly checking for local
dependencies before moving on to non-local ones when doing non-local read-only 
call CSE.
llvm-svn: 51082
| -rw-r--r-- | llvm/lib/Transforms/Scalar/GVN.cpp | 39 | 
1 files changed, 38 insertions, 1 deletions
| diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp index 3333ecdc798..c671078587f 100644 --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/lib/Transforms/Scalar/GVN.cpp @@ -441,6 +441,43 @@ uint32_t ValueTable::lookup_or_add(Value* V) {          return nextValueNumber++;        } +      Instruction* local_dep = MD->getDependency(C); +       +      if (local_dep == MemoryDependenceAnalysis::None) { +        valueNumbering.insert(std::make_pair(V, nextValueNumber)); +        return nextValueNumber++; +      } else if (local_dep != MemoryDependenceAnalysis::NonLocal) { +        if (!isa<CallInst>(local_dep)) { +          valueNumbering.insert(std::make_pair(V, nextValueNumber)); +          return nextValueNumber++; +        } +         +        CallInst* local_cdep = cast<CallInst>(local_dep); +         +        if (local_cdep->getCalledFunction() != C->getCalledFunction() || +            local_cdep->getNumOperands() != C->getNumOperands()) { +          valueNumbering.insert(std::make_pair(V, nextValueNumber)); +          return nextValueNumber++; +        } else if (!C->getCalledFunction()) {  +          valueNumbering.insert(std::make_pair(V, nextValueNumber)); +          return nextValueNumber++; +        } else { +          for (unsigned i = 1; i < C->getNumOperands(); ++i) { +            uint32_t c_vn = lookup_or_add(C->getOperand(i)); +            uint32_t cd_vn = lookup_or_add(local_cdep->getOperand(i)); +            if (c_vn != cd_vn) { +              valueNumbering.insert(std::make_pair(V, nextValueNumber)); +              return nextValueNumber++; +            } +          } +         +          uint32_t v = lookup_or_add(local_cdep); +          valueNumbering.insert(std::make_pair(V, v)); +          return v; +        } +      } +       +              DenseMap<BasicBlock*, Value*> deps;        MD->getNonLocalDependency(C, deps);        CallInst* cdep = 0; @@ -488,7 +525,7 @@ uint32_t ValueTable::lookup_or_add(Value* V) {            }          } -        uint32_t v = valueNumbering[cdep]; +        uint32_t v = lookup_or_add(cdep);          valueNumbering.insert(std::make_pair(V, v));          return v;        } | 

