summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-11-27 20:25:30 +0000
committerChris Lattner <sabre@nondot.org>2009-11-27 20:25:30 +0000
commit5141421e38a6b4113177ef30cfd52de58ec9dced (patch)
treeb3dc3ddb7c9dffc86bba738dc672a5c3972cc1cd /lib
parent807d2fa1ebf7dd62df3f8cf33f14683205661cc4 (diff)
downloadllvm-5141421e38a6b4113177ef30cfd52de58ec9dced.tar.gz
llvm-5141421e38a6b4113177ef30cfd52de58ec9dced.tar.bz2
llvm-5141421e38a6b4113177ef30cfd52de58ec9dced.tar.xz
recursively phi translate bitcast operands too, for consistency.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90016 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Analysis/MemoryDependenceAnalysis.cpp39
1 files changed, 18 insertions, 21 deletions
diff --git a/lib/Analysis/MemoryDependenceAnalysis.cpp b/lib/Analysis/MemoryDependenceAnalysis.cpp
index e87b4cdaa6..e24d39177b 100644
--- a/lib/Analysis/MemoryDependenceAnalysis.cpp
+++ b/lib/Analysis/MemoryDependenceAnalysis.cpp
@@ -693,21 +693,22 @@ static bool isPHITranslatable(Instruction *Inst) {
// We can handle bitcast of a PHI, but the PHI needs to be in the same block
// as the bitcast.
- if (BitCastInst *BC = dyn_cast<BitCastInst>(Inst))
- // FIXME: Allow any phi translatable operand.
- if (PHINode *PN = dyn_cast<PHINode>(BC->getOperand(0)))
- if (PN->getParent() == BC->getParent())
- return true;
+ if (BitCastInst *BC = dyn_cast<BitCastInst>(Inst)) {
+ Instruction *OpI = dyn_cast<Instruction>(BC->getOperand(0));
+ if (OpI == 0 || OpI->getParent() != Inst->getParent())
+ return true;
+ return isPHITranslatable(OpI);
+ }
// We can translate a GEP if all of its operands defined in this block are phi
// translatable.
if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(Inst)) {
for (unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i) {
- Instruction *GEPOpI = dyn_cast<Instruction>(GEP->getOperand(i));
- if (GEPOpI == 0 || GEPOpI->getParent() != Inst->getParent())
+ Instruction *OpI = dyn_cast<Instruction>(GEP->getOperand(i));
+ if (OpI == 0 || OpI->getParent() != Inst->getParent())
continue;
- if (!isPHITranslatable(GEPOpI))
+ if (!isPHITranslatable(OpI))
return false;
}
return true;
@@ -715,10 +716,10 @@ static bool isPHITranslatable(Instruction *Inst) {
if (Inst->getOpcode() == Instruction::Add &&
isa<ConstantInt>(Inst->getOperand(1))) {
- Instruction *GEPOpI = dyn_cast<Instruction>(Inst->getOperand(0));
- if (GEPOpI == 0 || GEPOpI->getParent() != Inst->getParent())
+ Instruction *OpI = dyn_cast<Instruction>(Inst->getOperand(0));
+ if (OpI == 0 || OpI->getParent() != Inst->getParent())
return true;
- return isPHITranslatable(GEPOpI);
+ return isPHITranslatable(OpI);
}
// cerr << "MEMDEP: Could not PHI translate: " << *Pointer;
@@ -745,9 +746,9 @@ PHITranslatePointer(Value *InVal, BasicBlock *CurBB, BasicBlock *Pred,
// Handle bitcast of PHI.
if (BitCastInst *BC = dyn_cast<BitCastInst>(Inst)) {
- // FIXME: Recurse!
- PHINode *BCPN = cast<PHINode>(BC->getOperand(0));
- Value *PHIIn = BCPN->getIncomingValueForBlock(Pred);
+ // PHI translate the input operand.
+ Value *PHIIn = PHITranslatePointer(BC->getOperand(0), CurBB, Pred, TD);
+ if (PHIIn == 0) return 0;
// Constants are trivial to phi translate.
if (Constant *C = dyn_cast<Constant>(PHIIn))
@@ -779,14 +780,10 @@ PHITranslatePointer(Value *InVal, BasicBlock *CurBB, BasicBlock *Pred,
}
// If the operand is a phi node, do phi translation.
- if (Value *InOp = PHITranslatePointer(GEPOp, CurBB, Pred, TD)) {
- GEPOps.push_back(InOp);
- continue;
- }
+ Value *InOp = PHITranslatePointer(GEPOp, CurBB, Pred, TD);
+ if (InOp == 0) return 0;
- // Otherwise, we can't PHI translate this random value defined in this
- // block.
- return 0;
+ GEPOps.push_back(InOp);
}
// Simplify the GEP to handle 'gep x, 0' -> x etc.