1 //== ----- llvm/CodeGen/GlobalISel/Combiner.h -------------------*- C++ -*-== // 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 /// \file 9 /// This contains the base class for all Combiners generated by TableGen. 10 /// Backends need to create class that inherits from "Combiner" and put all of 11 /// the TableGen-erated code in there, as it implements the virtual functions. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CODEGEN_GLOBALISEL_COMBINER_H 16 #define LLVM_CODEGEN_GLOBALISEL_COMBINER_H 17 18 #include "llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h" 19 #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h" 20 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" 21 22 namespace llvm { 23 class MachineRegisterInfo; 24 struct CombinerInfo; 25 class GISelCSEInfo; 26 class TargetPassConfig; 27 class MachineFunction; 28 class MachineIRBuilder; 29 30 /// Combiner implementation. This is per-function, so passes need to recreate 31 /// one of these each time they enter a new function. 32 /// 33 /// TODO: Is it worth making this module-wide? 34 class Combiner : public GIMatchTableExecutor { 35 private: 36 class WorkListMaintainer; 37 GISelWorkList<512> WorkList; 38 39 // We have a little hack here where keep the owned pointers private, and only 40 // expose a reference. This has two purposes: 41 // - Avoid derived classes messing with those pointers. 42 // - Keep the API consistent. CInfo, MF, MRI, etc. are all accessed as 43 // references. Accessing Observer/B as pointers unnecessarily leaks 44 // implementation details into derived classes. 45 std::unique_ptr<MachineIRBuilder> Builder; 46 std::unique_ptr<WorkListMaintainer> WLObserver; 47 std::unique_ptr<GISelObserverWrapper> ObserverWrapper; 48 49 bool HasSetupMF = false; 50 51 public: 52 /// If CSEInfo is not null, then the Combiner will use CSEInfo as the observer 53 /// and also create a CSEMIRBuilder. Pass nullptr if CSE is not needed. 54 Combiner(MachineFunction &MF, CombinerInfo &CInfo, 55 const TargetPassConfig *TPC, GISelKnownBits *KB, 56 GISelCSEInfo *CSEInfo = nullptr); 57 virtual ~Combiner(); 58 59 virtual bool tryCombineAll(MachineInstr &I) const = 0; 60 61 bool combineMachineInstrs(); 62 63 protected: 64 CombinerInfo &CInfo; 65 GISelChangeObserver &Observer; 66 MachineIRBuilder &B; 67 MachineFunction &MF; 68 MachineRegisterInfo &MRI; 69 GISelKnownBits *KB; 70 71 const TargetPassConfig *TPC; 72 GISelCSEInfo *CSEInfo; 73 }; 74 75 } // End namespace llvm. 76 77 #endif // LLVM_CODEGEN_GLOBALISEL_COMBINER_H 78