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
|
||||
OptimizePHIs.cpp
|
||||
PHIElimination.cpp
|
||||
PHIEliminationUtils.cpp
|
||||
Passes.cpp
|
||||
PeepholeOptimizer.cpp
|
||||
PostRAHazardRecognizer.cpp
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
#define DEBUG_TYPE "phielim"
|
||||
#include "PHIElimination.h"
|
||||
#include "PHIEliminationUtils.h"
|
||||
#include "llvm/CodeGen/LiveVariables.h"
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/CodeGen/MachineDominators.h"
|
||||
@ -121,51 +122,7 @@ static bool isSourceDefinedByImplicitDef(const MachineInstr *MPhi,
|
||||
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,
|
||||
/// 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
|
||||
// in the block (or end()).
|
||||
MachineBasicBlock::iterator InsertPos =
|
||||
FindCopyInsertPoint(opBlock, MBB, SrcReg);
|
||||
findPHICopyInsertPoint(&opBlock, &MBB, SrcReg);
|
||||
|
||||
// Insert the copy.
|
||||
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