instructions defined in CurBB may be intermediate nodes of the computation.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90908 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-12-09 00:10:55 +00:00
parent 7dedbf4ce3
commit af50315a29
2 changed files with 17 additions and 17 deletions

View File

@ -83,9 +83,9 @@ public:
void dump() const;
/// Verify - Check internal consistency of this data structure. Though it
/// claims to return a bool, it actually aborts on error and always returns
/// true.
/// Verify - Check internal consistency of this data structure. If the
/// structure is valid, it returns true. If invalid, it prints errors and
/// returns false.
bool Verify() const;
private:
Value *PHITranslateSubExpr(Value *V, BasicBlock *CurBB, BasicBlock *PredBB);

View File

@ -154,12 +154,20 @@ Value *PHITransAddr::PHITranslateSubExpr(Value *V, BasicBlock *CurBB,
Instruction *Inst = dyn_cast<Instruction>(V);
if (Inst == 0) return V;
// If 'Inst' is defined in this block, it must be an input that needs to be
// phi translated or an intermediate expression that needs to be incorporated
// into the expression.
if (Inst->getParent() == CurBB) {
assert(std::count(InstInputs.begin(), InstInputs.end(), Inst) &&
"Not an input?");
// Determine whether 'Inst' is an input to our PHI translatable expression.
bool isInput = std::count(InstInputs.begin(), InstInputs.end(), Inst);
// Handle inputs instructions if needed.
if (isInput) {
if (Inst->getParent() != CurBB) {
// If it is an input defined in a different block, then it remains an
// input.
return Inst;
}
// If 'Inst' is defined in this block, it must be an input that needs to be
// phi translated or an intermediate expression that needs to be incorporated
// into the expression.
// If this is a PHI, go ahead and translate it.
if (PHINode *PN = dyn_cast<PHINode>(Inst))
@ -179,14 +187,6 @@ Value *PHITransAddr::PHITranslateSubExpr(Value *V, BasicBlock *CurBB,
for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
if (Instruction *Op = dyn_cast<Instruction>(Inst->getOperand(i)))
InstInputs.push_back(Op);
} else {
// Determine whether 'Inst' is an input to our PHI translatable expression.
bool isInput = std::count(InstInputs.begin(), InstInputs.end(), Inst);
// If it is an input defined in a different block, then it remains an input.
if (isInput)
return Inst;
}
// Ok, it must be an intermediate result (either because it started that way