//===- llvm/CodeGen/GlobalISel/CSEInfo.h ------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// \file /// Provides analysis for continuously CSEing during GISel passes. /// //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_GLOBALISEL_CSEINFO_H #define LLVM_CODEGEN_GLOBALISEL_CSEINFO_H #include "llvm/ADT/FoldingSet.h" #include "llvm/CodeGen/CSEConfigBase.h" #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h" #include "llvm/CodeGen/GlobalISel/GISelWorkList.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/CodeGen.h" namespace llvm { class MachineBasicBlock; /// A class that wraps MachineInstrs and derives from FoldingSetNode in order to /// be uniqued in a CSEMap. The tradeoff here is extra memory allocations for /// UniqueMachineInstr vs making MachineInstr bigger. class UniqueMachineInstr : public FoldingSetNode { … }; // A CSE config for fully optimized builds. class CSEConfigFull : public CSEConfigBase { … }; // Commonly used for O0 config. class CSEConfigConstantOnly : public CSEConfigBase { … }; // Returns the standard expected CSEConfig for the given optimization level. // We have this logic here so targets can make use of it from their derived // TargetPassConfig, but can't put this logic into TargetPassConfig directly // because the CodeGen library can't depend on GlobalISel. std::unique_ptr<CSEConfigBase> getStandardCSEConfigForOpt(CodeGenOptLevel Level); /// The CSE Analysis object. /// This installs itself as a delegate to the MachineFunction to track /// new instructions as well as deletions. It however will not be able to /// track instruction mutations. In such cases, recordNewInstruction should be /// called (for eg inside MachineIRBuilder::recordInsertion). /// Also because of how just the instruction can be inserted without adding any /// operands to the instruction, instructions are uniqued and inserted lazily. /// CSEInfo should assert when trying to enter an incomplete instruction into /// the CSEMap. There is Opcode level granularity on which instructions can be /// CSE'd and for now, only Generic instructions are CSEable. class GISelCSEInfo : public GISelChangeObserver { … }; class TargetRegisterClass; class RegisterBank; // Simple builder class to easily profile properties about MIs. class GISelInstProfileBuilder { … }; /// Simple wrapper that does the following. /// 1) Lazily evaluate the MachineFunction to compute CSEable instructions. /// 2) Allows configuration of which instructions are CSEd through CSEConfig /// object. Provides a method called get which takes a CSEConfig object. class GISelCSEAnalysisWrapper { … }; /// The actual analysis pass wrapper. class GISelCSEAnalysisWrapperPass : public MachineFunctionPass { … }; } // namespace llvm #endif