From fb8a718fc3793dd0ffd671237f88bbd873f84b0e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 27 Nov 2009 05:19:56 +0000 Subject: [PATCH] try again. llvm-svn: 89990 --- llvm/lib/Analysis/MemoryDependenceAnalysis.cpp | 13 ++++++------- llvm/test/Transforms/GVN/rle-phi-translate.ll | 12 ++++++------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp index e5c3126812f3..1025fd5697d8 100644 --- a/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp +++ b/llvm/lib/Analysis/MemoryDependenceAnalysis.cpp @@ -700,7 +700,6 @@ static bool isPHITranslatable(Instruction *Inst) { // We can translate a GEP that uses a PHI in the current block for at least // one of its operands. - if (0) if (GetElementPtrInst *GEP = dyn_cast(Inst)) { for (unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i) if (PHINode *PN = dyn_cast(GEP->getOperand(i))) @@ -747,11 +746,11 @@ static Value *PHITranslateForPred(Instruction *Inst, BasicBlock *Pred, if (GetElementPtrInst *GEP = dyn_cast(Inst)) { SmallVector GEPOps; Value *APHIOp = 0; + BasicBlock *CurBB = GEP->getParent(); for (unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i) { - GEPOps.push_back(GEP->getOperand(i)); - if (PHINode *PN = dyn_cast(GEP->getOperand(i))) - if (PN->getParent() == GEP->getParent()) - GEPOps.back() = APHIOp = PN->getIncomingValueForBlock(Pred); + GEPOps.push_back(GEP->getOperand(i)->DoPHITranslation(CurBB, Pred)); + if (!isa(GEPOps.back())) + APHIOp = GEPOps.back(); } // Simplify the GEP to handle 'gep x, 0' -> x etc. @@ -762,9 +761,9 @@ static Value *PHITranslateForPred(Instruction *Inst, BasicBlock *Pred, for (Value::use_iterator UI = APHIOp->use_begin(), E = APHIOp->use_end(); UI != E; ++UI) { if (GetElementPtrInst *GEPI = dyn_cast(*UI)) - if (GEPI->getType() == GEPI->getType() && + if (GEPI->getType() == GEP->getType() && GEPI->getNumOperands() == GEPOps.size() && - GEPI->getParent()->getParent() == Inst->getParent()->getParent()) { + GEPI->getParent()->getParent() == CurBB->getParent()) { bool Mismatch = false; for (unsigned i = 0, e = GEPOps.size(); i != e; ++i) if (GEPI->getOperand(i) != GEPOps[i]) { diff --git a/llvm/test/Transforms/GVN/rle-phi-translate.ll b/llvm/test/Transforms/GVN/rle-phi-translate.ll index 738e7b5fb6f1..912f58064a26 100644 --- a/llvm/test/Transforms/GVN/rle-phi-translate.ll +++ b/llvm/test/Transforms/GVN/rle-phi-translate.ll @@ -80,9 +80,9 @@ bb2: %i = phi i32 [ 7, %bb1 ], [ 17, %bb ] %d1 = getelementptr i32* %d, i32 %i %dv = load i32* %d1 -; HECK: %dv = phi i32 [ 82, %bb1 ], [ 4, %bb ] -; HECK-NOT: load -; HECK: ret i32 %dv +; CHECK: %dv = phi i32 [ 82, %bb1 ], [ 4, %bb ] +; CHECK-NOT: load +; CHECK: ret i32 %dv ret i32 %dv } @@ -106,9 +106,9 @@ bb2: %i = phi i32 [ 7, %bb1 ], [ 0, %bb ] %d1 = getelementptr i32* %d, i32 %i %dv = load i32* %d1 -; HECK: %dv = phi i32 [ 82, %bb1 ], [ 4, %bb ] -; HECK-NOT: load -; HECK: ret i32 %dv +; CHECK: %dv = phi i32 [ 82, %bb1 ], [ 4, %bb ] +; CHECK-NOT: load +; CHECK: ret i32 %dv ret i32 %dv }