forked from OSchip/llvm-project
move some generally useful functions out of jump threading
into libanalysis and transformutils. llvm-svn: 86735
This commit is contained in:
parent
42855f2043
commit
852d6d64ff
|
@ -59,6 +59,15 @@ namespace llvm {
|
|||
/// instruction. If not, this returns null.
|
||||
Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0);
|
||||
|
||||
|
||||
/// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then
|
||||
/// delete the From instruction. In addition to a basic RAUW, this does a
|
||||
/// recursive simplification of the updated instructions. This catches
|
||||
/// things where one simplification exposes other opportunities. This only
|
||||
/// simplifies and deletes scalar operations, it does not change the CFG.
|
||||
///
|
||||
void ReplaceAndSimplifyAllUses(Instruction *From, Value *To,
|
||||
const TargetData *TD = 0);
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
|
|
|
@ -78,6 +78,21 @@ void RecursivelyDeleteDeadPHINode(PHINode *PN);
|
|||
// Control Flow Graph Restructuring.
|
||||
//
|
||||
|
||||
/// RemovePredecessorAndSimplify - Like BasicBlock::removePredecessor, this
|
||||
/// method is called when we're about to delete Pred as a predecessor of BB. If
|
||||
/// BB contains any PHI nodes, this drops the entries in the PHI nodes for Pred.
|
||||
///
|
||||
/// Unlike the removePredecessor method, this attempts to simplify uses of PHI
|
||||
/// nodes that collapse into identity values. For example, if we have:
|
||||
/// x = phi(1, 0, 0, 0)
|
||||
/// y = and x, z
|
||||
///
|
||||
/// .. and delete the predecessor corresponding to the '1', this will attempt to
|
||||
/// recursively fold the 'and' to 0.
|
||||
void RemovePredecessorAndSimplify(BasicBlock *BB, BasicBlock *Pred,
|
||||
TargetData *TD = 0);
|
||||
|
||||
|
||||
/// MergeBasicBlockIntoOnlyPred - BB is a block with one predecessor and its
|
||||
/// predecessor is known to have one successor (BB!). Eliminate the edge
|
||||
/// between them, moving the instructions in the predecessor into BB. This
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Support/ValueHandle.h"
|
||||
#include "llvm/Instructions.h"
|
||||
#include "llvm/Support/PatternMatch.h"
|
||||
using namespace llvm;
|
||||
|
@ -311,3 +312,37 @@ Value *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) {
|
|||
}
|
||||
}
|
||||
|
||||
/// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then
|
||||
/// delete the From instruction. In addition to a basic RAUW, this does a
|
||||
/// recursive simplification of the newly formed instructions. This catches
|
||||
/// things where one simplification exposes other opportunities. This only
|
||||
/// simplifies and deletes scalar operations, it does not change the CFG.
|
||||
///
|
||||
void llvm::ReplaceAndSimplifyAllUses(Instruction *From, Value *To,
|
||||
const TargetData *TD) {
|
||||
assert(From != To && "ReplaceAndSimplifyAllUses(X,X) is not valid!");
|
||||
|
||||
// FromHandle - This keeps a weakvh on the from value so that we can know if
|
||||
// it gets deleted out from under us in a recursive simplification.
|
||||
WeakVH FromHandle(From);
|
||||
|
||||
while (!From->use_empty()) {
|
||||
// Update the instruction to use the new value.
|
||||
Use &U = From->use_begin().getUse();
|
||||
Instruction *User = cast<Instruction>(U.getUser());
|
||||
U = To;
|
||||
|
||||
// See if we can simplify it.
|
||||
if (Value *V = SimplifyInstruction(User, TD)) {
|
||||
// Recursively simplify this.
|
||||
ReplaceAndSimplifyAllUses(User, V, TD);
|
||||
|
||||
// If the recursive simplification ended up revisiting and deleting 'From'
|
||||
// then we're done.
|
||||
if (FromHandle == 0)
|
||||
return;
|
||||
}
|
||||
}
|
||||
From->eraseFromParent();
|
||||
}
|
||||
|
||||
|
|
|
@ -203,89 +203,6 @@ static unsigned getJumpThreadDuplicationCost(const BasicBlock *BB) {
|
|||
return Size;
|
||||
}
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then
|
||||
/// delete the From instruction. In addition to a basic RAUW, this does a
|
||||
/// recursive simplification of the newly formed instructions. This catches
|
||||
/// things where one simplification exposes other opportunities. This only
|
||||
/// simplifies and deletes scalar operations, it does not change the CFG.
|
||||
///
|
||||
static void ReplaceAndSimplifyAllUses(Instruction *From, Value *To,
|
||||
const TargetData *TD) {
|
||||
assert(From != To && "ReplaceAndSimplifyAllUses(X,X) is not valid!");
|
||||
|
||||
// FromHandle - This keeps a weakvh on the from value so that we can know if
|
||||
// it gets deleted out from under us in a recursive simplification.
|
||||
WeakVH FromHandle(From);
|
||||
|
||||
while (!From->use_empty()) {
|
||||
// Update the instruction to use the new value.
|
||||
Use &U = From->use_begin().getUse();
|
||||
Instruction *User = cast<Instruction>(U.getUser());
|
||||
U = To;
|
||||
|
||||
// See if we can simplify it.
|
||||
if (Value *V = SimplifyInstruction(User, TD)) {
|
||||
// Recursively simplify this.
|
||||
ReplaceAndSimplifyAllUses(User, V, TD);
|
||||
|
||||
// If the recursive simplification ended up revisiting and deleting 'From'
|
||||
// then we're done.
|
||||
if (FromHandle == 0)
|
||||
return;
|
||||
}
|
||||
}
|
||||
From->eraseFromParent();
|
||||
}
|
||||
|
||||
|
||||
/// RemovePredecessorAndSimplify - Like BasicBlock::removePredecessor, this
|
||||
/// method is called when we're about to delete Pred as a predecessor of BB. If
|
||||
/// BB contains any PHI nodes, this drops the entries in the PHI nodes for Pred.
|
||||
///
|
||||
/// Unlike the removePredecessor method, this attempts to simplify uses of PHI
|
||||
/// nodes that collapse into identity values. For example, if we have:
|
||||
/// x = phi(1, 0, 0, 0)
|
||||
/// y = and x, z
|
||||
///
|
||||
/// .. and delete the predecessor corresponding to the '1', this will attempt to
|
||||
/// recursively fold the and to 0.
|
||||
static void RemovePredecessorAndSimplify(BasicBlock *BB, BasicBlock *Pred,
|
||||
TargetData *TD) {
|
||||
// This only adjusts blocks with PHI nodes.
|
||||
if (!isa<PHINode>(BB->begin()))
|
||||
return;
|
||||
|
||||
// Remove the entries for Pred from the PHI nodes in BB, but do not simplify
|
||||
// them down. This will leave us with single entry phi nodes and other phis
|
||||
// that can be removed.
|
||||
BB->removePredecessor(Pred, true);
|
||||
|
||||
WeakVH PhiIt = &BB->front();
|
||||
while (PHINode *PN = dyn_cast<PHINode>(PhiIt)) {
|
||||
PhiIt = &*++BasicBlock::iterator(cast<Instruction>(PhiIt));
|
||||
|
||||
Value *PNV = PN->hasConstantValue();
|
||||
if (PNV == 0) continue;
|
||||
|
||||
// If we're able to simplify the phi to a single value, substitute the new
|
||||
// value into all of its uses.
|
||||
assert(PNV != PN && "hasConstantValue broken");
|
||||
|
||||
ReplaceAndSimplifyAllUses(PN, PNV, TD);
|
||||
|
||||
// If recursive simplification ended up deleting the next PHI node we would
|
||||
// iterate to, then our iterator is invalid, restart scanning from the top
|
||||
// of the block.
|
||||
if (PhiIt == 0) PhiIt = &BB->front();
|
||||
}
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
|
||||
/// FindLoopHeaders - We do not want jump threading to turn proper loop
|
||||
/// structures into irreducible loops. Doing this breaks up the loop nesting
|
||||
/// hierarchy and pessimizes later transformations. To prevent this from
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Analysis/DebugInfo.h"
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/ProfileInfo.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Support/CFG.h"
|
||||
|
@ -239,7 +240,7 @@ bool llvm::ConstantFoldTerminator(BasicBlock *BB) {
|
|||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Local dead code elimination...
|
||||
// Local dead code elimination.
|
||||
//
|
||||
|
||||
/// isInstructionTriviallyDead - Return true if the result produced by the
|
||||
|
@ -326,9 +327,53 @@ llvm::RecursivelyDeleteDeadPHINode(PHINode *PN) {
|
|||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Control Flow Graph Restructuring...
|
||||
// Control Flow Graph Restructuring.
|
||||
//
|
||||
|
||||
|
||||
/// RemovePredecessorAndSimplify - Like BasicBlock::removePredecessor, this
|
||||
/// method is called when we're about to delete Pred as a predecessor of BB. If
|
||||
/// BB contains any PHI nodes, this drops the entries in the PHI nodes for Pred.
|
||||
///
|
||||
/// Unlike the removePredecessor method, this attempts to simplify uses of PHI
|
||||
/// nodes that collapse into identity values. For example, if we have:
|
||||
/// x = phi(1, 0, 0, 0)
|
||||
/// y = and x, z
|
||||
///
|
||||
/// .. and delete the predecessor corresponding to the '1', this will attempt to
|
||||
/// recursively fold the and to 0.
|
||||
void llvm::RemovePredecessorAndSimplify(BasicBlock *BB, BasicBlock *Pred,
|
||||
TargetData *TD) {
|
||||
// This only adjusts blocks with PHI nodes.
|
||||
if (!isa<PHINode>(BB->begin()))
|
||||
return;
|
||||
|
||||
// Remove the entries for Pred from the PHI nodes in BB, but do not simplify
|
||||
// them down. This will leave us with single entry phi nodes and other phis
|
||||
// that can be removed.
|
||||
BB->removePredecessor(Pred, true);
|
||||
|
||||
WeakVH PhiIt = &BB->front();
|
||||
while (PHINode *PN = dyn_cast<PHINode>(PhiIt)) {
|
||||
PhiIt = &*++BasicBlock::iterator(cast<Instruction>(PhiIt));
|
||||
|
||||
Value *PNV = PN->hasConstantValue();
|
||||
if (PNV == 0) continue;
|
||||
|
||||
// If we're able to simplify the phi to a single value, substitute the new
|
||||
// value into all of its uses.
|
||||
assert(PNV != PN && "hasConstantValue broken");
|
||||
|
||||
ReplaceAndSimplifyAllUses(PN, PNV, TD);
|
||||
|
||||
// If recursive simplification ended up deleting the next PHI node we would
|
||||
// iterate to, then our iterator is invalid, restart scanning from the top
|
||||
// of the block.
|
||||
if (PhiIt == 0) PhiIt = &BB->front();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// MergeBasicBlockIntoOnlyPred - DestBB is a block with one predecessor and its
|
||||
/// predecessor is known to have one successor (DestBB!). Eliminate the edge
|
||||
/// between them, moving the instructions in the predecessor into DestBB and
|
||||
|
|
Loading…
Reference in New Issue