mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 02:33:33 +00:00
Move the FindCopyInsertPoint method of PHIElimination to a new standalone
function so that it can be shared with StrongPHIElimination. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120951 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ea388f217b
commit
a474685d06
@ -50,6 +50,7 @@ add_llvm_library(LLVMCodeGen
|
|||||||
OcamlGC.cpp
|
OcamlGC.cpp
|
||||||
OptimizePHIs.cpp
|
OptimizePHIs.cpp
|
||||||
PHIElimination.cpp
|
PHIElimination.cpp
|
||||||
|
PHIEliminationUtils.cpp
|
||||||
Passes.cpp
|
Passes.cpp
|
||||||
PeepholeOptimizer.cpp
|
PeepholeOptimizer.cpp
|
||||||
PostRAHazardRecognizer.cpp
|
PostRAHazardRecognizer.cpp
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#define DEBUG_TYPE "phielim"
|
#define DEBUG_TYPE "phielim"
|
||||||
#include "PHIElimination.h"
|
#include "PHIElimination.h"
|
||||||
|
#include "PHIEliminationUtils.h"
|
||||||
#include "llvm/CodeGen/LiveVariables.h"
|
#include "llvm/CodeGen/LiveVariables.h"
|
||||||
#include "llvm/CodeGen/Passes.h"
|
#include "llvm/CodeGen/Passes.h"
|
||||||
#include "llvm/CodeGen/MachineDominators.h"
|
#include "llvm/CodeGen/MachineDominators.h"
|
||||||
@ -121,51 +122,7 @@ static bool isSourceDefinedByImplicitDef(const MachineInstr *MPhi,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FindCopyInsertPoint - Find a safe place in MBB to insert a copy from SrcReg
|
|
||||||
// when following the CFG edge to SuccMBB. This needs to be after any def of
|
|
||||||
// SrcReg, but before any subsequent point where control flow might jump out of
|
|
||||||
// the basic block.
|
|
||||||
MachineBasicBlock::iterator
|
|
||||||
llvm::PHIElimination::FindCopyInsertPoint(MachineBasicBlock &MBB,
|
|
||||||
MachineBasicBlock &SuccMBB,
|
|
||||||
unsigned SrcReg) {
|
|
||||||
// Handle the trivial case trivially.
|
|
||||||
if (MBB.empty())
|
|
||||||
return MBB.begin();
|
|
||||||
|
|
||||||
// Usually, we just want to insert the copy before the first terminator
|
|
||||||
// instruction. However, for the edge going to a landing pad, we must insert
|
|
||||||
// the copy before the call/invoke instruction.
|
|
||||||
if (!SuccMBB.isLandingPad())
|
|
||||||
return MBB.getFirstTerminator();
|
|
||||||
|
|
||||||
// Discover any defs/uses in this basic block.
|
|
||||||
SmallPtrSet<MachineInstr*, 8> DefUsesInMBB;
|
|
||||||
for (MachineRegisterInfo::reg_iterator RI = MRI->reg_begin(SrcReg),
|
|
||||||
RE = MRI->reg_end(); RI != RE; ++RI) {
|
|
||||||
MachineInstr *DefUseMI = &*RI;
|
|
||||||
if (DefUseMI->getParent() == &MBB)
|
|
||||||
DefUsesInMBB.insert(DefUseMI);
|
|
||||||
}
|
|
||||||
|
|
||||||
MachineBasicBlock::iterator InsertPoint;
|
|
||||||
if (DefUsesInMBB.empty()) {
|
|
||||||
// No defs. Insert the copy at the start of the basic block.
|
|
||||||
InsertPoint = MBB.begin();
|
|
||||||
} else if (DefUsesInMBB.size() == 1) {
|
|
||||||
// Insert the copy immediately after the def/use.
|
|
||||||
InsertPoint = *DefUsesInMBB.begin();
|
|
||||||
++InsertPoint;
|
|
||||||
} else {
|
|
||||||
// Insert the copy immediately after the last def/use.
|
|
||||||
InsertPoint = MBB.end();
|
|
||||||
while (!DefUsesInMBB.count(&*--InsertPoint)) {}
|
|
||||||
++InsertPoint;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure the copy goes after any phi nodes however.
|
|
||||||
return MBB.SkipPHIsAndLabels(InsertPoint);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// LowerAtomicPHINode - Lower the PHI node at the top of the specified block,
|
/// LowerAtomicPHINode - Lower the PHI node at the top of the specified block,
|
||||||
/// under the assuption that it needs to be lowered in a way that supports
|
/// under the assuption that it needs to be lowered in a way that supports
|
||||||
@ -294,7 +251,7 @@ void llvm::PHIElimination::LowerAtomicPHINode(
|
|||||||
// Find a safe location to insert the copy, this may be the first terminator
|
// Find a safe location to insert the copy, this may be the first terminator
|
||||||
// in the block (or end()).
|
// in the block (or end()).
|
||||||
MachineBasicBlock::iterator InsertPos =
|
MachineBasicBlock::iterator InsertPos =
|
||||||
FindCopyInsertPoint(opBlock, MBB, SrcReg);
|
findPHICopyInsertPoint(&opBlock, &MBB, SrcReg);
|
||||||
|
|
||||||
// Insert the copy.
|
// Insert the copy.
|
||||||
if (!reusedIncoming && IncomingReg)
|
if (!reusedIncoming && IncomingReg)
|
||||||
|
61
lib/CodeGen/PHIEliminationUtils.cpp
Normal file
61
lib/CodeGen/PHIEliminationUtils.cpp
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
//===-- PHIEliminationUtils.cpp - Helper functions for PHI elimination ----===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "PHIEliminationUtils.h"
|
||||||
|
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||||
|
#include "llvm/CodeGen/MachineFunction.h"
|
||||||
|
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||||
|
#include "llvm/ADT/SmallPtrSet.h"
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
// findCopyInsertPoint - Find a safe place in MBB to insert a copy from SrcReg
|
||||||
|
// when following the CFG edge to SuccMBB. This needs to be after any def of
|
||||||
|
// SrcReg, but before any subsequent point where control flow might jump out of
|
||||||
|
// the basic block.
|
||||||
|
MachineBasicBlock::iterator
|
||||||
|
llvm::findPHICopyInsertPoint(MachineBasicBlock* MBB, MachineBasicBlock* SuccMBB,
|
||||||
|
unsigned SrcReg) {
|
||||||
|
// Handle the trivial case trivially.
|
||||||
|
if (MBB->empty())
|
||||||
|
return MBB->begin();
|
||||||
|
|
||||||
|
// Usually, we just want to insert the copy before the first terminator
|
||||||
|
// instruction. However, for the edge going to a landing pad, we must insert
|
||||||
|
// the copy before the call/invoke instruction.
|
||||||
|
if (!SuccMBB->isLandingPad())
|
||||||
|
return MBB->getFirstTerminator();
|
||||||
|
|
||||||
|
// Discover any defs/uses in this basic block.
|
||||||
|
SmallPtrSet<MachineInstr*, 8> DefUsesInMBB;
|
||||||
|
MachineRegisterInfo& MRI = MBB->getParent()->getRegInfo();
|
||||||
|
for (MachineRegisterInfo::reg_iterator RI = MRI.reg_begin(SrcReg),
|
||||||
|
RE = MRI.reg_end(); RI != RE; ++RI) {
|
||||||
|
MachineInstr* DefUseMI = &*RI;
|
||||||
|
if (DefUseMI->getParent() == MBB)
|
||||||
|
DefUsesInMBB.insert(DefUseMI);
|
||||||
|
}
|
||||||
|
|
||||||
|
MachineBasicBlock::iterator InsertPoint;
|
||||||
|
if (DefUsesInMBB.empty()) {
|
||||||
|
// No defs. Insert the copy at the start of the basic block.
|
||||||
|
InsertPoint = MBB->begin();
|
||||||
|
} else if (DefUsesInMBB.size() == 1) {
|
||||||
|
// Insert the copy immediately after the def/use.
|
||||||
|
InsertPoint = *DefUsesInMBB.begin();
|
||||||
|
++InsertPoint;
|
||||||
|
} else {
|
||||||
|
// Insert the copy immediately after the last def/use.
|
||||||
|
InsertPoint = MBB->end();
|
||||||
|
while (!DefUsesInMBB.count(&*--InsertPoint)) {}
|
||||||
|
++InsertPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the copy goes after any phi nodes however.
|
||||||
|
return MBB->SkipPHIsAndLabels(InsertPoint);
|
||||||
|
}
|
25
lib/CodeGen/PHIEliminationUtils.h
Normal file
25
lib/CodeGen/PHIEliminationUtils.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
//=- PHIEliminationUtils.h - Helper functions for PHI elimination *- C++ -*--=//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_CODEGEN_PHIELIMINATIONUTILS_H
|
||||||
|
#define LLVM_CODEGEN_PHIELIMINATIONUTILS_H
|
||||||
|
|
||||||
|
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
/// findPHICopyInsertPoint - Find a safe place in MBB to insert a copy from
|
||||||
|
/// SrcReg when following the CFG edge to SuccMBB. This needs to be after
|
||||||
|
/// any def of SrcReg, but before any subsequent point where control flow
|
||||||
|
/// might jump out of the basic block.
|
||||||
|
MachineBasicBlock::iterator
|
||||||
|
findPHICopyInsertPoint(MachineBasicBlock* MBB, MachineBasicBlock* SuccMBB,
|
||||||
|
unsigned SrcReg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user