1 //===--- RDFDeadCode.h ----------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // RDF-based generic dead code elimination. 10 // 11 // The main interface of this class are functions "collect" and "erase". 12 // This allows custom processing of the function being optimized by a 13 // particular consumer. The simplest way to use this class would be to 14 // instantiate an object, and then simply call "collect" and "erase", 15 // passing the result of "getDeadInstrs()" to it. 16 // A more complex scenario would be to call "collect" first, then visit 17 // all post-increment instructions to see if the address update is dead 18 // or not, and if it is, convert the instruction to a non-updating form. 19 // After that "erase" can be called with the set of nodes including both, 20 // dead defs from the updating instructions and the nodes corresponding 21 // to the dead instructions. 22 23 #ifndef RDF_DEADCODE_H 24 #define RDF_DEADCODE_H 25 26 #include "llvm/CodeGen/RDFGraph.h" 27 #include "llvm/CodeGen/RDFLiveness.h" 28 #include "llvm/ADT/SetVector.h" 29 30 namespace llvm { 31 class MachineRegisterInfo; 32 33 namespace rdf { 34 struct DeadCodeElimination { DeadCodeEliminationDeadCodeElimination35 DeadCodeElimination(DataFlowGraph &dfg, MachineRegisterInfo &mri) 36 : Trace(false), DFG(dfg), MRI(mri), LV(mri, dfg) {} 37 38 bool collect(); 39 bool erase(const SetVector<NodeId> &Nodes); traceDeadCodeElimination40 void trace(bool On) { Trace = On; } traceDeadCodeElimination41 bool trace() const { return Trace; } 42 getDeadNodesDeadCodeElimination43 SetVector<NodeId> getDeadNodes() { return DeadNodes; } getDeadInstrsDeadCodeElimination44 SetVector<NodeId> getDeadInstrs() { return DeadInstrs; } getDFGDeadCodeElimination45 DataFlowGraph &getDFG() { return DFG; } 46 47 private: 48 bool Trace; 49 SetVector<NodeId> LiveNodes; 50 SetVector<NodeId> DeadNodes; 51 SetVector<NodeId> DeadInstrs; 52 DataFlowGraph &DFG; 53 MachineRegisterInfo &MRI; 54 Liveness LV; 55 56 template<typename T> struct SetQueue; 57 58 bool isLiveInstr(NodeAddr<StmtNode*> S) const; 59 void scanInstr(NodeAddr<InstrNode*> IA, SetQueue<NodeId> &WorkQ); 60 void processDef(NodeAddr<DefNode*> DA, SetQueue<NodeId> &WorkQ); 61 void processUse(NodeAddr<UseNode*> UA, SetQueue<NodeId> &WorkQ); 62 }; 63 } // namespace rdf 64 } // namespace llvm 65 66 #endif 67