aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2007-06-27 17:38:29 +0000
committerOwen Anderson <resistor@mac.com>2007-06-27 17:38:29 +0000
commit68cb52e468df7a828e5dadf6de30713f98d21d1c (patch)
treebd944c921d4d9b3bf0c7047c0c41cb0a2954e817
parent5e4f292e53dc0a94b7f12218935bce55c780653c (diff)
Use cached information that has already been computed to make clean() simpler and faster. This is a small speedup on most cases.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37761 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/GVNPRE.cpp83
1 files changed, 31 insertions, 52 deletions
diff --git a/lib/Transforms/Scalar/GVNPRE.cpp b/lib/Transforms/Scalar/GVNPRE.cpp
index b91dffa379..749ec7ad41 100644
--- a/lib/Transforms/Scalar/GVNPRE.cpp
+++ b/lib/Transforms/Scalar/GVNPRE.cpp
@@ -429,7 +429,7 @@ namespace {
// Helper fuctions
// FIXME: eliminate or document these better
void dump(const SmallPtrSet<Value*, 32>& s) const;
- void clean(SmallPtrSet<Value*, 32>& set);
+ void clean(SmallPtrSet<Value*, 32>& set, BitVector& presentInSet);
Value* find_leader(SmallPtrSet<Value*, 32>& vals,
uint32_t v);
Value* phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ);
@@ -671,7 +671,7 @@ bool GVNPRE::dependsOnInvoke(Value* V) {
/// clean - Remove all non-opaque values from the set whose operands are not
/// themselves in the set, as well as all values that depend on invokes (see
/// above)
-void GVNPRE::clean(SmallPtrSet<Value*, 32>& set) {
+void GVNPRE::clean(SmallPtrSet<Value*, 32>& set, BitVector& presentInSet) {
std::vector<Value*> worklist;
worklist.reserve(set.size());
topo_sort(set, worklist);
@@ -685,69 +685,43 @@ void GVNPRE::clean(SmallPtrSet<Value*, 32>& set) {
User* U = cast<User>(v);
bool lhsValid = !isa<Instruction>(U->getOperand(0));
- if (!lhsValid)
- for (SmallPtrSet<Value*, 32>::iterator I = set.begin(), E = set.end();
- I != E; ++I)
- if (VN.lookup(*I) == VN.lookup(U->getOperand(0))) {
- lhsValid = true;
- break;
- }
+ lhsValid |= presentInSet.test(VN.lookup(U->getOperand(0)));
if (lhsValid)
lhsValid = !dependsOnInvoke(U->getOperand(0));
bool rhsValid = !isa<Instruction>(U->getOperand(1));
- if (!rhsValid)
- for (SmallPtrSet<Value*, 32>::iterator I = set.begin(), E = set.end();
- I != E; ++I)
- if (VN.lookup(*I) == VN.lookup(U->getOperand(1))) {
- rhsValid = true;
- break;
- }
+ rhsValid |= presentInSet.test(VN.lookup(U->getOperand(1)));
if (rhsValid)
rhsValid = !dependsOnInvoke(U->getOperand(1));
- if (!lhsValid || !rhsValid)
+ if (!lhsValid || !rhsValid) {
set.erase(U);
+ presentInSet.flip(VN.lookup(U));
+ }
// Handle ternary ops
} else if (isa<ShuffleVectorInst>(v) || isa<InsertElementInst>(v)) {
User* U = cast<User>(v);
bool lhsValid = !isa<Instruction>(U->getOperand(0));
- if (!lhsValid)
- for (SmallPtrSet<Value*, 32>::iterator I = set.begin(), E = set.end();
- I != E; ++I)
- if (VN.lookup(*I) == VN.lookup(U->getOperand(0))) {
- lhsValid = true;
- break;
- }
+ lhsValid |= presentInSet.test(VN.lookup(U->getOperand(0)));
if (lhsValid)
lhsValid = !dependsOnInvoke(U->getOperand(0));
bool rhsValid = !isa<Instruction>(U->getOperand(1));
- if (!rhsValid)
- for (SmallPtrSet<Value*, 32>::iterator I = set.begin(), E = set.end();
- I != E; ++I)
- if (VN.lookup(*I) == VN.lookup(U->getOperand(1))) {
- rhsValid = true;
- break;
- }
+ rhsValid |= presentInSet.test(VN.lookup(U->getOperand(1)));
if (rhsValid)
rhsValid = !dependsOnInvoke(U->getOperand(1));
bool thirdValid = !isa<Instruction>(U->getOperand(2));
- if (!thirdValid)
- for (SmallPtrSet<Value*, 32>::iterator I = set.begin(), E = set.end();
- I != E; ++I)
- if (VN.lookup(*I) == VN.lookup(U->getOperand(2))) {
- thirdValid = true;
- break;
- }
+ thirdValid |= presentInSet.test(VN.lookup(U->getOperand(2)));
if (thirdValid)
thirdValid = !dependsOnInvoke(U->getOperand(2));
- if (!lhsValid || !rhsValid || !thirdValid)
+ if (!lhsValid || !rhsValid || !thirdValid) {
set.erase(U);
+ presentInSet.flip(VN.lookup(U));
+ }
}
}
}
@@ -1042,17 +1016,18 @@ unsigned GVNPRE::buildsets_anticin(BasicBlock* BB,
if (defer)
return 0;
-
-
anticIn.clear();
BitVector numbers(VN.size());
for (SmallPtrSet<Value*, 32>::iterator I = anticOut.begin(),
E = anticOut.end(); I != E; ++I) {
- anticIn.insert(*I);
unsigned num = VN.lookup_or_add(*I);
numbers.resize(VN.size());
- numbers.set(num);
+
+ if (isa<Instruction>(*I)) {
+ anticIn.insert(*I);
+ numbers.set(num);
+ }
}
for (SmallPtrSet<Value*, 32>::iterator I = currExps.begin(),
E = currExps.end(); I != E; ++I) {
@@ -1063,19 +1038,17 @@ unsigned GVNPRE::buildsets_anticin(BasicBlock* BB,
}
for (SmallPtrSet<Value*, 32>::iterator I = currTemps.begin(),
- E = currTemps.end(); I != E; ++I)
+ E = currTemps.end(); I != E; ++I) {
anticIn.erase(*I);
+ numbers.flip(VN.lookup(*I));
+ }
- clean(anticIn);
+ clean(anticIn, numbers);
+ anticOut.clear();
- if (old != anticIn.size()) {
- DOUT << "OLD: " << old << "\n";
- DOUT << "NEW: " << anticIn.size() << "\n";
- DOUT << "ANTIC_OUT: " << anticOut.size() << "\n";
- anticOut.clear();
+ if (old != anticIn.size())
return 2;
- } else
- anticOut.clear();
+ else
return 1;
}
@@ -1392,6 +1365,12 @@ bool GVNPRE::runOnFunction(Function &F) {
// This phase calculates the AVAIL_OUT and ANTIC_IN sets
buildsets(F);
+ for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) {
+ DOUT << "ANTIC_IN: " << FI->getName() << "\n";
+ dump(anticipatedIn[FI]);
+ DOUT << "\n\n";
+ }
+
// Phase 2: Insert
// This phase inserts values to make partially redundant values
// fully redundant