51 cl::init(std::numeric_limits<unsigned>::max()));
68 return "Hexagon RDF optimizations";
75 MachineFunctionProperties::Property::NoVRegs);
88 bool interpretAsCopy(
const MachineInstr *
MI, EqualityMap &EM)
override;
103char HexagonRDFOpt::ID = 0;
106 "Hexagon RDF optimizations",
false,
false)
114 EM.insert(std::make_pair(DstR, SrcR));
118 unsigned Opc =
MI->getOpcode();
120 case Hexagon::A2_combinew: {
124 assert(
DstOp.getSubReg() == 0 &&
"Unexpected subregister");
131 case Hexagon::A2_addi: {
133 if (!
A.isImm() ||
A.getImm() != 0)
137 case Hexagon::A2_tfr: {
146 return CopyPropagation::interpretAsCopy(
MI, EM);
149bool HexagonDCE::run() {
150 bool Collected = collect();
167 R2I.insert(std::make_pair(
RA.Id, SA.
Id));
178 bool Changed =
false;
182 dbgs() <<
"Partly dead: " << *SA.
Addr->getCode();
183 Changed |=
rewrite(SA, Remove);
186 return erase(Remove) || Changed;
193 for (
unsigned i = 0, n =
MI->getNumOperands(); i != n; ++i)
194 if (&
MI->getOperand(i) == &
Op)
202 OpMap.
insert(std::make_pair(
RA.Id, getOpNum(
RA.Addr->getOp())));
204 MI->removeOperand(OpNum);
207 unsigned N = OpMap[
RA.Id];
209 RA.Addr->setRegRef(&
MI->getOperand(
N), DFG);
211 RA.Addr->setRegRef(&
MI->getOperand(
N-1), DFG);
216 if (!getDFG().IsCode<NodeAttrs::Stmt>(IA))
223 unsigned Opc =
MI.getOpcode();
224 unsigned OpNum, NewOpc;
226 case Hexagon::L2_loadri_pi:
227 NewOpc = Hexagon::L2_loadri_io;
230 case Hexagon::L2_loadrd_pi:
231 NewOpc = Hexagon::L2_loadrd_io;
234 case Hexagon::V6_vL32b_pi:
235 NewOpc = Hexagon::V6_vL32b_ai;
238 case Hexagon::S2_storeri_pi:
239 NewOpc = Hexagon::S2_storeri_io;
242 case Hexagon::S2_storerd_pi:
243 NewOpc = Hexagon::S2_storerd_io;
246 case Hexagon::V6_vS32b_pi:
247 NewOpc = Hexagon::V6_vS32b_ai;
254 return getDeadNodes().count(
DA.Id);
259 if (&
DA.Addr->getOp() != &Op)
272 dbgs() <<
"Rewriting: " <<
MI;
273 MI.setDesc(HII.get(NewOpc));
274 MI.getOperand(OpNum+2).setImm(0);
275 removeOperand(IA, OpNum);
292 MDT = &getAnalysis<MachineDominatorTree>();
293 const auto &MDF = getAnalysis<MachineDominanceFrontier>();
300 MF.
print(
dbgs() <<
"Before " << getPassName() <<
"\n",
nullptr);
309 dbgs() <<
"Starting copy propagation on: " << MF.
getName() <<
'\n'
316 dbgs() <<
"Starting dead code elimination on: " << MF.
getName() <<
'\n'
318 HexagonDCE DCE(
G, *
MRI);
320 Changed |= DCE.run();
324 dbgs() <<
"Starting liveness recomputation on: " << MF.
getName() <<
'\n';
333 MF.
print(
dbgs() <<
"After " << getPassName() <<
"\n",
nullptr);
339 return new HexagonRDFOpt();
unsigned const MachineRegisterInfo * MRI
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
This file defines the DenseMap class.
static cl::opt< unsigned > RDFLimit("rdf-limit", cl::init(std::numeric_limits< unsigned >::max()))
hexagon rdf Hexagon RDF optimizations
static cl::opt< bool > RDFDump("rdf-dump", cl::init(false))
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
static bool rewrite(Function &F)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
SI optimize exec mask operations pre RA
This file implements a set that has insertion order iteration characteristics.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
FunctionPass class - This class is used to implement most global optimizations.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
virtual MachineFunctionProperties getRequiredProperties() const
Properties which a MachineFunction may have at a given point in time.
MachineFunctionProperties & set(Property P)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
A vector that has set insertion semantics.
size_type count(const key_type &key) const
Count the number of elements of a given key in the SetVector.
bool insert(const value_type &X)
Insert a new element into the SetVector.
StringRef - Represent a constant reference to a string, i.e.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
void initializeHexagonRDFOptPass(PassRegistry &)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionPass * createHexagonRDFOpt()
NodeAddr< FuncNode * > getFunc() const
const TargetInstrInfo & getTII() const
RegisterRef makeRegRef(unsigned Reg, unsigned Sub) const
static bool IsDef(const NodeAddr< NodeBase * > BA)
static bool IsCode(const NodeAddr< NodeBase * > BA)
NodeList getRelatedRefs(NodeAddr< InstrNode * > IA, NodeAddr< RefNode * > RA) const
NodeAddr< T > addr(NodeId N) const