From: Owen Anderson Date: Fri, 22 Jun 2007 18:27:04 +0000 (+0000) Subject: Perform fewer set insertions while calculating ANTIC_IN. This reduces the amount... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=2106f61f239177269f80bcbe58b24c450fb0ae8f;p=oota-llvm.git Perform fewer set insertions while calculating ANTIC_IN. This reduces the amount of time to optimize 403.gcc from 21.9s to 18.2s. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37707 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/GVNPRE.cpp b/lib/Transforms/Scalar/GVNPRE.cpp index a08d179aa29..013d00c8c9a 100644 --- a/lib/Transforms/Scalar/GVNPRE.cpp +++ b/lib/Transforms/Scalar/GVNPRE.cpp @@ -818,20 +818,20 @@ void GVNPRE::buildsets_availout(BasicBlock::iterator I, availNumbers.resize(VN.size()); if (isa(leftValue)) - if (!expNumbers.test(VN.lookup(leftValue)-1)) { + if (!expNumbers.test(VN.lookup(leftValue))) { currExps.insert(leftValue); - expNumbers.set(VN.lookup(leftValue)-1); + expNumbers.set(VN.lookup(leftValue)); } if (isa(rightValue)) - if (!expNumbers.test(VN.lookup(rightValue)-1)) { + if (!expNumbers.test(VN.lookup(rightValue))) { currExps.insert(rightValue); - expNumbers.set(VN.lookup(rightValue)-1); + expNumbers.set(VN.lookup(rightValue)); } - if (!expNumbers.test(VN.lookup(BO)-1)) { + if (!expNumbers.test(VN.lookup(BO))) { currExps.insert(BO); - expNumbers.set(num-1); + expNumbers.set(num); } // Handle cmp ops... @@ -846,19 +846,19 @@ void GVNPRE::buildsets_availout(BasicBlock::iterator I, availNumbers.resize(VN.size()); if (isa(leftValue)) - if (!expNumbers.test(VN.lookup(leftValue)-1)) { + if (!expNumbers.test(VN.lookup(leftValue))) { currExps.insert(leftValue); - expNumbers.set(VN.lookup(leftValue)-1); + expNumbers.set(VN.lookup(leftValue)); } if (isa(rightValue)) - if (!expNumbers.test(VN.lookup(rightValue)-1)) { + if (!expNumbers.test(VN.lookup(rightValue))) { currExps.insert(rightValue); - expNumbers.set(VN.lookup(rightValue)-1); + expNumbers.set(VN.lookup(rightValue)); } - if (!expNumbers.test(VN.lookup(C)-1)) { + if (!expNumbers.test(VN.lookup(C))) { currExps.insert(C); - expNumbers.set(num-1); + expNumbers.set(num); } // Handle unsupported ops @@ -871,9 +871,9 @@ void GVNPRE::buildsets_availout(BasicBlock::iterator I, } if (!I->isTerminator()) - if (!availNumbers.test(VN.lookup(I)-1)) { + if (!availNumbers.test(VN.lookup(I))) { currAvail.insert(I); - availNumbers.set(VN.lookup(I)-1); + availNumbers.set(VN.lookup(I)); } } @@ -921,45 +921,36 @@ unsigned GVNPRE::buildsets_anticin(BasicBlock* BB, SmallPtrSet& currTemps, std::set& visited) { SmallPtrSet& anticIn = anticipatedIn[BB]; - SmallPtrSet old (anticIn.begin(), anticIn.end()); + unsigned old = anticIn.size(); bool defer = buildsets_anticout(BB, anticOut, visited); if (defer) return 0; - - SmallPtrSet S; - for (SmallPtrSet::iterator I = anticOut.begin(), - E = anticOut.end(); I != E; ++I) - if (currTemps.count(*I) == 0) - S.insert(*I); anticIn.clear(); + BitVector numbers(VN.size()); + for (SmallPtrSet::iterator I = anticOut.begin(), + E = anticOut.end(); I != E; ++I) { + anticIn.insert(*I); + numbers.set(VN.lookup_or_add(*I)); + } for (SmallPtrSet::iterator I = currExps.begin(), - E = currExps.end(); I != E; ++I) - if (currTemps.count(*I) == 0) + E = currExps.end(); I != E; ++I) { + if (!numbers.test(VN.lookup_or_add(*I))) { anticIn.insert(*I); + numbers.set(VN.lookup(*I)); + } + } + + for (SmallPtrSet::iterator I = currTemps.begin(), + E = currTemps.end(); I != E; ++I) + anticIn.erase(*I); - BitVector numbers(VN.size()); - for (SmallPtrSet::iterator I = anticIn.begin(), - E = anticIn.end(); I != E; ++I) - numbers.set(VN.lookup(*I)-1); - for (SmallPtrSet::iterator I = S.begin(), E = S.end(); - I != E; ++I) { - // For non-opaque values, we should already have a value numbering. - // However, for opaques, such as constants within PHI nodes, it is - // possible that they have not yet received a number. Make sure they do - // so now. - if (!isa(*I) && !isa(*I)) - VN.lookup_or_add(*I); - if (!numbers.test(VN.lookup(*I)-1)) - anticIn.insert(*I); - } - clean(anticIn); anticOut.clear(); - if (old.size() != anticIn.size()) + if (old != anticIn.size()) return 2; else return 1;