diff options
| author | Nate Begeman <natebegeman@mac.com> | 2005-08-04 23:24:19 +0000 |
|---|---|---|
| committer | Nate Begeman <natebegeman@mac.com> | 2005-08-04 23:24:19 +0000 |
| commit | b392321cae84aa9ac37966ce0d3f73a34bee8b11 (patch) | |
| tree | 1dd95fa0d70c36c83a8b37e5f5dc4c77d15b8c56 /llvm/lib/VMCore/Instructions.cpp | |
| parent | a75342d89f59426934ed634a15c6585197ff55cc (diff) | |
| download | bcm5719-llvm-b392321cae84aa9ac37966ce0d3f73a34bee8b11.tar.gz bcm5719-llvm-b392321cae84aa9ac37966ce0d3f73a34bee8b11.zip | |
Fix a fixme in CondPropagate.cpp by moving a PhiNode optimization into
BasicBlock's removePredecessor routine. This requires shuffling around
the definition and implementation of hasContantValue from Utils.h,cpp into
Instructions.h,cpp
llvm-svn: 22664
Diffstat (limited to 'llvm/lib/VMCore/Instructions.cpp')
| -rw-r--r-- | llvm/lib/VMCore/Instructions.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/lib/VMCore/Instructions.cpp b/llvm/lib/VMCore/Instructions.cpp index 68b685e7fcb..e454d6b3a0d 100644 --- a/llvm/lib/VMCore/Instructions.cpp +++ b/llvm/lib/VMCore/Instructions.cpp @@ -132,6 +132,36 @@ void PHINode::resizeOperands(unsigned NumOps) { OperandList = NewOps; } +/// hasConstantValue - If the specified PHI node always merges together the same +/// value, return the value, otherwise return null. +/// +Value *PHINode::hasConstantValue() { + // If the PHI node only has one incoming value, eliminate the PHI node... + if (getNumIncomingValues() == 1) + return getIncomingValue(0); + + // Otherwise if all of the incoming values are the same for the PHI, replace + // the PHI node with the incoming value. + // + Value *InVal = 0; + for (unsigned i = 0, e = getNumIncomingValues(); i != e; ++i) + if (getIncomingValue(i) != this && // Not the PHI node itself... + !isa<UndefValue>(getIncomingValue(i))) + if (InVal && getIncomingValue(i) != InVal) + return 0; // Not the same, bail out. + else + InVal = getIncomingValue(i); + + // The only case that could cause InVal to be null is if we have a PHI node + // that only has entries for itself. In this case, there is no entry into the + // loop, so kill the PHI. + // + if (InVal == 0) InVal = UndefValue::get(getType()); + + // All of the incoming values are the same, return the value now. + return InVal; +} + //===----------------------------------------------------------------------===// // CallInst Implementation |

