summaryrefslogtreecommitdiff
path: root/lib/Transforms/Scalar/GVN.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-11-27 08:25:10 +0000
committerChris Lattner <sabre@nondot.org>2009-11-27 08:25:10 +0000
commit616613d7a4ddc7cefce53b2bfe3fdcdec6b032c2 (patch)
treea21c2231efa530622c802a2907533ef4beb023c4 /lib/Transforms/Scalar/GVN.cpp
parentd280d85791c1fad9e625a5e2f472092b0c81c14e (diff)
downloadllvm-616613d7a4ddc7cefce53b2bfe3fdcdec6b032c2.tar.gz
llvm-616613d7a4ddc7cefce53b2bfe3fdcdec6b032c2.tar.bz2
llvm-616613d7a4ddc7cefce53b2bfe3fdcdec6b032c2.tar.xz
teach GVN's load PRE to insert computations of the address in predecessors
where it is not available. It's unclear how to get this inserted computation into GVN's scalar availability sets, Owen, help? :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89997 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/GVN.cpp')
-rw-r--r--lib/Transforms/Scalar/GVN.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp
index e878050364..72eb9002ce 100644
--- a/lib/Transforms/Scalar/GVN.cpp
+++ b/lib/Transforms/Scalar/GVN.cpp
@@ -1425,32 +1425,40 @@ bool GVN::processNonLocalLoad(LoadInst *LI,
assert(UnavailablePred != 0 &&
"Fully available value should be eliminated above!");
+ // We don't currently handle critical edges :(
+ if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
+ DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
+ << UnavailablePred->getName() << "': " << *LI << '\n');
+ return false;
+ }
+
// If the loaded pointer is PHI node defined in this block, do PHI translation
// to get its value in the predecessor.
Value *LoadPtr = MD->PHITranslatePointer(LI->getOperand(0),
LoadBB, UnavailablePred, TD);
+ // Make sure the value is live in the predecessor. MemDep found a computation
+ // of LPInst with the right value, but that does not dominate UnavailablePred,
+ // then we can't use it.
+ if (Instruction *LPInst = dyn_cast_or_null<Instruction>(LoadPtr))
+ if (!DT->dominates(LPInst->getParent(), UnavailablePred))
+ LoadPtr = 0;
+
+ // If we don't have a computation of this phi translated value, try to insert
+ // one.
if (LoadPtr == 0) {
- DEBUG(errs() << "COULDN'T PRE LOAD BECAUSE PTR CAN'T BE PHI TRANSLATED: "
- << *LI->getOperand(0) << '\n' << *LI << "\n");
- return false;
- }
-
- // Make sure the value is live in the predecessor. If it was defined by a
- // non-PHI instruction in this block, we don't know how to recompute it above.
- if (Instruction *LPInst = dyn_cast<Instruction>(LoadPtr))
- if (!DT->dominates(LPInst->getParent(), UnavailablePred)) {
- DEBUG(errs() << "COULDN'T PRE LOAD BECAUSE PTR DOES NOT DOMINATE PRED: "
- << *LPInst << '\n' << *LI << "\n");
+ LoadPtr = MD->InsertPHITranslatedPointer(LI->getOperand(0),
+ LoadBB, UnavailablePred, TD);
+ if (LoadPtr == 0) {
+ DEBUG(errs() << "COULDN'T INSERT PHI TRANSLATED VALUE OF: "
+ << *LI->getOperand(0) << "\n");
return false;
}
-
- // We don't currently handle critical edges :(
- if (UnavailablePred->getTerminator()->getNumSuccessors() != 1) {
- DEBUG(errs() << "COULD NOT PRE LOAD BECAUSE OF CRITICAL EDGE '"
- << UnavailablePred->getName() << "': " << *LI << '\n');
- return false;
+
+ // FIXME: This inserts a computation, but we don't tell scalar GVN
+ // optimization stuff about it. How do we do this?
+ DEBUG(errs() << "INSERTED PHI TRANSLATED VALUE: " << *LoadPtr << "\n");
}
-
+
// Make sure it is valid to move this load here. We have to watch out for:
// @1 = getelementptr (i8* p, ...
// test p and branch if == 0