mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-07 11:33:44 +00:00
make FoldTwoEntryPHINode use instsimplify a bit, make
GetIfCondition faster by avoiding pred_iterator. No really interesting change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121754 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2112bbc42d
commit
73c50a68a7
@ -105,20 +105,21 @@ static void AddPredecessorToBlock(BasicBlock *Succ, BasicBlock *NewPred,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// GetIfCondition - Given a basic block (BB) with two predecessors (and
|
/// GetIfCondition - Given a basic block (BB) with two predecessors (and at
|
||||||
/// presumably PHI nodes in it), check to see if the merge at this block is due
|
/// least one PHI node in it), check to see if the merge at this block is due
|
||||||
/// to an "if condition". If so, return the boolean condition that determines
|
/// to an "if condition". If so, return the boolean condition that determines
|
||||||
/// which entry into BB will be taken. Also, return by references the block
|
/// which entry into BB will be taken. Also, return by references the block
|
||||||
/// that will be entered from if the condition is true, and the block that will
|
/// that will be entered from if the condition is true, and the block that will
|
||||||
/// be entered if the condition is false.
|
/// be entered if the condition is false.
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
static Value *GetIfCondition(BasicBlock *BB,
|
static Value *GetIfCondition(BasicBlock *BB, BasicBlock *&IfTrue,
|
||||||
BasicBlock *&IfTrue, BasicBlock *&IfFalse) {
|
BasicBlock *&IfFalse) {
|
||||||
assert(std::distance(pred_begin(BB), pred_end(BB)) == 2 &&
|
PHINode *SomePHI = cast<PHINode>(BB->begin());
|
||||||
|
assert(SomePHI->getNumIncomingValues() == 2 &&
|
||||||
"Function can only handle blocks with 2 predecessors!");
|
"Function can only handle blocks with 2 predecessors!");
|
||||||
BasicBlock *Pred1 = *pred_begin(BB);
|
BasicBlock *Pred1 = SomePHI->getIncomingBlock(0);
|
||||||
BasicBlock *Pred2 = *++pred_begin(BB);
|
BasicBlock *Pred2 = SomePHI->getIncomingBlock(1);
|
||||||
|
|
||||||
// We can only handle branches. Other control flow will be lowered to
|
// We can only handle branches. Other control flow will be lowered to
|
||||||
// branches if possible anyway.
|
// branches if possible anyway.
|
||||||
@ -1147,14 +1148,13 @@ static bool FoldCondBranchOnPHI(BranchInst *BI, const TargetData *TD) {
|
|||||||
|
|
||||||
/// FoldTwoEntryPHINode - Given a BB that starts with the specified two-entry
|
/// FoldTwoEntryPHINode - Given a BB that starts with the specified two-entry
|
||||||
/// PHI node, see if we can eliminate it.
|
/// PHI node, see if we can eliminate it.
|
||||||
static bool FoldTwoEntryPHINode(PHINode *PN) {
|
static bool FoldTwoEntryPHINode(PHINode *PN, const TargetData *TD) {
|
||||||
// Ok, this is a two entry PHI node. Check to see if this is a simple "if
|
// Ok, this is a two entry PHI node. Check to see if this is a simple "if
|
||||||
// statement", which has a very simple dominance structure. Basically, we
|
// statement", which has a very simple dominance structure. Basically, we
|
||||||
// are trying to find the condition that is being branched on, which
|
// are trying to find the condition that is being branched on, which
|
||||||
// subsequently causes this merge to happen. We really want control
|
// subsequently causes this merge to happen. We really want control
|
||||||
// dependence information for this check, but simplifycfg can't keep it up
|
// dependence information for this check, but simplifycfg can't keep it up
|
||||||
// to date, and this catches most of the cases we care about anyway.
|
// to date, and this catches most of the cases we care about anyway.
|
||||||
//
|
|
||||||
BasicBlock *BB = PN->getParent();
|
BasicBlock *BB = PN->getParent();
|
||||||
BasicBlock *IfTrue, *IfFalse;
|
BasicBlock *IfTrue, *IfFalse;
|
||||||
Value *IfCond = GetIfCondition(BB, IfTrue, IfFalse);
|
Value *IfCond = GetIfCondition(BB, IfTrue, IfFalse);
|
||||||
@ -1247,10 +1247,19 @@ static bool FoldTwoEntryPHINode(PHINode *PN) {
|
|||||||
Value *TrueVal = PN->getIncomingValue(PN->getIncomingBlock(0) == IfFalse);
|
Value *TrueVal = PN->getIncomingValue(PN->getIncomingBlock(0) == IfFalse);
|
||||||
Value *FalseVal = PN->getIncomingValue(PN->getIncomingBlock(0) == IfTrue);
|
Value *FalseVal = PN->getIncomingValue(PN->getIncomingBlock(0) == IfTrue);
|
||||||
|
|
||||||
Value *NV = SelectInst::Create(IfCond, TrueVal, FalseVal, "", AfterPHIIt);
|
Value *NV;
|
||||||
|
if (Value *V = SimplifySelectInst(IfCond, TrueVal, FalseVal, TD))
|
||||||
|
NV = V;
|
||||||
|
else if (TrueVal->getType()->isIntegerTy(1) && isa<ConstantInt>(TrueVal) &&
|
||||||
|
cast<ConstantInt>(TrueVal)->isOne()) {
|
||||||
|
if (Value *V = SimplifyOrInst(IfCond, FalseVal, TD))
|
||||||
|
NV = V;
|
||||||
|
else
|
||||||
|
NV = BinaryOperator::CreateOr(IfCond, FalseVal, "", AfterPHIIt);
|
||||||
|
} else
|
||||||
|
NV = SelectInst::Create(IfCond, TrueVal, FalseVal, "", AfterPHIIt);
|
||||||
PN->replaceAllUsesWith(NV);
|
PN->replaceAllUsesWith(NV);
|
||||||
NV->takeName(PN);
|
NV->takeName(PN);
|
||||||
|
|
||||||
PN->eraseFromParent();
|
PN->eraseFromParent();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -2415,7 +2424,7 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) {
|
|||||||
// eliminate it, do so now.
|
// eliminate it, do so now.
|
||||||
if (PHINode *PN = dyn_cast<PHINode>(BB->begin()))
|
if (PHINode *PN = dyn_cast<PHINode>(BB->begin()))
|
||||||
if (PN->getNumIncomingValues() == 2)
|
if (PN->getNumIncomingValues() == 2)
|
||||||
Changed |= FoldTwoEntryPHINode(PN);
|
Changed |= FoldTwoEntryPHINode(PN, TD);
|
||||||
|
|
||||||
if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator())) {
|
if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator())) {
|
||||||
if (BI->isUnconditional()) {
|
if (BI->isUnconditional()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user