mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 22:24:07 +00:00
Factor out LiveIntervalAnalysis' code to determine whether an instruction
is trivially rematerializable and integrate it into TargetInstrInfo::isTriviallyReMaterializable. This way, all places that need to know whether an instruction is rematerializable will get the same answer. This enables the useful parts of the aggressive-remat option by default -- using AliasAnalysis to determine whether a memory location is invariant, and removes the questionable parts -- rematting operations with virtual register inputs that may not be live everywhere. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83687 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -933,7 +933,8 @@ void MachineInstr::copyPredicates(const MachineInstr *MI) {
|
||||
/// SawStore is set to true, it means that there is a store (or call) between
|
||||
/// the instruction's location and its intended destination.
|
||||
bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII,
|
||||
bool &SawStore) const {
|
||||
bool &SawStore,
|
||||
AliasAnalysis *AA) const {
|
||||
// Ignore stuff that we obviously can't move.
|
||||
if (TID->mayStore() || TID->isCall()) {
|
||||
SawStore = true;
|
||||
@ -947,7 +948,7 @@ bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII,
|
||||
// destination. The check for isInvariantLoad gives the targe the chance to
|
||||
// classify the load as always returning a constant, e.g. a constant pool
|
||||
// load.
|
||||
if (TID->mayLoad() && !isInvariantLoad())
|
||||
if (TID->mayLoad() && !isInvariantLoad(AA))
|
||||
// Otherwise, this is a real load. If there is a store between the load and
|
||||
// end of block, or if the load is volatile, we can't move it.
|
||||
return !SawStore && !hasVolatileMemoryRef();
|
||||
@ -958,10 +959,11 @@ bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII,
|
||||
/// isSafeToReMat - Return true if it's safe to rematerialize the specified
|
||||
/// instruction which defined the specified register instead of copying it.
|
||||
bool MachineInstr::isSafeToReMat(const TargetInstrInfo *TII,
|
||||
unsigned DstReg) const {
|
||||
unsigned DstReg,
|
||||
AliasAnalysis *AA) const {
|
||||
bool SawStore = false;
|
||||
if (!TII->isTriviallyReMaterializable(this) ||
|
||||
!isSafeToMove(TII, SawStore))
|
||||
if (!TII->isTriviallyReMaterializable(this, AA) ||
|
||||
!isSafeToMove(TII, SawStore, AA))
|
||||
return false;
|
||||
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
|
||||
const MachineOperand &MO = getOperand(i);
|
||||
|
Reference in New Issue
Block a user