Add new function

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10529 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-12-19 05:56:28 +00:00
parent bb0aca5917
commit abbc2dd779
2 changed files with 51 additions and 10 deletions

View File

@ -20,6 +20,7 @@
namespace llvm { namespace llvm {
class Pass; class Pass;
class PHINode;
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Local constant propagation... // Local constant propagation...
@ -55,6 +56,15 @@ bool isInstructionTriviallyDead(Instruction *I);
/// ///
bool dceInstruction(BasicBlock::iterator &BBI); bool dceInstruction(BasicBlock::iterator &BBI);
//===----------------------------------------------------------------------===//
// PHI Instruction Simplification
//
/// hasConstantValue - If the specified PHI node always merges together the same
/// value, return the value, otherwise return null.
///
Value *hasConstantValue(PHINode *PN);
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Control Flow Graph Restructuring... // Control Flow Graph Restructuring...

View File

@ -15,18 +15,18 @@
#include "llvm/Transforms/Utils/Local.h" #include "llvm/Transforms/Utils/Local.h"
#include "llvm/iTerminators.h" #include "llvm/iTerminators.h"
#include "llvm/iOperators.h" #include "llvm/iOperators.h"
#include "llvm/iPHINode.h"
#include "llvm/ConstantHandling.h" #include "llvm/ConstantHandling.h"
using namespace llvm;
namespace llvm {
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Local constant propagation... // Local constant propagation...
// //
// ConstantFoldInstruction - If an instruction references constants, try to fold /// doConstantPropagation - If an instruction references constants, try to fold
// them together... /// them together...
// ///
bool doConstantPropagation(BasicBlock::iterator &II) { bool llvm::doConstantPropagation(BasicBlock::iterator &II) {
if (Constant *C = ConstantFoldInstruction(II)) { if (Constant *C = ConstantFoldInstruction(II)) {
// Replaces all of the uses of a variable with uses of the constant. // Replaces all of the uses of a variable with uses of the constant.
II->replaceAllUsesWith(C); II->replaceAllUsesWith(C);
@ -43,7 +43,7 @@ bool doConstantPropagation(BasicBlock::iterator &II) {
// constant value, convert it into an unconditional branch to the constant // constant value, convert it into an unconditional branch to the constant
// destination. // destination.
// //
bool ConstantFoldTerminator(BasicBlock *BB) { bool llvm::ConstantFoldTerminator(BasicBlock *BB) {
TerminatorInst *T = BB->getTerminator(); TerminatorInst *T = BB->getTerminator();
// Branch - See if we are conditional jumping on constant // Branch - See if we are conditional jumping on constant
@ -165,7 +165,7 @@ bool ConstantFoldTerminator(BasicBlock *BB) {
// Local dead code elimination... // Local dead code elimination...
// //
bool isInstructionTriviallyDead(Instruction *I) { bool llvm::isInstructionTriviallyDead(Instruction *I) {
return I->use_empty() && !I->mayWriteToMemory() && !isa<TerminatorInst>(I); return I->use_empty() && !I->mayWriteToMemory() && !isa<TerminatorInst>(I);
} }
@ -174,7 +174,7 @@ bool isInstructionTriviallyDead(Instruction *I) {
// to point to the instruction that immediately succeeded the original // to point to the instruction that immediately succeeded the original
// instruction. // instruction.
// //
bool dceInstruction(BasicBlock::iterator &BBI) { bool llvm::dceInstruction(BasicBlock::iterator &BBI) {
// Look for un"used" definitions... // Look for un"used" definitions...
if (isInstructionTriviallyDead(BBI)) { if (isInstructionTriviallyDead(BBI)) {
BBI = BBI->getParent()->getInstList().erase(BBI); // Bye bye BBI = BBI->getParent()->getInstList().erase(BBI); // Bye bye
@ -183,4 +183,35 @@ bool dceInstruction(BasicBlock::iterator &BBI) {
return false; return false;
} }
} // End llvm namespace //===----------------------------------------------------------------------===//
// PHI Instruction Simplification
//
/// hasConstantValue - If the specified PHI node always merges together the same
/// value, return the value, otherwise return null.
///
Value *llvm::hasConstantValue(PHINode *PN) {
// If the PHI node only has one incoming value, eliminate the PHI node...
if (PN->getNumIncomingValues() == 1)
return PN->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 = PN->getNumIncomingValues(); i != e; ++i)
if (PN->getIncomingValue(i) != PN) // Not the PHI node itself...
if (InVal && PN->getIncomingValue(i) != InVal)
return 0; // Not the same, bail out.
else
InVal = PN->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 = Constant::getNullValue(PN->getType());
// All of the incoming values are the same, return the value now.
return InVal;
}